8

我有一个问题困扰了我一段时间。在我发布的 WPF/.NET 3.5 产品上,由于以下错误,大约有 100 次安装将无法运行该软件:

System.Windows.Markup.XamlParseException:对象初始化失败 (ISupportInitialize.EndInit)。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)标记文件“mainwindow.xaml”中的对象“System.Windows.Controls.MenuItem”出错。

这令人费解,原因有以下三个:

  1. 这只发生在大约 1% 到 2% 的安装中。

  2. 据我所知,这些系统上的 .NET 安装或操作系统没有什么不寻常的。

  3. 默认框架引用 (System.Windows.Controls.MenuItem) 会发生这种情况

谁能想到可能的原因?

编辑:按照“500”的提示后,我能够在客户机器上运行 Fusion 日志查看器。在开发机和其他所有测试机上,对“PresentationFramework”和“PresentationFramework.Aero”都有成功的绑定尝试,在意料之中。在客户端机器上,有一个额外的绑定尝试失败(删除了不相关的行):

*** Assembly Binder Log Entry  (2/3/2013 @ 1:18:44 PM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = PresentationFramework.Dawn TOP, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
Calling assembly : PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
===
LOG: This bind starts in default load context.
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: PresentationFramework.Dawn TOP, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/My App/PresentationFramework.Dawn TOP.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/My App/PresentationFramework.Dawn TOP/PresentationFramework.Dawn TOP.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/My App/PresentationFramework.Dawn TOP.EXE.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/My App/PresentationFramework.Dawn TOP/PresentationFramework.Dawn TOP.EXE.
LOG: All probing URLs attempted and failed.

谷歌搜索“PresentationFramework.Dawn”没有返回任何结果,我找不到对该文件的任何引用。可以做任何解释或额外的测试吗?

编辑 2: 事实证明,客户安装了一个名为“Dusk”的非官方 Windows 7 Aero 主题。出于某种原因,PresentationFramework 决定调用 PresentationFramework.Dusk 而不是 PresentationFramework.Aero(我在项目中明确包含的参考)。我假设该错误是由于在 GAC 中找不到 Dusk 而导致的第 3 方主题安装错误的结果,但是您能否说明我如何阻止尝试引用并强制所有 GUI 元素使用 PresentationFramework.Aero?

4

2 回答 2

3

在出现故障的机器上,运行Assembly Binding Log Viewer以更好地了解它为什么会脱轨。

于 2013-02-01T18:02:50.070 回答
3

在您的应用程序中,您可以指定要使用哪个主题来强制使用另一个主题而不是系统主题。

需要将此代码添加到您的 ApplicationStartUp 事件中

void App_Startup(object sender, StartupEventArgs e) {
  // other startup code
  Uri uri = new Uri(“PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component\\themes/aero.normalcolor.xaml”, UriKind.Relative);

  Resources.MergedDictionaries.Add(Application.LoadComponent(uri) as ResourceDictionary);
}

您还可以在 XAML 中定义您的主题:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source=“/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component\themes/aero.normalcolor.xaml“ />
        </ResourceDictionary.MergedDictionaries>

        <!– other resources go here –&gt;

    </ResourceDictionary>
</Application.Resources>

此设置定义您要使用 Aero 主题。(也许您需要更改要使用的版本和公钥令牌)。

更多信息可以在这里找到。

于 2013-02-07T07:46:03.553 回答