WPF应用程序在.Net 3.0平台上崩溃

时间:2014-01-08 20:34:15

标签: .net wpf c++-cli

我正在将现有C ++项目的GUI替换为WPF。 这让我学习了一些C#并首先看一下.Net。 我选择编译目标 .Net 3.0 ,以便Vista SP2中的所有计算机都可以运行我的应用程序。 这使得安装要求明确,并缩短了安装时间。 我在Windows 8机器(x64)上使用VS2012进行开发。

代码由Pure C ++,C ++ / CLI glue和WPF的C#/ XAML代码组成。 应用程序在我的开发机器和安装了.Net 4.5.1的Vista(x32)机器上运行良好(发布配置)。

在Windows 7(x64 / x32)计算机和使用.Net 3.0 / 3.5的Vista SP2计算机上崩溃 我将崩溃隔离到纯C ++加载C ++ / CLI粘合DLL文件的位置。

从Windows 7计算机上的Dependency Walker(运行配置文件):

LoadLibraryExW("C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorrc.dll", 0x00000000, LOAD_LIBRARY_AS_DATAFILE) called from "MSCORWKS.DLL" at address 0x690603E5. Mapped "MSCORRC.DLL" as a data file into memory at address 0x007B0001.   
LoadLibraryExW("C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorrc.dll", 0x00000000, LOAD_LIBRARY_AS_DATAFILE) returned 0x007B0001. 
Second chance exception 0xE0434F4D (Unknown) occurred in "KERNELBASE.DLL" at address 0x75B29617.

虽然机器上安装了.Net 3.0(和3.5),但应用程序似乎正在加载.Net 2.0参考库:

  

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP \ v3.0]
  “版本”= “3.0.30729.4926”
  “CBS”= DWORD:00000001
  “增量”= “4926”
  “安装”= DWORD:00000001
  “SP”= DWORD:00000002

以下是我的问题:
1.是否可以捕获此异常,以便用户获得优雅的退出? 2.是否可以从我的应用程序中确定目标机器上安装的.Net框架(除了阅读注册表)? 3.为什么我的应用程序尝试加载V2.0文件?
4.如何验证我的应用程序确实针对V3.0?

更新
嗯,我在这里学到了很多东西,但我的结论并不乐观:
如果将应用程序定位到.NET 4.0,则在缺少此框架的计算机上运行时,应用程序可能会崩溃 从纯C ++到C ++ / CLI 函数的第一次调用发生崩溃。没有办法抓住它,因为它发生在框架边界上 我发现崩溃的解决方法:假设你有一个名为'A'的纯C ++项目,它由一个A.CPP文件组成,该文件从名为'B'的C ++ / CLI DLL中调用一个函数。只需将一个空文件'C.CPP'添加到项目'A'并将此文件标记为使用/ clr标志进行编译。这将使项目'A'成为一个混合语言项目,而不是崩溃,你将得到以下消息框(这是可以接受的):
enter image description here
遗憾的是,如果使用 Visual Studio 2012 Express进行开发,则目标为always .NET 4.x 换句话说,如果您希望您的应用程序在Windows 7上运行(没有其他软件包),那么您必须使用VS2008进行开发。

1 个答案:

答案 0 :(得分:1)

  

应用程序似乎正在加载.Net 2.0参考库

这完全正常,核心库(如mscorlib)在.NET 3.0和3.5中仍然是v2.0.50727。

  

第二次机会异常0xE0434F4D(未知)

您无法使用Dependency Walker诊断未处理的.NET异常,它对托管代码一无所知。如果您无法为计算机获取托管调试程序,请使用DebugDiag

并改进您的程序,以便在没有诊断消息的情况下这些崩溃不会使程序失败。编写AppDomain.CurrentDomain.UnhandledException的事件处理程序,并显示或记录e.UnhandledException.ToString()的值。您将获得异常消息和神圣堆栈跟踪,向您显示程序如何失败。