【问题标题】:AssemblyResolve fired for plugin's resources file为插件的资源文件触发了 AssemblyResolve
【发布时间】: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);
}

接口实现分两块实现:

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

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

  1. 摆弄[assembly: NeutralResourcesLanguageAttribute("en-US", UltimateResourceFallbackLocation.MainAssembly)]。尝试使用 Satellite、MainAssembly 并且没有指定属性。 Satellite 会在调用 assemblyresolve 后引发 throw,MainAssembly 会导致 AssemblyResolve 不被调用,不指定它会导致 AssemblyResolve 被调用。
  2. 当要求 assemblyresolve 解析 .resources 文件时,显式返回 WPF 项目程序集。
  3. 大量谷歌搜索(诸如“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


    【解决方案1】:

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

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

    从 App.xaml 到 BasicProgressUIWindow.xaml.cs

    窗口现在可以正确加载其样式配置资源。但是,失败的程序集解析仍然发生,我们正在尝试弄清楚它们应该是什么意思。

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2017-04-27
      • 2012-05-15
      相关资源
      最近更新 更多