【发布时间】:2013-06-09 11:02:56
【问题描述】:
我的应用程序在 ProjectNameLib 项目中定义了一个接口 IProgressUIPlugin,该接口在另一个 DLL 中实现。我的主应用程序直接引用 ProjectNameLib 并在启动时从 /plugins/ 文件夹加载接口实现的程序集。接口已复制粘贴,删除了 cmets 和冗余方法,如下:
public interface IProgressUIPlugin : IApplicationNameExtension
{
IProgressUIWindow CreateNew();
}
public interface IProgressUIWindow : IDisposable
{
void Close();
void Update(string title, string subtitle, string status, double progress);
}
接口实现分两块实现:
- ProjectName.Plugins.BasicProgressUI - 实现 IProgressUIPlugin, IProgressUIWindow
- ProjectName.Plugins.BasicProgressUI.Blend - 实际的 WPF 视图和视图模型
实现接口的 DLL 已正确加载,因此我能够调用方法 pluginInstance.CreateNew()。但是,我的程序集解析器随后会尝试解析。
ProjectName.Plugins.BasicProgressUI.Blend.resources, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null
ProjectName.Plugins.BasicProgressUI.Blend.resources, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null
ProjectName.Plugins.BasicProgressUI.Blend.resources, Version=1.0.0.0, Culture=en, PublicKeyToken=null
ProjectName.Plugins.BasicProgressUI.Blend.resources, Version=1.0.0.0, Culture=en, PublicKeyToken=null
两种解决方案均失败(我的 AssemblyResolve 事件处理程序搜索插件目录,但该名称不存在)并且我的窗口显示时没有在其资源字典中指定样式。
到目前为止我尝试过的东西:
- 摆弄
[assembly: NeutralResourcesLanguageAttribute("en-US", UltimateResourceFallbackLocation.MainAssembly)]。尝试使用 Satellite、MainAssembly 并且没有指定属性。 Satellite 会在调用 assemblyresolve 后引发 throw,MainAssembly 会导致 AssemblyResolve 不被调用,不指定它会导致 AssemblyResolve 被调用。 - 当要求 assemblyresolve 解析 .resources 文件时,显式返回 WPF 项目程序集。
- 大量谷歌搜索(诸如“wpf resources assemblyresolve”、“assemblyresolve resourcedictionary”等查询)。
我知道,对于这种情况,我可以将颜色值硬编码到 WPF 窗口中来解决问题,但在未来,我们将拥有各种资源、本地化、皮肤等,所以我想我应该现在就解决这个问题。
我已经尽我所能描述了这个问题。如果你有任何问题,我一定会回复的。
谢谢!
链接:
The plugin implementation can be found here at code.google.com/the-dargon-project/
The addin manager/assembly resolver can be found here at code.google.com/the-dargon-project/
【问题讨论】:
标签: c# .net wpf resources assembly-resolution