如何将浮点数组从c#复制到c dll
我试图将浮点数组从我的C#应用程序复制到C代码DLL中的数组 我习惯用C#编程,但不太习惯用C。不过,我在做相反的过程时没有问题,即从C编码的DLL中读取浮点数组到我的C#应用程序中。我已经在这个网站上读了好几条帖子,但是我想不出哪里出了问题 C#代码 这是功能代码如何将浮点数组从c#复制到c dll,c#,c,arrays,dll,copying,C#,C,Arrays,Dll,Copying,我试图将浮点数组从我的C#应用程序复制到C代码DLL中的数组 我习惯用C#编程,但不太习惯用C。不过,我在做相反的过程时没有问题,即从C编码的DLL中读取浮点数组到我的C#应用程序中。我已经在这个网站上读了好几条帖子,但是我想不出哪里出了问题 C#代码 这是功能代码 float theValues[100]; int CopyArray(float* theArray) { status = 0; int count = 0; while (count < 100)
float theValues[100];
int CopyArray(float* theArray)
{
status = 0;
int count = 0;
while (count < 100)
{
theValues[count] = theArray[count];
++count;
}
return(status);
}
浮点值[100];
int CopyArray(浮点*数组)
{
状态=0;
整数计数=0;
同时(计数<100)
{
值[count]=数组[count];
++计数;
}
返回(状态);
}
我希望我的C#数组最终会出现在C数组“theValues”中,但事实并非如此。“theValues”数组中没有任何内容。有几件事
[In]
。如果您想将数据从C返回到C,您还需要[Out]
:Thoryn,谢谢你。您的解决方案非常有效。我确保C#和C数组数据类型都是double类型,并将[In]添加到C函数定义中。谢谢Thoryn。是的,我将尝试[In],出于某种原因,我假设C中的双精度等于C中的浮点值。不要不必要地添加[Out],必须将数组内容复制回来可能会非常昂贵。C代码不改变元素,因此不需要复制回去。在这种特定情况下,属性根本不重要,double[]是“blittable”类型,pinvoke封送器可以直接传递托管数组。[DllImport]还应指定CallingConvention.Cdecl.Hans是正确的。我添加Out只是为了说明如何同时添加这两个选项。您需要在[DllImport]声明中指定调用约定。这个应该是Cdecl。它没有撞上大街是不吉利的。在执行此操作时,添加一个额外的参数,这样C代码就不必猜测数组大小。
__declspec(dllexport) int CopyArray(float* Wavelengths);
float theValues[100];
int CopyArray(float* theArray)
{
status = 0;
int count = 0;
while (count < 100)
{
theValues[count] = theArray[count];
++count;
}
return(status);
}
[DllImport(@"MyDll")]
static extern int CopyArray([In, Out]double[] MyArray);