dllimport将一个c++方法移植到c#.当从C#调用时,程序关闭,没有任何错误消息
dllimport a c++ method to c#. When calling from C#, the programm gets closed without any error message
我想把一个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;
分配内存,这可能会导致堆栈损坏。。。
相关文章:
- C# DLL 从C++应用程序调用 SOAP Web 服务
- 从C++程序调用 git 克隆
- 使用另一个程序调用正在运行的 C++ 程序中的函数
- C++控制台应用程序调用C++/CLI静态库
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- LoadLibray FileNotFound 取决于哪个应用程序调用
- 为什么无法在 Cocoa 应用程序调用的 C++ func 中嵌入自定义 Python 模块
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- C++程序调用 C 函数 在 g++ 链接期间获取未定义的引用
- 使用 gtest 和 gmock 验证程序调用
- 从 Qt 小部件应用程序调用 pyqt widget
- 如何使用Mono / C#程序调用Linux / C ++函数?
- 是否可以通过另一个程序调用程序
- 从应用程序调用静态库时,QT创建者什么都不会发生
- 如何知道库的哪些功能是由程序调用的
- OpenCV 函数在由C++线程程序调用的 Python 脚本本身调用时锁定
- numpy.core.multiarray在通过Xcode中开发的C 应用程序调用Python模块时未能导入
- 如何使用 lamba 作为连接处理程序调用 boost async_connect 作为成员函数
- 如何调试由另一个程序调用的程序
- 从C 程序调用FFMPEG