问题
我的 MEF 代码在运行时未从与 DirectoryCatalog 关联的文件夹中正确更新程序集。插件在运行时成功加载,但是当我更新 dll 并在 DirectoryCatalog 上调用 Refresh 时,程序集没有得到更新。背景
我正在构建一个具有 MEF 容器的 dll,并使用 DirectoryCatalog 来查找本地插件文件夹。我目前从一个简单的 WinForm 调用此 dll,该 dll 设置为使用单独的项目以使用 ShadowCopy,因此我可以覆盖我的插件文件夹中的 dll。我没有使用 FileWatcher 更新此文件夹,而是公开了一个在 DirectoryCatalog 上调用刷新的公共方法,因此我可以随意更新程序集而不是自动更新程序集。代码
基类实例化 MEF 目录和容器,并将它们保存为类变量以供以后引用访问
public class FieldProcessor
{
private CompositionContainer _container;
private DirectoryCatalog dirCatalog;
public FieldProcessor()
{
var catalog = new AggregateCatalog();
//Adds all the parts found in the same assembly as the TestPlugin class
catalog.Catalogs.Add(new AssemblyCatalog(typeof(TestPlugin).Assembly));
dirCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory + "Plugin\\");
catalog.Catalogs.Add(dirCatalog);
//Create the CompositionContainer with the parts in the catalog
_container = new CompositionContainer(catalog);
}
public void refreshCatalog()
{
dirCatalog.Refresh();
}
} ...
这是我要覆盖的插件。我的更新测试是返回的字符串输出到文本框,我更改插件返回的字符串,重建,并将其复制到插件文件夹中。但它不会为正在运行的应用程序更新,直到我关闭并重新启动应用程序。
[Export(typeof(IPlugin))]
[ExportMetadata("PluginName", "TestPlugin2")]
public class TestPlugin2 : IPlugin
{
public IEnumerable<IField> GetFields(ContextObject contextObject, params string[] parameters)
{
List<IField> retList = new List<IField>();
//Do Work Return Wrok Results
retList.Add(new Field("plugin.TestPlugin2", "TestPluginReturnValue2"));
return retList;
}
}
编辑
进口声明 [ImportMany(AllowRecomposition=true)]
IEnumerable<Lazy<IPlugin, IPluginData>> plugins;