1

背景:

不会很快被重写的大型 C++ MFC 应用程序。几年前,我需要添加功能并决定使用 C# 和 .NET 构建它会更容易,因此我需要一种使用 C++ 应用程序调用 .NET 函数的方法。当时我们在 MFC 应用程序中使用 VC6.0,我们使用 VS.NET 2003 和 .NET 1.1 构建了 .NET 功能。在 VS.NET 2003 中,我们构建了一个常规的 win32 dll(无 MFC),其中包含 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();

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

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

在我看来,VS 2003 和 VS9 之间一定发生了一些变化,这让我有些悲伤,但我似乎看不出它是什么。如果从测试 Windows.Forms 应用程序调用此表单,则可以正常工作。

4

0 回答 0