MEF热更新生效问题

LIZHIztt 2017-02-17 05:14:00
发帖问过此类问题,按照P哥的思路,MEF进行热更新是没有问题的,但是现在遇到的问题是插件加载时将插件复制到缓存目录加载,加载完成后,原目录内dll更新之后,重新将新插件复制到新缓存目录加载,但是依旧是执行原先插件,如果插件目录里添加新插件,重新加载之后新插件生效,之前加载过的插件依旧未更新,只有重启软件后才会更新。

...全文
182 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LIZHIztt 2017-02-18
  • 打赏
  • 举报
回复
和文件名没有关系,我改了文件名还是没有用
xuzuning 2017-02-18
  • 打赏
  • 举报
回复
同名的 dll 是不会重复加载的
LIZHIztt 2017-02-18
  • 打赏
  • 举报
回复
我测试了一下,假设有A,B两个文件夹,A文件夹与B文件夹下的插件不同,切换加载路径是可以正常加载插件的, 例如 A文件夹 mail.dll fax.dll B文件夹 sms.dll horn.dll 但是如果A文件夹下是插件的旧版本,B文件夹下是插件的新版本,切换加载路径是没有用的,例如 A文件夹 mail.dll(旧版本) fax.dll(旧版本) sms.dll(旧版本) horn.dll(旧版本) B文件夹 mail.dll(新版本) fax.dll(新版本) sms.dll(新版本) horn.dll(新版本)
LIZHIztt 2017-02-18
  • 打赏
  • 举报
回复
急,顶一下.......
LIZHIztt 2017-02-17
  • 打赏
  • 举报
回复
启动 plugins = HotImportObject<Plugin>("PlugIn"); 单击更新按钮 plugins = HotImportObject<Plugin>("PlugIn");
LIZHIztt 2017-02-17
  • 打赏
  • 举报
回复
窗体上有“执行”和““更新插件" 两个按钮,单击执行,弹出消息框显示数字1 [Export(typeof(IPlugIn))] public class Main : IPlugIn { public bool Release(object parameter) { System.Windows.Forms.MessageBox.Show("1"); } } 然后改变DLL内容, System.Windows.Forms.MessageBox.Show("2"), 拷贝新的DLL到插件目录下(覆盖旧版本), 单击“更新插件”按钮 然后再单击“执行”按钮,弹出消息框显示数字任然是1
  • 打赏
  • 举报
回复
“之前加载过的插件依旧未更新” 这个看不到你是如何判断更新的,不知道你的代码是如何写的。 我在 http://bbs.csdn.net/topics/391970445?page=1 写了一个简单例子,你可以看看实际代码有什么区别。
LIZHIztt 2017-02-17
  • 打赏
  • 举报
回复
private static T ImportObject<T>(string dir) where T : new() { T obj = new T(); AggregateCatalog catalog = new AggregateCatalog(); catalog.Catalogs.Add(new DirectoryCatalog(dir)); CompositionContainer container = new CompositionContainer(catalog); container.ComposeParts(obj); return obj; } private static T HotImportObject<T>(string sourcepath, string targetpath="Temp") where T : new() { DirectoryInfo source = new DirectoryInfo(sourcepath); DirectoryInfo target = new DirectoryInfo(Path.Combine(targetpath, DateTime.Now.ToString("yyyyMMddHHmmssfff"))); if (!target.Exists) { target.Create(); } foreach (FileInfo file in source.EnumerateFiles()) { file.CopyTo(Path.Combine(target.FullName, file.Name)); } return ImportObject<T>(target.FullName); } public interface IPlugIn { string DeviceClass { get; } string DeviceName { get; } bool Release(object parameter); } 启动时 plugins = HotImportObject<Plugin>("PlugIn"); 发现原目录插件变化时 plugins = HotImportObject<Plugin>("PlugIn");
  • 打赏
  • 举报
回复
你在 copy 文件的时候,只要不是 Release 版本,不要 try...catch,以免掩盖了 bug。要让 copy 失败尽早调出来。 测试时,确保目标文件都是最新的DLL 文件再加载。还能自动倒退 DLL 版本?
  • 打赏
  • 举报
回复
你中间把加载目录名搞错了吧?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧