源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

.NET实现热插拔功能(动态替换功用)方案实例

  • 时间:2021-01-18 21:53 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:.NET实现热插拔功能(动态替换功用)方案实例
[b]几种方案[/b] 1 脚本化:采用 Iron 或 集成其它脚本引擎。 2 AppDomain:微软的 Add In 框架就是为这个目的设计的。 3 分布式 + 负载平衡 :轮流更新集群中的服务器。 4 Assembly.LoadFrom + 强签名程序集:因为相同标识的程序集在内存中只会加载一次,所以每次功能发生变化,都要增加程序集的版本号。 5 Assembly.Load +  + 强签名程序集 + GAC:因为相同标识的程序集在内存中只会加载一次,所以每次功能发生变化,都要增加程序集的版本号。 6 Assembly.LoadFile:Assembly.LoadFile 可以多次加载相同标识的程序集,只要程序集所在的目录位置不同。 [b]重点说一下 Assembly.LoadFile [img]http://img.1sucai.cn/uploads/article/2018010710/20180107100135_0_77943.jpg?2013102594859[/img] [/b] [b]测试代码[/b]
[u]复制代码[/u] 代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.IO; using Contracts; namespace Test {     class Program     {         static void Main(string[] args)         {             SetupPlugEnvironment();             ExecuteOperator("1.0.0.0");             ExecuteOperator("2.0.0.0");         }         private static void ExecuteOperator(string version)         {             var operatorType = Type.GetType("Implements.Operator, Implements, version = " + version + "");             var operatorInstance = Activator.CreateInstance(operatorType) as IOperator;             operatorInstance.Operate();         }         private static void SetupPlugEnvironment()         {             AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;         }         static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)         {             AssemblyName name = new AssemblyName(args.Name);             var file = Path.Combine(                 @"E:CodingHappyStudyLoadContextStudyTestbinDebugPlugs",                 name.Name,                 name.Version.ToString(),                 name.Name + ".dll");             Console.WriteLine("加载插件:" + name.Version);             return Assembly.LoadFile(file);         }     } }
[img]http://img.1sucai.cn/uploads/article/2018010710/20180107100135_1_68467.jpg?2013102594924[/img] 说明 调用 Type.GetType 会导致 CLR 执行程序集探测过程,在正常的探测路径下没有找到程序集就会触发 AssemblyResolve 事件,为啥会触发两次呢?我还不知道。 微软不推荐使用 LoadFile(会加载相同标识的程序集多次),Add In 采用的是 AppDomain,MEF 采用的是 LoadFrom。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部