尝试使用'new char [...]'调用c ++外部函数时AccessViolationException

时间:2011-08-23 09:29:34

标签: c# pinvoke access-violation

当我试图从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 pageMSDN About DLLs页。

0 个答案:

没有答案