如何使用MEF和dll在dll项目中嵌入资源c#

时间:2014-10-06 08:36:50

标签: c# .net dll mef

对于一个重要的项目,我必须使用MEF来构建一个大型组件。程序集必须打开Web服务器。

我的问题是如何使用MEF加载并将嵌入dll添加到我的项目中? 在我使用这种方法之前:

        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new DirectoryCatalog(@"R:\DNN\Extensions", "*.dll"));

        var container = new CompositionContainer(catalog);
        try
        {
            container.ComposeParts(this);
        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
        }  

但是这个解决方案对于mantain来说非常困难!我在使用时无法更新Extansions文件夹中的dll。

唯一的方法是重新启动DNN cms或在新文件夹ExtensionsBis中为更新的dll充电。

我必须找到一个新的解决方案,用extarnal dll组成项目。我已经尝试了嵌入式dll的解决方案:

        var catalog = new AggregateCatalog();
        var resourceNames = GetType().Assembly.GetManifestResourceNames();
        foreach (var resourceName in resourceNames)
        {
            using (var stream = GetType().Assembly.GetManifestResourceStream(resourceName))
            {
                if (stream == null) continue;
                var ba = new byte[(int)stream.Length];
                stream.Read(ba, 0, (int)stream.Length);
                catalog.Catalogs.Add(new AssemblyCatalog(Assembly.Load(ba)));
            }
        }
        var container = new CompositionContainer(catalog);
        try
        {
            container.ComposeParts(this);
        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
        }

dll已加载并添加到目录中,我在组合中也不例外。

但是,当我尝试执行导出的函数或在运行时访问类时,我有一个异常“对象引用没有设置为对象的实例”。

catalog.catalogs.count给出了有效dll的有效数量,但MEF组合似乎在某处失败。

以这种方式加载MEF dll插件是否可行? 在dll中使用MEF的最佳做法是什么?

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

使用FileSystemWatcher类来监控存储插件的文件夹。为Created事件配置事件处理程序,并使用初始代码块加载库。