AccessViolationException调用我可以从托管代码中思考的最基本的c ++函数

时间:2009-05-09 22:04:48

标签: .net c++ interop unmanaged

我正在尝试学习如何使用托管/非托管代码互操作,但我已经碰壁了4小时的谷歌搜索无法克服。我在visual studio中组合了2个项目,一个创建了一个win32 exe,另一个创建了一个windows形式的.NET应用程序。经过一堆麻烦后,我得到了C#代码来正确调用c ++代码,但是从这里开始我每次进入时都开始获得AccessViolationException。这是.cpp文件中的代码:

        extern "C" __declspec(dllexport) void QuickTest()
    {
        int iTest = 0;
        int aTestArray[3] = {1,2,3};
        return;
    }

以下是来自C#windows表单app的代码:

        [DllImport("UnmanagedEvaluation2.exe")]
        static extern void QuickTest();

非常简单吧?调用工作正常,我可以进入c ++代码(我打开了项目的非托管调试),但它每次使用AccessViolationException都会在数组创建行上死掉。当我运行可执行文件时,相同的代码运行正常(c ++代码在控制台应用程序项目中,我尝试从_tmain函数调用它并没有问题),但是当从.NET调用它时它每次都会爆炸。

我必须在这里找到一些显而易见的东西,但是我没有从阅读教程中得到任何有用的东西,关于该异常的大多数问题都是人们遇到复杂的编组或GCHandles的问题。提前感谢您的帮助。

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

2 个答案:

答案 0 :(得分:2)

您无法从可执行文件外部调用可执行文件中的函数。您需要将代码编译为DLL。

答案 1 :(得分: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