社区
C#
帖子详情
MEF热更新生效问题
LIZHIztt
2017-02-17 05:14:00
发帖问过此类问题,按照P哥的思路,MEF进行热更新是没有问题的,但是现在遇到的问题是插件加载时将插件复制到缓存目录加载,加载完成后,原目录内dll更新之后,重新将新插件复制到新缓存目录加载,但是依旧是执行原先插件,如果插件目录里添加新插件,重新加载之后新插件生效,之前加载过的插件依旧未更新,只有重启软件后才会更新。
...全文
188
10
打赏
收藏
MEF热更新生效问题
发帖问过此类问题,按照P哥的思路,MEF进行热更新是没有问题的,但是现在遇到的问题是插件加载时将插件复制到缓存目录加载,加载完成后,原目录内dll更新之后,重新将新插件复制到新缓存目录加载,但是依旧是执行原先插件,如果插件目录里添加新插件,重新加载之后新插件生效,之前加载过的插件依旧未更新,只有重启软件后才会更新。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
你中间把加载目录名搞错了吧?
c#语言为什么不可以直接进行热更
虽然C#和.NET平台在某些情况下支持
热更新
,但直接进行
热更新
仍然面临许多挑战,包括类型安全、状态管理、编译和链接的限制等。为了实现
热更新
,通常需要使用特定的框架或工具,并遵循一定的设计模式和最佳实践。
jrebel不能使用ajax,Jrebel不
生效
的原因和解决办法
理解
MEF
1.它解决什么
问题
? 考虑下面的需求,甲程序员对外暴露接口,内部提供实现.乙程序员使用甲提供的接口,根据面向接口编程的原则,乙关联一个接口类型的引用.正常情况下,乙要使用甲的实现,必须实例化一个具体对 ....
MTK SensorDriver 实现机制与动态参数同步:多模态拍摄下的硬件控制与时序管理实战
在联发科平台的影像系统中,SensorDriver ...本文基于实际项目经验,系统解析 MTK SensorDriver 的接口设计、工作机制与调用流程,详细剖析曝光/增益/帧率等动态参数的实时更新机制,以及多 Sensor 协同下的 Master-Sla
网络工程设计教程--系统集成方法
网络工程设计应注意的
问题
网络工程案例教学 1.1 网络工程的基本概念 1.1.1 基本概念 采用TCP/IP体系结构的互联网已经成为企业、国家乃至全球的信息基础设施。设计、建造和测试基于TCP/IP技术的计算机...
springboot底层原理
包路径) 这就是,扫描主配置类所在包 的 bean的 原因 2.Import(AutoConfigurationImportSelector.class) String[] classLoaderGetResource(
MEF
......) springboot-auto-configurauiton包下的
MEF
.......
C#
111,098
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章