【发布时间】:2009-09-21 06:34:39
【问题描述】:
好的,这真的很烦人,我之前注意到 WPF 生成的用于加载 XAML 资源的代码似乎没有使用强名称,因此对于需要支持并行版本的 WPF 程序集的场景可能会出现问题.
事实证明是这样的,现在它给我带来了问题 - 我有一个插件系统,它应该支持并排安装插件,这些插件的不同之处仅在于它们的版本号(它们的程序集版本)。这当然可以由 .NET 支持,因为即使它们具有相同的 DLL 文件名,程序集也被确定具有不同的身份,前提是它们具有强命名并且具有不同的公钥/私钥或具有不同的程序集版本号。
现在,如果我们查看 Visual Studio 为窗口和用户控件生成的代码,我们会在自动生成的文件中看到以下内容:
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/Sensormatic.AMK1000.Panel;component/views/servicepanelui.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Views\ServicePanelUI.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
注意创建资源定位器的行 - 它使用的是相对 URI,它没有指定强名称或包含 xaml 资源的程序集的版本。
我想也许 LoadComponent 会检查调用程序集的身份并使用它的公钥和版本详细信息,或者可能检查包含“this”参数类型的程序集的身份。
看起来情况并非如此 - 如果您有两个版本号不同(但文件名相同)的程序集,那么您可能会得到一个 IOException 并显示消息“无法找到资源 X”(对于上面的示例“无法找到资源”视图/servicepanelui.xaml'。
更糟糕的是,我很确定这也意味着具有相同文件名但不同公钥/私钥的程序集(即来自不同发布者)也会导致此错误。
那么,有谁知道如何解决这个问题?如何使 WPF 强名称兼容。
注意,就我而言,这是一个 WPF 错误。您不必为了避免这种情况而使用 Appdomain 隔离。
【问题讨论】:
-
嗨菲尔,我面临同样的问题。你能找到任何解决方案吗?
-
使用主题(通过资源字典)的 WPF 自定义控件是否有人遇到过类似的问题?如果是,有什么解决方案吗?
-
这方面有进展吗?当然,人们能够创建 WPF 库而没有这个问题。我需要但有这个确切的问题。
标签: .net wpf xaml resources strongname