.NET Framework 4.0中,WPF在x64平台上启动较慢

39
我注意到,如果我将我的WPF应用程序构建为Any CPU/x64,则启动时间(大约20秒左右)或加载新控件的时间比在x86上启动的时间长得多(在发布和调试模式下,在VS内部或外部均是如此)。即使是最简单的WPF应用程序也会出现这种情况。这个问题在MSDN论坛中讨论过,但是没有提供答案。这仅发生在.NET 4.0中——在3.5 SP1中,x64与x86一样快。有趣的是,自从VS2010以来,微软似乎已经知道了这个问题,因为新的WPF项目的默认设置是x86。
这是一个真正的错误吗,还是我做错了什么?
编辑:可能与C# .NET 4.0中数据绑定设置缓慢相关。我在大量使用数据绑定。
1个回答

75

事实上,WPF应用程序的默认项目类型为x86有两个主要原因:

  • Intellitrace调试仅适用于x86,如果默认项目模板不能与其核心功能之一配合使用,那将会非常糟糕。
  • 许多开发人员仍然不知道他们的AnyCPU可执行文件在64位机器上将以x64运行,并且会惊讶地发现他们依赖的32位DLL不存在于64位版本中,例如OLEDB驱动程序、某些本机DLL等。

至于你遇到的启动时间问题,似乎与NGEN有关。由于x64和x86进程有不同的NGEN缓存,可能需要重建或更新64位NGEN缓存。尝试从提升的命令提示符中运行以下命令:

CD C:\Windows\Microsoft.NET\Framework64\v4.0.30319
NGEN update

这是重新构建已标记为 NGEN 的程序集本地映像的命令。如果程序集没有安装到 GAC 中,NGEN 应用于应用程序可能不会有任何好处,所以我不会费心去尝试。但是框架程序集、工具包程序集等都应该被 NGEN 化。

(顺便提一下,我运行上述命令时出现了几个无法加载程序集的错误,主要是 SQL 和 Visual Studio 程序集。)


15
我的天啊,它居然“奏效”了!!!我永远都想不到那个。你真是名副其实的姓氏啊,伙计。非常感谢!!! - Robert Fraser
3
耶稣,这个建议真是神奇!他们怎么可能没能保持缓存的最新状态,看到这样的影响呢?微软大失败。顺便说一句,在安装某些更新后,似乎需要重新执行此操作。 - Roman Starkov
只是确认一下,经过几个小时的调试和研究这个“bug”,我运行了“NGEN update”,应用程序开始像火车一样运行了!非常感谢兄弟。 - Dusan
@josh,这在Windows 10中仍然相关吗?并且更新了.Net版本吗? - Yitzchak
非常感谢这个。我有一个项目,由于依赖关系,我需要以64位运行,但是一旦我将其转换为x64,它就无法运行BackgroundWorker进程。NGEN解决方案解决了这个问题。 - Graeme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接