【问题标题】:WPF+MAF - addin referenced libraries are not loaded?WPF+MAF - 未加载插件引用的库?
【发布时间】:2015-02-02 14:03:40
【问题描述】:

我是插件框架的新手。现在我正在尝试创建返回 UserControl 的 WPF 插件(根据https://msdn.microsoft.com/en-us/library/bb909849(v=vs.110).aspx)。

问题是当我尝试从插件获取用户控制时,抛出异常:

  1. 第一个例外是“找不到名为 '' 的资源。资源名称区分大小写。”。所有资源都存储在单独的库中,当我对 MEF(MAF 之前)执行相同操作时,它运行良好

  2. 好的,我已从 UserControl 中删除了所有 StaticResources,然后又出现了另一个异常:“{”无法加载文件或程序集 'Infralution.Localization.Wpf, PublicKeyToken=547ccae517a004b5' 或其依赖项之一。 “}”。此库用于本地化。

注意:所有需要的库都与插件位于同一文件夹中

是否未加载插件引用的库?或者我哪里弄错了?

【问题讨论】:

  • Enable fusion logging 并确保您没有将插件视图 DLL 复制到插件输出目录。
  • 约翰·科尔纳,感谢您的回复。我启用了融合日志记录。有 2 个错误(无法加载 AddInView 和 Contracts dll),我认为没关系。带有资源的 dll 上没有错误。我已经检查过 addinview dll 没有复制到输出。最后,我找到了问题所在,我会写它作为答案。无论如何,谢谢你,我以前从未使用过fuslogvw。

标签: c# wpf add-in maf


【解决方案1】:

我发现当插件被激活时,它的 Application.Current 为空。 之前我没有向每个窗口添加资源,但是每个插件库都包含带有资源的 App.xaml 文件。因此,项目编译成功,VS WPF Designers 运行良好,当我使用 MEF(在一个应用程序域中)时它运行良好。但是,正如我所说,当我尝试 MAF 时,插件没有 Application.Current 实例,因此它根本没有资源。

现在,为了让每个 AddIn 都使用宿主应用程序的样式,我创建了合约:

public interface IThemeContract : IContract
{
    /// <summary>
    /// Theme name
    /// </summary>
    string Name { get; }
    /// <summary>
    /// Theme description
    /// </summary>
    string Description { get; }
    /// <summary>
    /// Array of expected resources dictionaries
    /// </summary>
    IListContract<string> ResourceDictionaries { get; }
}

主机应用程序序列化其所有资源;一块HostAdapter:

    System.AddIn.Contract.IListContract<string> IThemeContract.ResourceDictionaries
    {
        get
        {
            var list = new List<string>();
            foreach (var s in _view.ResourceDictionaries)
            {
                list.Add(XamlWriter.Save(s));
            }
            return CollectionAdapters.ToIListContract<string>(list);
        }
    }

并将其发送到插件;然后 addins 反序列化它;一块 AddInAdapter:

    public override System.Windows.ResourceDictionary[] ResourceDictionaries
    {
        get
        {
            var strings = CollectionAdapters.ToIList<string>(_contract.ResourceDictionaries);
            var rds = new List<System.Windows.ResourceDictionary>();
            foreach (var s in strings)
            {
                var output = XamlReader.Parse(s);
                if ((output as System.Windows.ResourceDictionary) != null)
                    rds.Add(output as System.Windows.ResourceDictionary);
            }
            return rds.ToArray();
        }
    }

那么应用程序看起来就像一个单独的单元。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多