.net 调用最基本的c++;我可以从托管代码中想到的函数

.net 调用最基本的c++;我可以从托管代码中想到的函数,.net,c++,interop,unmanaged,.net,C++,Interop,Unmanaged,我正试图学习如何使用托管/非托管代码互操作,但我遇到了一个难题,4个小时的谷歌搜索都无法克服。我在VisualStudio中创建了两个项目,一个创建win32 exe,另一个创建windows forms.NET应用程序。在一堆脏兮兮的周围,我得到了C代码,正确地调用C++代码,但是从这里开始我每次访问时都会访问Access违规。以下是.cpp文件中的代码: extern "C" __declspec(dllexport) void QuickTest() {

我正试图学习如何使用托管/非托管代码互操作,但我遇到了一个难题,4个小时的谷歌搜索都无法克服。我在VisualStudio中创建了两个项目,一个创建win32 exe,另一个创建windows forms.NET应用程序。在一堆脏兮兮的周围,我得到了C代码,正确地调用C++代码,但是从这里开始我每次访问时都会访问Access违规。以下是.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++代码(我打开了项目的非托管调试),但是它在每次使用Access违规事件的数组创建行上死亡。当我运行可执行文件时,相同的代码运行良好(C++代码在控制台应用程序项目中,我尝试从它的主函数调用它,没有问题),但是每次从.NET调用它时,它都会被炸毁。p> 我在这里肯定遗漏了一些明显的东西,但我在阅读教程时没有找到任何有用的东西,而且大多数关于这个例外的帖子都是关于那些在复杂的封送或gchandle方面有问题的人。提前感谢您的帮助

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

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

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

尝试将函数导入.NET代码,如下所示:

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

有关更多信息,请参阅。

或者您需要告诉编译器必须导出某些符号。在导出dll等符号之前,我做了一些exe。这几乎是一样的,只需更改特定于配置和编译器的dlliport/export说明符。