【发布时间】:2015-01-17 22:00:37
【问题描述】:
我在使用 MEF 和使用插件文件夹时遇到问题。
我有一个通过 MEF 支持插件的主应用程序。主应用程序不引用包含用于多线程的 .NET Task 类型的程序集,但一个或多个插件会。
插件位于 Plugins 文件夹中,我使用的是 DirectoryCatalog。
我不断收到 ReflectionTypeLoadException 被 MEF 抛出
无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。
LoaderExceptions 属性包含一个FileNotFoundException
“无法加载文件或程序集'System.Threading.Tasks, 版本=1.5.11.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' 或 它的依赖项之一。系统找不到文件 指定。":"System.Threading.Tasks,版本=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
插件通过 Microsoft NuGet 包引用引用 System.Threading.Tasks。
这是我的辅助方法:
public static void Compose(IEnumerable<string> searchFolders, params object[] parts)
{
// setup composition container
var catalog = new AggregateCatalog();
// check if folders were specified
if (searchFolders != null)
{
// add search folders
foreach (var folder in searchFolders.Where(System.IO.Directory.Exists))
{
catalog.Catalogs.Add(new DirectoryCatalog(folder, "*.dll"));
}
}
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
// compose and create plug ins
var composer = new CompositionContainer(catalog);
composer.ComposeParts(parts);
}
public class MEFComposer
{
[ImportMany(typeof(IRepository))]
public List<IRepository> Repositories;
[ImportMany(typeof(ILogging))]
public List<ILogging> LoggingRepositories;
[ImportMany(typeof(IPlugin))]
public List<IPlugin> Plugins;
}
这是我用来调用 MEF 和加载插件的代码。
public void Compose()
{
// try to connect with MEF types
try
{
var parts = new MEFComposer();
MEFHelpers.Compose(new[] { Path.Combine(Application.StartupPath, "Plugins") }, parts);
RepositoryFactory.Instance.Repository = parts.Repositories.FirstOrDefault();
Logging.Repositories.AddRange(parts.LoggingRepositories);
foreach (var plugin in parts.Plugins)
{
this.applicationApi.Plugins.Add(plugin);
plugin.Connect(this.applicationApi);
}
}
catch
{
// ERR: handle error
}
}
为什么即使 Microsoft.Threading.Tasks.dll 和相关的程序集文件存在于 Plugins 文件夹中,但不是主应用程序 bin 文件夹中,MEF 也无法加载插件?有没有办法告诉 MEF 在 Plugins 文件夹中搜索程序集依赖项?
拥有插件模型意味着我无法预测插件可能引用哪些程序集,因此我无法将它们包含在应用程序的主 bin 文件夹中,这就是为什么我希望所有相关的插件和插件依赖项都在插件中文件夹。
【问题讨论】:
-
这个问题你解决了吗?
-
我也对正确方向的解决方案或提示感兴趣,因为我目前面临着类似的问题。
-
我不记得为什么(我的意思是可能是因为这个原因),但在我的代码中,我总是将我的
bin文件夹添加为DirectoryCatalog的文件夹之一。这不一定指向问题,但是您尝试过吗?