使用DLL调用进入函数时程序崩溃

时间:2011-05-04 08:03:57

标签: c# c++ dll

代码:

private void button1_Click(object sender, RoutedEventArgs e)
{
   MessageBox.Show("Enters a button click");
   // Create our OpenGL Hwnd 'control'...
   HwndHost host = new WPFOpenGLLib.OpenGLHwnd();

   // ... and attach it to the placeholder control:
   hwndPlaceholder.Child = host;
}

WPFOpenGLLib.OpenGLHwnd()是C ++ DLL中的一个类。我在C#WPF应用程序中添加了对该DLL的引用。但是,当我单击button1时,应用程序崩溃了。即使是带有»进入按钮单击«的消息框也不会显示。即使我使用

bool a = false;
if (a)
{
   // Create our OpenGL Hwnd 'control'...
   HwndHost host = new WPFOpenGLLib.OpenGLHwnd();

   // ... and attach it to the placeholder control:
   hwndPlaceholder.Child = host;
}

它的崩溃。

顺便说一句,在一台计算机上(我编写应用程序)(Win7 32位)一切正常,在另一台计算机(Win7 64位)上崩溃,在另一台计算机(Win7 32位)上也崩溃。 / p>

有谁知道这里的问题是什么?

3 个答案:

答案 0 :(得分:0)

我暂时没有做任何OpenGL的事情(以前用C ++和win32做过),但Hwnd是一个窗口句柄,就像C ++中的大多数事情只是窗口的内存地址一样, 64位更改默认指针大小我假设您在托管环境中代表C ++使用的库未设置为处理64位系统。

答案 1 :(得分:0)

这听起来很可能是导致问题的一些架构混淆。您是在x64系统上使用x64版本的库还是尝试使用32位的?在后面的例子中,转到项目属性(C#项目)并将目标CPU设置为x64(默认情况下应为Any CPU)。使用默认设置,您的项目将由64位虚拟机执行,因此无法加载32位库。

完成后,确保所有系统都安装了正确的依赖项。例如。我认为如果缺少正确的运行时文件,微软从未改变.net应用程序的简单崩溃行为。如果这也无法解决问题,那么DLL文件的初始化代码中很可能存在一些错误(或其他崩溃原因)。

答案 2 :(得分:0)

我意识到这是一个古老而死的线程,但如果有人看到这个 -

我有一个依赖于DLL(本机/ clr代码)的C#应用​​程序。当我运行没有DLL的应用程序时,它打开正常,一切看起来都很棒,直到你点击一个实际调用DLL函数的按钮。然后程序崩溃,如本问题所述。在我看来OP可能在他的开发机器上有DLL,但在其他神秘计算机上没有它们。因此,程序运行并且似乎有效,直到进行DLL调用。

我正在四处寻找如何在启动时检查所有必需的DLL并偶然发现这个问题。如果找不到所有必需的DLL,则本机C ++应用程序甚至不会启动。 C#“延迟加载”它的DLL吗?也许