如何从C ++ DLL调用我的C#代码?访问冲突

时间:2010-08-24 16:23:20

标签: c# c++ interop access-violation unhandled-exception

背景:

Big C ++ MFC应用程序不会很快被重写。几年前我需要添加功能并决定用C#和.NET构建它更容易,所以我需要一种方法来使用C ++应用程序调用.NET函数。当时我们使用VC6.0作为MFC应用程序,我们使用VS.NET 2003和.NET 1.1构建了.NET功能。在VS.NET 2003中,我们使用MFC应用程序可以使用的导出函数构建了常规的win32 dll(无MFC)。 dll函数引用了我们的.NET程序集,它们都运行良好。现在,我们的MFC应用程序仍然是一个MFC应用程序,但它是使用VS9编译的,它仍然适用于旧的2003编译的DLL。但是,我们现在面临着创建一个新的DLL(新功能)并使用VS9和.NET 3.5构建它。

问题:

我用/ clr选项创建了新的DLL。我在.NET程序集中有一个选项表单,我试图从导出的dll函数中调用它。

我收到一条未处理的异常消息:

  

IP2000.exe中0x04359108处的未处理异常:0xC0000005:访问冲突读取位置0x00000000

它不喜欢的代码看起来像这样:

FooTools::frmConfiguration ^ frmConfig = gcnew FooTools::frmConfiguration();
frmConfig -> ShowDialog();

语法已更改。我们曾经使用*new代替^gcnew,但旧语法无法编译(不确定这是否是一个问题)。

我已经测试过,通过放置一个直接的win32 ::MessageBox来调用导出的函数,然后调用它。我也尝试从导出的​​函数调用一些不同的托管代码,即。 System::Windows::Forms::MessageBox->Show ......,它也运行良好。它只是不想运行此表单。

在我看来,VS 2003和VS9之间的某些东西一定有所改变,这让我有些悲伤,但我似乎无法看到它是什么。 如果从测试Windows.Forms应用程序调用此表单工作正常。

0 个答案:

没有答案