社区
C#
帖子详情
MEF热更新生效问题
LIZHIztt
2017-02-17 05:14:00
发帖问过此类问题,按照P哥的思路,MEF进行热更新是没有问题的,但是现在遇到的问题是插件加载时将插件复制到缓存目录加载,加载完成后,原目录内dll更新之后,重新将新插件复制到新缓存目录加载,但是依旧是执行原先插件,如果插件目录里添加新插件,重新加载之后新插件生效,之前加载过的插件依旧未更新,只有重启软件后才会更新。
...全文
182
10
打赏
收藏
MEF热更新生效问题
发帖问过此类问题,按照P哥的思路,MEF进行热更新是没有问题的,但是现在遇到的问题是插件加载时将插件复制到缓存目录加载,加载完成后,原目录内dll更新之后,重新将新插件复制到新缓存目录加载,但是依旧是执行原先插件,如果插件目录里添加新插件,重新加载之后新插件生效,之前加载过的插件依旧未更新,只有重启软件后才会更新。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
以专业开发人员为伍
2017-02-17
打赏
举报
回复
“之前加载过的插件依旧未更新” 这个看不到你是如何判断更新的,不知道你的代码是如何写的。 我在
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");
以专业开发人员为伍
2017-02-17
打赏
举报
回复
你在 copy 文件的时候,只要不是 Release 版本,不要 try...catch,以免掩盖了 bug。要让 copy 失败尽早调出来。 测试时,确保目标文件都是最新的DLL 文件再加载。还能自动倒退 DLL 版本?
以专业开发人员为伍
2017-02-17
打赏
举报
回复
你中间把加载目录名搞错了吧?
Mef
demo
Mef
demo
Mef
demo
Mef
demo
MEF
框架源代码
MEF
框架源代码
MEF
框架源代码
MEF
框架源代码
MEF
框架源代码
MEF
框架源代码
MVC+EF+LayUI框架的应用案例
1.相关技术,MVC、EF、Layer、
MEF
讲解 2.框架使用,规范 3.框架公用库更新要求与规范 4.本框架在实际的工作中综合应用 5.为提高工作效率,怎么样结合本框架提高工作效率
C#
MEF
使用实例
MEF
实例,
MEF
实例,
MEF
实例,
MEF
实例,
MEF
实例,
MEF
实例,
MEF
实例
MEF
10.2.pdf
这是目前metro ethernet 技术最权威的标准met,该文档是
mef
10.2
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章