社区
C#
帖子详情
MEF热更新生效问题
LIZHIztt
2017-02-17 05:14:00
发帖问过此类问题,按照P哥的思路,MEF进行热更新是没有问题的,但是现在遇到的问题是插件加载时将插件复制到缓存目录加载,加载完成后,原目录内dll更新之后,重新将新插件复制到新缓存目录加载,但是依旧是执行原先插件,如果插件目录里添加新插件,重新加载之后新插件生效,之前加载过的插件依旧未更新,只有重启软件后才会更新。
...全文
230
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
打赏
举报
回复
你中间把加载目录名搞错了吧?
c#语言为什么不可以直接进行热更
虽然C#和.NET平台在某些情况下支持
热更新
,但直接进行
热更新
仍然面临许多挑战,包括类型安全、状态管理、编译和链接的限制等。为了实现
热更新
,通常需要使用特定的框架或工具,并遵循一定的设计模式和最佳实践。
系统扩展难?C#三大动态加载方案对比,选型不再纠结
解决C#企业系统扩展难题,三大动态加载方案全面对比。涵盖插件化架构、程序集
热更新
与
MEF
组合模式,适用模块化升级、功能热插拔等场景,助你实现灵活可维护的系统扩展,选型不再纠结,值得收藏。
jrebel不能使用ajax,Jrebel不
生效
的原因和解决办法
am335x 电容屏驱动添加。参考:http://www.cnblogs.com/helloworldtoyou/p/5530422.html 上面可以下载驱动. 解压后驱动有如下目录: 我们要选择的是: eGTouchARM/e ...C#winform调用外部程序,等待外部程序执行完毕才执行下面代码1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 Syst...
C#中Log4net日志组件应用实战详解
log4net 是 Apache Logging Services 项目下的一个高性能、轻量级的 .NET 日志框架,广泛应用于企业级 C# 项目中。它支持多种日志输出目标(如文件、数据库、控制台、邮件等),通过灵活的配置实现日志级别控制、格式化输出和自动归档。其核心特性包括:基于插件式的 Appender 扩展机制、层次化日志记录模型(Logger 层级继承)、运行时动态加载配置以及对多线程并发写入的安全保障。
C#组件化扩展实践全记录,手把手教你构建可插拔业务模块
解决C#企业系统扩展难题,手把手实现模块化架构。涵盖插件式开发、依赖注入与热插拔设计,适用于多租户、微服务场景,提升系统灵活性与维护效率。掌握C#企业系统扩展核心实践,值得收藏。
C#
111,131
社区成员
642,542
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章