我正在使用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? (不关闭程序)
提前感谢您的帮助
答案 0 :(得分:4)
您需要在AppDomain中启用卷影复制,这会强制应用程序的行为与可执行内容未从源位置运行但位于临时位置的Web应用程序类似。
唯一的问题是
AppDomain.CurrentDomain.SetShadowCopyFiles()
强制它在当前域上。这是不可取的,因为这已被弃用,有利于:AppDomainSetup.ShadowCopyFiles = "true";
。然后,您需要在其他AppDomain中推迟执行程序集。也许这form post会有所帮助吗?我不确定您是否可以通过应用程序配置启用Shadow Copying ...
答案 1 :(得分:1)
如果您尝试在目录上插入一个这样的Object Assembly:
Assembly assembly = Assembly.Load(System.IO.File.ReadAllBytes(Path.Combine(directoryPath, ItemPlugin)));
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly));
您可以删除\稍后更改文件...