AssemblyResolve为插件的资源文件触发

时间:2013-06-09 01:45:22

标签: c# .net wpf resources assembly-resolution

我的应用程序在项目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);
}

接口实现分两部分实现:

  1. ProjectName.Plugins.BasicProgressUI - 实现IProgressUIPlugin,IProgressUIWindow
  2. ProjectName.Plugins.BasicProgressUI.Blend - 实际WPF视图和viewmodel
  3. 正确加载实现接口的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事件处理程序搜索插件目录,但不存在该名称),并且我的窗口显示时没有在其资源字典中指定样式。

    我到目前为止尝试过的东西:

    1. 摆弄[assembly: NeutralResourcesLanguageAttribute("en-US", UltimateResourceFallbackLocation.MainAssembly)]。使用Satellite,MainAssembly尝试,但没有指定属性。在Assemblysolve调用之后,Satellite会引发抛出,MainAssembly导致不调用AssemblyResolve,而不指定它会导致调用AssemblyResolve。
    2. 当要求assemblyresolve解析.resources文件时,显式返回WPF项目程序集。
    3. 大量谷歌搜索(诸如“wpf resources assemblyresolve”,“assemblyresolve resourcedictionary”等查询)。
    4. 我知道在这种情况下,我可以将颜色值硬编码到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/

1 个答案:

答案 0 :(得分:0)

我项目中经验丰富的WPF经历了我的代码,结果发现我在App.xaml中加载了resourcedictionary(这似乎是WPF应用程序的入口点)。但是,当您将WPF项目作为插件加载并实例化其中一个类(这很有意义)时,不会调用该入口点,因此未加载资源字典。他通过移动来解决问题

<ResourceDictionary>
   <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="Simple Styles.xaml"/>
   </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

从App.xaml到BasicProgressUIWindow.xaml.cs

窗口现在可以正确加载其样式配置资源。然而,失败的装配结果仍然发生,我们正在试图弄清楚它们应该是什么意思。