Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从类库加载ResourceDictionary中的XAML文件_C#_Wpf_Xaml_Mef - Fatal编程技术网

C# 从类库加载ResourceDictionary中的XAML文件

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

我正在尝试制作一个简单的插件系统,其中插件在应用程序启动时从.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部分


我怎样才能解决这个问题?还有,这种方法有更好的选择吗?

我在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;