我有一台运行Windows 7 64位的x64机器。从本周开始,我似乎有一种非常奇怪的情况。
如果我构建并运行平台目标设置为x86的WPF应用程序,我在尝试创建网格时遇到了MissingMethodException:
var g = new Grid();
但是,创建StackPanel工作正常:
var s = new StackPanel();
如果我将平台目标切换到x64或AnyCpu,两个代码都可以正常工作。我正在考虑框架中的损坏程序集,但它看起来确实很奇怪......任何想法?
更新
我一直与微软内部的WPF团队成员保持联系。但是,他们没有时间看我的机器来理解什么是错的。与此同时,我不得不重新安装我的机器以保持正常工作。感谢大家的帮助。我认为问题与WOW64功能有关,但很难更准确。如果我找到更多信息,我会更新这个问题。
答案 0 :(得分:4)
我也有这样的配置,并且在构建使用Grid的x86应用程序时没有遇到任何问题。
我会卸载您正在使用的.NET Framework版本(看起来像.NET 4.0)并重新安装它。要彻底,您也可以卸载Visual Studio 2010并重新安装它(尽管如此)可能是矫枉过正的。)
问题必须只存在于你正在处理的机器上......否则就会有小怪和干草叉等......朝华盛顿州雷德蒙德方向前进。 :-)您可以尝试在另一台机器上创建一个示例项目......只是为了您的理智。 : - )
<强>更新强>
我只想添加System.Windows.Controls.Grid存在于PresentationFramework程序集中。看看这个文件存储在你机器上的位置可能会很有趣......看看你是否注意到了什么。解决方案仍然可能重新安装......但是,嘿,更多的信息总是更好。
对于.NET 4.0,PresentationFramework程序集位于: C:\的Windows \ Microsoft.NET \组件\ GAC_MSIL \ PresentationFramework \ v4.0_4.0.0.0__31bf3856ad364e35
对于.NET 3.0 / 3.5,PresentationFramework程序集位于: C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0
答案 1 :(得分:4)
将平台目标设置为x86将导致应用程序在非托管程序集上调用x86版本并以WOW64模式运行。请参阅this article on platform target和this msdn page on WOW64。如果你跟踪Reflector中的静态Grid构造函数,它看起来像一些线程初始化代码调用一个externed非托管函数“RuntimeHelpers.PrepareConstrainedRegions()”,这可能导致问题(StackPanel不调用此代码)。这背后有一些猜测,但您可能会尝试运行Windows Update以确保您拥有与同事相同的更新,并确保您还拥有所有VS / .NET更新。
最终,除非您从代码中调用某些仅作为x86程序集提供的第三方非托管dll,否则您应该将平台目标保留为任何CPU,因此它将在x86和x64平台上本机运行。
最后,如果在运行Windows更新后仍然看到问题,如果可能的话,还要更新同事的PC,看看是否出现问题。如果确实如此,WOW64层可能存在错误,file a bug report with Microsoft会很好。