WPF+MAF - 加载项引用的库未加载?
WPF+MAF - addin referenced libraries are not loaded?
我是外接程序框架的新手。现在我正在尝试创建 returns UserControl 的 WPF 插件(根据 https://msdn.microsoft.com/en-us/library/bb909849(v=vs.110).aspx)。
问题是当我尝试从插件获取用户控制时,抛出异常:
第一个例外是 "Cannot find resource named ''. Resource names are case sensitive."。所有资源都存储在单独的库中,当我对 MEF 执行相同操作时(在 MAF 之前)
好的,我已经从我的 UserControl 中删除了所有 StaticResources,然后我得到了另一个异常:“{"Could not load file or assembly 'Infralution.Localization.Wpf, PublicKeyToken=547ccae517a004b5' or one of its dependencies."}”。此库用于本地化。
注意:所有需要的库都与插件位于同一文件夹中
是否未加载加载项引用的库?或者我哪里弄错了?
我发现当插件被激活时,它的 Application.Current 是空的。
早些时候我没有为每个 window 添加资源,但是每个插件库都包含 App.xaml 带有资源的文件。因此,项目编译成功,VS WPF Designers 工作正常,当我使用 MEF(在一个应用程序域中)时它工作正常。但是,正如我所说,当我尝试 MAF 时,插件没有 Application.Current 实例,因此它根本没有资源。
现在,为了让每个插件都使用宿主应用程序的样式,我创建了合同:
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);
}
}
并将其发送给插件;然后插件反序列化它;一块 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();
}
}
然后应用程序看起来像一个单元。
我是外接程序框架的新手。现在我正在尝试创建 returns UserControl 的 WPF 插件(根据 https://msdn.microsoft.com/en-us/library/bb909849(v=vs.110).aspx)。
问题是当我尝试从插件获取用户控制时,抛出异常:
第一个例外是 "Cannot find resource named ''. Resource names are case sensitive."。所有资源都存储在单独的库中,当我对 MEF 执行相同操作时(在 MAF 之前)
好的,我已经从我的 UserControl 中删除了所有 StaticResources,然后我得到了另一个异常:“{"Could not load file or assembly 'Infralution.Localization.Wpf, PublicKeyToken=547ccae517a004b5' or one of its dependencies."}”。此库用于本地化。
注意:所有需要的库都与插件位于同一文件夹中
是否未加载加载项引用的库?或者我哪里弄错了?
我发现当插件被激活时,它的 Application.Current 是空的。 早些时候我没有为每个 window 添加资源,但是每个插件库都包含 App.xaml 带有资源的文件。因此,项目编译成功,VS WPF Designers 工作正常,当我使用 MEF(在一个应用程序域中)时它工作正常。但是,正如我所说,当我尝试 MAF 时,插件没有 Application.Current 实例,因此它根本没有资源。
现在,为了让每个插件都使用宿主应用程序的样式,我创建了合同:
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);
}
}
并将其发送给插件;然后插件反序列化它;一块 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();
}
}
然后应用程序看起来像一个单元。