好奇的DllImport问题,当传递LONG参数内存损坏时

时间:2011-10-24 16:40:23

标签: c# c++ .net-3.5 dllimport

我已经创建了一个DLL函数,用于在C#中使用DLLImport但在调用方法时遇到麻烦,因为我遇到了内存损坏问题;

[DllImport("mydll.dll", EntryPoint = "callinmydll")]
public static extern int testdllcall(double *firstinput, long firstcount, double *secondoutput, long secondcount);

这是C ++库头的一部分;

extern "C" {              

mydll_API int callinmydll(double *in, long firstcount, double *out, long secondcount);

}

实现。

mydll_API int callinmydll(double *in, long firstcount, double *out, long secondcount)
{
    for( int i =0 ; i < 10 ; i++ ) 
    {
        *(out + i) = (*(in + i) + 10 );
    }

    return 0;
}

现在,当我的DLLImport函数调用callinmydll函数并将有效数据传递给它时,这就是事情变得有趣的地方。指针包含数据,firstcount也是如此。虽然超出这一点的一切都被破坏了。为什么?奇怪的是,我将我的功能重新排列为双重,双*,长,长现在腐败发生在第三个参数之后。我很好奇发生了什么,因为我传递了有效的数据;两个有效的指针,并且int转换为int64。

帮助!

1 个答案:

答案 0 :(得分:4)

在Win32 C中,long仍然是32位。您的C#签名使用的是long,即64位。您的第二个和第四个参数应该是C#签名中的int

有关详细信息,请参阅此table

所以你的签名是这样的:

[DllImport("mydll.dll", EntryPoint = "callinmydll")]
public static extern int testdllcall(double *firstinput, int firstcount, double *secondoutput, int secondcount);

此外,请确保您的调用约定正确如Ramhound在评论中指出的那样。您的C函数看起来像是使用CDecl约定,而.NET默认为StdCall。您可以在属性中设置调用约定:

[DllImport("mydll.dll", EntryPoint = "callinmydll", CallingConvention = CallingConvention.Cdecl)]