0

我正在尝试学习如何使用托管/非托管代码互操作,但我遇到了 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 的问题。提前感谢您的帮助。

更新:你就在下面,但这很奇怪。起初,当我开始这个时,我认为我无法做到这一点(调用可执行文件中的函数),但是当我尝试它时——它确实有效,调用就是这样。似乎它允许您将函数调用到可执行文件中,但是一旦您尝试分配任何内存,它就会死掉。无论如何,感谢您的建议,它现在似乎工作正常。

4

2 回答 2

2

您不能从这些可执行文件外部调用可执行文件中的函数。您需要将代码编译成 DLL。

于 2009-05-09T22:06:34.463 回答
0

您已将函数声明为extern "C"这意味着它cdecl用作其调用约定。默认情况下,DllImport用作StdCall调用约定。这可能是您的代码崩溃的原因。

尝试将您的函数导入 .NET 代码

    [DllImport("UnmanagedEvaluation2.exe", CallingConvention=CallingConvention.Cdecl)]
    static extern void QuickTest();

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx

于 2009-05-11T22:59:17.540 回答