最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-27 22:40:25
文档

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

.NET实现热插拔功能(动态替换功用)方案实例:几种方案 1 脚本化:采用 Iron 或 集成其它脚本引擎。2 AppDomain:微软的 Add In 框架就是为这个目的设计的。3 分布式 + 负载平衡 :轮流更新集群中的服务器。4 Assembly.LoadFrom + 强签名程序集:因为相同标识的程序集在内存中只会加载一次,所以每次功能
推荐度:
导读.NET实现热插拔功能(动态替换功用)方案实例:几种方案 1 脚本化:采用 Iron 或 集成其它脚本引擎。2 AppDomain:微软的 Add In 框架就是为这个目的设计的。3 分布式 + 负载平衡 :轮流更新集群中的服务器。4 Assembly.LoadFrom + 强签名程序集:因为相同标识的程序集在内存中只会加载一次,所以每次功能


几种方案

1 脚本化:采用 Iron 或 集成其它脚本引擎。
2 AppDomain:微软的 Add In 框架就是为这个目的设计的。
3 分布式 + 负载平衡 :轮流更新集群中的服务器。
4 Assembly.LoadFrom + 强签名程序集:因为相同标识的程序集在内存中只会加载一次,所以每次功能发生变化,都要增加程序集的版本号。
5 Assembly.Load +  + 强签名程序集 + GAC:因为相同标识的程序集在内存中只会加载一次,所以每次功能发生变化,都要增加程序集的版本号。
6 Assembly.LoadFile:Assembly.LoadFile 可以多次加载相同标识的程序集,只要程序集所在的目录位置不同。

重点说一下 Assembly.LoadFile

测试代码

代码如下:
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:\Coding\HappyStudy\LoadContextStudy\Test\bin\Debug\Plugs",
                name.Name,
                name.Version.ToString(),
                name.Name + ".dll");

            Console.WriteLine("加载插件:" + name.Version);

            return Assembly.LoadFile(file);
        }
    }
}

说明
调用 Type.GetType 会导致 CLR 执行程序集探测过程,在正常的探测路径下没有找到程序集就会触发 AssemblyResolve 事件,为啥会触发两次呢?我还不知道。

微软不推荐使用 LoadFile(会加载相同标识的程序集多次),Add In 采用的是 AppDomain,MEF 采用的是 LoadFrom。

文档

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

.NET实现热插拔功能(动态替换功用)方案实例:几种方案 1 脚本化:采用 Iron 或 集成其它脚本引擎。2 AppDomain:微软的 Add In 框架就是为这个目的设计的。3 分布式 + 负载平衡 :轮流更新集群中的服务器。4 Assembly.LoadFrom + 强签名程序集:因为相同标识的程序集在内存中只会加载一次,所以每次功能
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top