使用MEF更改已加载的DLL

4

我正在使用MEF和System.ComponentModel.Composition.dll来加载一些dll文件。

我的操作类似于:

AggregateCatalog catalog = new AggregateCatalog(new AssemblyCatalog(Assembly.GetExecutingAssembly()), new DirectoryCatalog(directory));
_container = new CompositionContainer(catalog);
_container.ComposeParts(this);

导入我的dll。

一段时间后,我想更新我的dll,但是如果我尝试删除它,我会遇到访问被拒绝的问题,因为它已经被程序使用了。

如何释放dll,替换为新的dll并重新加载dll?(不关闭程序)

感谢您提前的帮助。

2个回答

4
你需要在AppDomain中启用阴影复制,这将强制应用程序表现得类似于Web应用程序,其中可执行内容不是从源位置运行,而是从临时位置运行。

唯一的问题是通过:

  1. 使用已弃用的方法AppDomain.CurrentDomain.SetShadowCopyFiles()来强制对当前域进行设置。不建议这样做,因为这已被弃用,推荐使用以下方法:
  2. 在创建新的AppDomain时使用AppDomainSetup.ShadowCopyFiles = "true";。然后您需要延迟在其他AppDomain中执行您的程序集。也许这篇论坛帖子可以帮助?

我不确定是否可以通过应用程序配置启用阴影复制...


我尝试了很多方法,但无法使其正常工作。我不得不让我的应用程序重新启动才有机会更新dll :( - Tim

2
如果您尝试插入一个这样的目录对象组件:
Assembly assembly = Assembly.Load(System.IO.File.ReadAllBytes(Path.Combine(directoryPath, ItemPlugin)));
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly));

您可以稍后删除或更改该文件...



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接