C# 从类库加载ResourceDictionary中的XAML文件
我正在尝试制作一个简单的插件系统,其中插件在应用程序启动时从.dll文件动态加载,并显示在UI中 似乎正是我要找的。它使用MEF加载插件。我尝试创建一个简单的项目,并按照说明进行操作。我的解决方案具有以下结构: MeftTest包含主MefTest.exe,仅引用MefTest.SDK,不引用插件 MefTest.SDK包含IPlugin.cs和IPluginViewModel.cs以及Engine.cs,后者从应用程序目录加载插件 Plugin1包含第一个插件,引用MefTest.SDK Plugin2包含第二个插件,引用MefTest.SDK MefTest.SDK->IPlugin.cs MefTest.SDK->Engine.cs 但是,我发现错误,无法加载文件或程序集“MefTest.Plugin1.dll,Culture=neutral”或其依赖项之一。系统找不到指定的文件 Main.xaml文件位于MefTest.Plugin1\Views\Main.xaml文件夹中。项目的输出类型是ClassLibrary,xaml文件的构建操作是Page PS:我试图直接引用插件,并在没有MEF插件的情况下添加它;它仍然抛出相同的异常。所以我认为问题不在于解决方案的MEF部分C# 从类库加载ResourceDictionary中的XAML文件,c#,wpf,xaml,mef,C#,Wpf,Xaml,Mef,我正在尝试制作一个简单的插件系统,其中插件在应用程序启动时从.dll文件动态加载,并显示在UI中 似乎正是我要找的。它使用MEF加载插件。我尝试创建一个简单的项目,并按照说明进行操作。我的解决方案具有以下结构: MeftTest包含主MefTest.exe,仅引用MefTest.SDK,不引用插件 MefTest.SDK包含IPlugin.cs和IPluginViewModel.cs以及Engine.cs,后者从应用程序目录加载插件 Plugin1包含第一个插件,引用MefTest.SDK Pl
我怎样才能解决这个问题?还有,这种方法有更好的选择吗?我在xbap应用程序中这样做……检索遥远的xaml。试着用你当地的资源做同样的事情
private ResourceDictionary LoadDictionary(string source)
{
Stream streamInfo = null;
ResourceDictionary dictionary = null;
try
{
streamInfo = DistantManager.Instance.GetResource(source);
if (streamInfo != null)
{
Uri baseUri = DistantManager.Instance.GetUri(source);
dictionary = XamlReader.Load(streamInfo) as ResourceDictionary;
dictionary.Source = baseUri;
}
}
catch (Exception e)
{
BusinessLogger.Manage(e);
return null;
}
return dictionary;
}
差不多
Uri baseUri = new Uri(Mysource);
dictionary = XamlReader.Load(XXXX) as ResourceDictionary;
dictionary.Source = baseUri;
但另一方面,我不明白为什么你想要一个ResourceDictionary作为你的插件视图。。。?只需创建插件用户控件???问题似乎不是ResourceDictionary源URI,而是缺少的程序集文件或其依赖项之一。如果你只是为了测试而在你的项目中添加一个对插件程序集的引用,那么它能起作用吗?@Clemens我试过了,但不幸的是,它也不能起作用。阅读第页的PS部分end@Clemens或者uri是个问题,因为您提供的链接不同_viewDictionary.Source=newURI/Extension.MyPlugin;component/View.xaml,UriKind.RelativeOrAbsolute;什么是DistantManager?那么XXXX应该是什么呢?如果uri是问题所在,我如何修复它?老实说,你的回答比我的问题LOLAs更让人困惑,为什么不在插件new MyUCPluginView中创建用户控件;相反,还是公开ResourceDictionary??DistantManager是XBAP的专用工具;但是它以stream的形式打开一个ressource,XXX是stream=Application.getResourcestream如果可能的话,给我一个你建议的代码示例,意思是usercontrol看看这个:
[Export(typeof(IPlugin))]
public class Plugin1 : IPlugin
{
private MainViewModel viewModel { get; set; }
public IPluginViewModel ViewModel
{
get { return viewModel; }
}
public ResourceDictionary View
{
get { return viewDictionary; }
}
private ResourceDictionary viewDictionary = new ResourceDictionary();
public string Title
{
get { return "Plugin 1"; }
}
[ImportingConstructor]
public Plugin1()
{
//I get the error here. tried both of these, none of them work
viewDictionary.Source =
// new Uri("pack://application:,,,/MefTest.Plugin1;component/views/main.xaml", UriKind.Absolute);
new Uri("/MefTest.Plugin1;component/views/main.xaml",
UriKind.Relative);
}
public override string ToString()
{
return Title;
}
}
private ResourceDictionary LoadDictionary(string source)
{
Stream streamInfo = null;
ResourceDictionary dictionary = null;
try
{
streamInfo = DistantManager.Instance.GetResource(source);
if (streamInfo != null)
{
Uri baseUri = DistantManager.Instance.GetUri(source);
dictionary = XamlReader.Load(streamInfo) as ResourceDictionary;
dictionary.Source = baseUri;
}
}
catch (Exception e)
{
BusinessLogger.Manage(e);
return null;
}
return dictionary;
}
Uri baseUri = new Uri(Mysource);
dictionary = XamlReader.Load(XXXX) as ResourceDictionary;
dictionary.Source = baseUri;