0

我想将 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”不是字节数组?

4

2 回答 2

1

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

确保你 LoadLibrary 一个与你的应用程序相同的 dll。

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

于 2012-09-06T11:59:32.793 回答
1

请注意调用约定。

在 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;可能会导致堆栈损坏......

于 2012-09-06T12:50:14.697 回答