对于一个重要的项目,我必须使用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的最佳做法是什么?
谢谢你的帮助。