如何将浮点数组从c#复制到c dll

如何将浮点数组从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)

我试图将浮点数组从我的C#应用程序复制到C代码DLL中的数组

我习惯用C#编程,但不太习惯用C。不过,我在做相反的过程时没有问题,即从C编码的DLL中读取浮点数组到我的C#应用程序中。我已经在这个网站上读了好几条帖子,但是我想不出哪里出了问题

C#代码

这是功能代码

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”数组中没有任何内容。

有几件事

  • 您正在混合数据类型,它们的长度不同(float是32位,double是64位)。这两种类型在两种语言中都存在,但调用者和被调用者需要在数据类型上达成一致。下面是一组数据类型及其托管/非托管等价物
  • 您发送的参数不是指针。编译器可能会自动将其转换为该值,但有几个选项。编译器完全可能会选择一个您不想要的。您可能正在寻找的是
    [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);