我已经创建了一个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。
帮助!
答案 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)]