国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET實現熱插拔功能(動態替換功用)方案實例

2024-07-10 13:14:53
字體:
來源:轉載
供稿:網友

幾種方案

1 腳本化:采用 Iron 或 集成其它腳本引擎。
2 AppDomain:微軟的 Add In 框架就是為這個目的設計的。
3 分布式 + 負載平衡 :輪流更新集群中的服務器
4 Assembly.LoadFrom + 強簽名程序集:因為相同標識的程序集在內存中只會加載一次,所以每次功能發生變化,都要增加程序集的版本號。
5 Assembly.Load +  + 強簽名程序集 + GAC:因為相同標識的程序集在內存中只會加載一次,所以每次功能發生變化,都要增加程序集的版本號。
6 Assembly.LoadFile:Assembly.LoadFile 可以多次加載相同標識的程序集,只要程序集所在的目錄位置不同。

重點說一下 Assembly.LoadFile

.NET實現熱插拔功能(動態替換功用)方案實例

測試代碼

復制代碼 代碼如下:


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);
        }
    }
}



.NET實現熱插拔功能(動態替換功用)方案實例

說明
調用 Type.GetType 會導致 CLR 執行程序集探測過程,在正常的探測路徑下沒有找到程序集就會觸發 AssemblyResolve 事件,為啥會觸發兩次呢?我還不知道。

微軟不推薦使用 LoadFile(會加載相同標識的程序集多次),Add In 采用的是 AppDomain,MEF 采用的是 LoadFrom。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泸水县| 四子王旗| 柯坪县| 沧源| 忻城县| 车险| 宾川县| 乌拉特前旗| 陆良县| 徐州市| 比如县| 图片| 屏东市| 紫阳县| 织金县| 隆回县| 临沧市| 凤庆县| 安义县| 邢台市| 娱乐| 宜丰县| 新丰县| 定陶县| 来凤县| 临清市| 霸州市| 南岸区| 吴江市| 张掖市| 西畴县| 苏州市| 蓬莱市| 霍城县| 巴东县| 清丰县| 巨鹿县| 犍为县| 嘉兴市| 西林县| 阳城县|