我的应用程序在项目 ProjectNameLib 中定义了一个接口 IProgressUIPlugin,该接口在另一个 DLL 中实现。我的主应用程序直接引用 ProjectNameLib 并在启动时从 /plugins/ 文件夹加载接口实现的程序集。接口已被复制和粘贴,注释和多余的方法被剥离,如下:
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 并且没有指定属性。在调用 assemblyresolve 后,Satellite 导致抛出,MainAssembly 导致 AssemblyResolve 不被调用,不指定它会导致 AssemblyResolve 被调用。 - 当要求 assemblyresolve 解析 .resources 文件时,显式返回 WPF 项目程序集。
- 大量的谷歌搜索(诸如“wpf 资源 assemblyresolve”、“assemblyresolve resourcedictionary”等查询)。
我知道对于这种情况,我可以将颜色值硬编码到 WPF 窗口中来解决问题,但在未来,我们将拥有各种资源、本地化、蒙皮等,所以我想我现在应该解决问题。
我已经尽我所能描述了这个问题。如果您有任何问题,我一定会回复。
谢谢!
链接:
插件实现可以在这里找到 code.google.com/the-dargon-project/
插件管理器/程序集解析器可以在这里找到 code.google.com/the-dargon-project/