当我试图从c#代码调用非托管c ++函数时,我遇到了一个奇怪的问题。
c ++函数如下所示:
extern "C"{
__declspec(dllexport) int Test(char * pixels, int length, int height){
int width = length / height;
// char * test = new char[length];
return width;
}
}
从C#开始,我试图用下一个结构来调用它:
[DllImport("Test.exe", EntryPoint = "Test")]
public static extern int Test(byte[] pixels, int length, int height);
...
var bytes = new byte[] { 1, 1, 1, 1, 1 };
var height = 1;
var result = Test(bytes, bytes.Length, height);
此代码效果很好,但...... 如果我尝试使用'new'取消注释c ++行,我将收到System.AccessViolationException。
有人可以解释那里发生的事情以及为什么吗?
已更新
感谢David Heffernan,现在我的代码看起来像这样:
[DllImport("Test.exe", EntryPoint = "Test",
CallingConvention = CallingConvention.Cdecl)]
public static extern int Test(byte[] pixels, int length, int height);
不幸的是它什么都没改变
分辨
不要使用* .exe作为模块。编译模块作为动态库后,一切运行良好。
这是由DLL和可执行文件链接之间的根本区别引起的。有关详细信息,请参阅MSDN LoadLibrary page和MSDN About DLLs页。