使用CLI将C#double数组传递给C函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用CLI将C#double数组传递给C函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2326字,纯文字阅读大概需要4分钟。
内容图文
![使用CLI将C#double数组传递给C函数](/upload/InfoBanner/zyjiaocheng/824/766732f0ba304a8d8cd25ae9301bb092.jpg)
对,需要听起来很简单,但事实证明这是一个真正的痛苦.
我在C#中有一些GUI代码(注意我之前从未使用过C#但熟悉语法)并且我有使用CLI与之交互的C代码.
在C#中,我想创建一个双精度数组,并将其发送到我的C代码.我使用下面的代码作为传递数组的方法,这是孤立的.
所以从C#im传入double []数组到该函数.
public ref class KernelWrapper
{
public:
static void ImageNoiseFilter(System::IntPtr imageData, int imageWidth, int imageHeight, array<double>^ values);
我应该使用什么参数类型从C端检索此数组?
我试过了:
MyFunction(double values[]){}
MyFunction(double* values){}
MyFunction(array<double>^ values){}
但没有编译,通常使用“数组不是模板”的消息,最后一个,和
Error 1 error C2664: 'RunImageNoiseFilterKernel' : cannot convert parameter 4 from 'cli::array<Type> ^' to 'double *'
关于如何实现这一目标的任何提示将不胜感激.
为了便于阅读,我在这里用代码更新
.cpp文件:
void Bangor::KernelWrapper::ImageNoiseFilter(System::IntPtr imageData, int imageWidth, int imageHeight, pin_ptr<double> pval){
RunImageNoiseFilterKernel((Format24bppRgb*)((int)imageData), imageWidth, imageHeight); //If parameter would work, 4th argument would also be passed into this.
}
C#代码:
double[] randomValues = new double[ARRAY_LENGTH]; //Array of random numbers
KernelWrapper.ImageNoiseFilter(ptr, image.Width, image.Height, randomValues);
错误是:
Error 1 error C3824: 'cli::pin_ptr<Type>': this type cannot appear in this context (function parameter, return type, or a static member)
Error 3 The best overloaded method match for 'Bangor.KernelWrapper.ImageNoiseFilter(System.IntPtr, int, int, double*)' has some invalid arguments
Error 4 Argument 4: cannot convert from 'double[]' to 'double*'
希望这澄清一点.
解决方法:
您应该使用pin_ptr<> class将托管数组转换为double *.它固定数组,因此当您的本机函数执行并访问数组数据时,垃圾收集器无法移动它.
#include <vcclr.h> // Declares cli::pin_ptr<>
using namespace cli;
#pragma managed(push, off)
# include "unmanagedstuff.h" // Declaration of MyFunction here
#pragma managed(pop)
...
pin_ptr<double> pvalues = &values[0];
MyFunction(pvalues, values->Length);
假设MyFunction()肯定也需要知道数组的大小,所以我添加了一个额外的参数来传递数组的大小.不这样做是致命的,您的本机代码可能会破坏托管堆的完整性.请注意,只有pvalues在范围内时,数组才会保持固定状态,因此MyFunction()不存储传递的指针很重要.如果是这种情况,那么你必须复制数组.
内容总结
以上是互联网集市为您收集整理的使用CLI将C#double数组传递给C函数全部内容,希望文章能够帮你解决使用CLI将C#double数组传递给C函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。