dllimport将一个c++方法移植到c#.当从C#调用时,程序关闭,没有任何错误消息

dllimport a c++ method to c#. When calling from C#, the programm gets closed without any error message

本文关键字:程序 调用 错误 消息 任何 当从 一个 c++ 方法 dllimport      更新时间:2023-10-16

我想把一个c++程序编译成dll,并从c#中使用它。

这是c++程序:

MurmurHash3.h MurmurHash3.cpp

我将h和c++文件中的头和方法声明从:更改为

void MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out );

extern "C" __declspec(dllexport) void MurmurHash3_x64_128 
    (const void * key, const int len, const uint32_t seed, void * out )

我对所有三种方法都做了同样的操作。然后我将编译目标设置为dll。编译后,我有一个名为SMHasher.dll的x64位dll。现在我创建了一个新的x64位C#程序,并使用这个dll作为参考。

然后我写了以下内容:

[DllImport("SMHasher.dll")]
public static extern void MurmurHash3_x64_128(byte[] valueToHash, int len, uint seed, out byte[] hash);
private void button1_Click(object sender, EventArgs e)
{
    byte[] hash;
    MurmurHash3_x64_128(new byte[] { 1, 2, 3 }, 3, 0, out hash);
}

当调用MurmurHash3_x64_128时,我的测试应用程序关闭,没有任何错误消息。

问题出在哪里?我该如何解决?

也许问题出在c++参数上?也许"const void*key"不是字节数组?

发生此错误是因为您是导入32位dll的64位应用程序,或是导入64位dll的32位应用程序。

请确保LoadLibrary是一个与您的应用程序具有相同比特度的dll。

在C#中,您可以通过使用Visual Studio中的配置属性来设置应用程序的比特度。

请注意调用约定。

在c/c++中,cdecl是默认值。但在C#的[DllImport]中,它是stdcall。

试着这样定义你的c++函数:

void __stdcall MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out );

最好使用.def文件来确保函数名没有更改。

还有一件事,您没有为byte[] hash;分配内存,这可能会导致堆栈损坏。。。