背景:
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应用程序调用此表单工作正常。