我遇到了一些令人讨厌的问题,WPF应用程序崩溃在某些客户端计算机上,但在其他地方工作 - 每个开发人员的噩梦.
我在这里发布问题/解决方案,以帮助保持开发人员的理智.这些都不容易排除故障.
这两个问题都是经典的"它适用于我的机器但不适用于我们的机器"问题.
Jef*_*ght 20
1)WPF应用程序在启动时崩溃.没有错误,不明白为什么.
首先实际查找错误的关键故障排除步骤是向app.xaml添加其他错误处理.
在App.xaml标头中,添加:
<Application DispatcherUnhandledException="App_DispatcherUnhandledException" />
Run Code Online (Sandbox Code Playgroud)
并在您的App.xaml.cs中添加如下内容:
void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs args)
{
log.Fatal("An unexpected application exception occurred", args.Exception);
MessageBox.Show("An unexpected exception has occurred. Shutting down the application. Please check the log file for more details.");
// Prevent default unhandled exception processing
args.Handled = true;
Environment.Exit(0);
}
Run Code Online (Sandbox Code Playgroud)
添加这个额外的调试后,我发现了错误:
System.TypeInitializationException:'System.Windows.Media.FontFamily'的类型初始值设定项引发异常.---> System.ArgumentException:路径中的非法字符.
进一步的研究,谷歌搜索和咖啡,导致客户端机器在注册表中的字体条目中有一个尾随'◻'字符的解决方案
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
删除这个流氓角色解决了这个问题.

查看职业拯救博客文章"如何破解每个WPF应用程序".
2)WPF应用程序启动,窗口边框显示,但内容不绘制.它只是挂起(报告为"透明窗口")
这是另一个与字体相关的问题.我最初将它归结为Window.xaml中的fontSize ="16",而不是在客户端站点上的一台(并且只有一台)机器上运行,就好像WPF拒绝将它们的字体渲染为16(?).我删除了指定字体大小的代码并且它有效...但事实证明,它只适用于我的登录配置文件.在同一台机器上同事的登录配置文件仍然失败.我可以像我一样登录,成功运行,注销,他自己登录,运行它,并且它会因"透明的悬挂窗口"而失败.相同的机器,相同的权限.
作为最后的手段,我以他身份登录并注意到他有一个带有放大字体的自定义主题集.我将windows主题改回了经典主题......这解决了问题(?!?).此问题似乎也与字体相关,但我没有确定绝对的根本原因.将主题更改回标准主题是一种临时解决方法.