我正在尝试学习如何使用托管/非托管代码互操作,但我遇到了 4 小时谷歌搜索无法克服的问题。我在 Visual Studio 中放置了 2 个项目,一个创建了一个 win32 exe,一个创建了一个 windows forms .NET 应用程序。经过一堆乱七八糟的处理后,我得到了正确调用 c++ 代码的 C# 代码,但是从这里我开始每次进入那里时都会收到 AccessViolationException。以下是 .cpp 文件中的代码:
extern "C" __declspec(dllexport) void QuickTest()
{
int iTest = 0;
int aTestArray[3] = {1,2,3};
return;
}
这是来自 C# windows 窗体应用程序的代码调用它:
[DllImport("UnmanagedEvaluation2.exe")]
static extern void QuickTest();
很简单吧?该调用有效,并且我能够进入 c++ 代码(我为该项目打开了非托管调试),但它每次都因 AccessViolationException 而死在数组创建行上。当我运行可执行文件时,相同的代码运行良好(c++ 代码在控制台应用程序项目中,我尝试从 _tmain 函数调用它,没有问题),但是当从 .NET 调用它时,它每次都会爆炸。
必须有一些明显的东西我在这里遗漏了,但是我没有从阅读教程中找到任何有用的东西,而且关于该异常的大多数问题都是人们遇到复杂的编组或 GCHandles 的问题。提前感谢您的帮助。
更新:你就在下面,但这很奇怪。起初,当我开始这个时,我认为我无法做到这一点(调用可执行文件中的函数),但是当我尝试它时——它确实有效,调用就是这样。似乎它允许您将函数调用到可执行文件中,但是一旦您尝试分配任何内存,它就会死掉。无论如何,感谢您的建议,它现在似乎工作正常。