Application.LoadComponent从MEF链接的程序集中加载组件

时间:2011-04-21 10:46:56

标签: c# wpf mef

我正在使用MEF编写WPF应用程序以实现可扩展性。核心应用程序导入来自程序集的类型,核心应用程序对使用MEF DirectoryCatalog一无所知。包含导入类型的程序集位于另一个目录中,并且嵌入了一个我通常可以使用

访问的XAML资源组件

Application.LoadComponent( new Uri( "MyAssembly;component/MyXaml.xaml" ) );

然而,当程序集被链接时,执行此操作会获得IOException Cannot locate resource 'myxaml.xaml'(看起来很奇怪,不抱怨无法找到程序集)

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可能过度复杂地使用MEF和外部导入。通常情况下,你的应用程序中有正常的项目依赖关系或外部依赖关系,而且从我在帖子中看到的内容来看,到目前为止这对你来说还是很好。

当您将MEF添加到等式中时,您的问题就出现了。这可能是因为您引导MEF并导入这些DLL的方式,并且我无法通过查看您的代码找到它。

我可以告诉你我是如何做到这一点的,以及我开发的应用程序:

我正常设置所有内容,具有我需要的每个项目的正常项目依赖性,然后当我从主WPF应用程序项目引导MEF时,它引用了几乎所有内容(在我的特定情况下,它是来自我的MefBootstrapper)棱镜)我简单地做的是:

    public class SigepBootstrapper : MefBootstrapper
    {
        protected override void ConfigureAggregateCatalog()
        {
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(SigepBootstrapper).Assembly));
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(AutoPopulateExportedViewsBehavior).Assembly));
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StatusBarView).Assembly));
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Traversals).Assembly));
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(EngineManager).Assembly));
        }
...

如果我没有使用Prism,我会创建AssemblyCatalog,只会以不同方式设置它们,所以沿着其他一些引导程序,我会继续写下:

new AssemblyCatalog(typeof(SigepBootstrapper).Assembly)