日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个简单的插件框架示例

發(fā)布時(shí)間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个简单的插件框架示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

閑言不講,直接上代碼,如下三個(gè)文件,分屬三個(gè)項(xiàng)目。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Lifetime;
using System.Text;
using Contract;
namespace Application
{
??? class Program
??? {
??????? /// <summary>??
??????? /// 構(gòu)建一個(gè)AppDomainSetup實(shí)例??
??????? /// 用于啟用卷影復(fù)制并設(shè)置基本路徑??
??????? /// </summary>??
??????? public static AppDomainSetup CreateAppDomainSetup()
??????? {
??????????? AppDomainSetup setup = new AppDomainSetup();
??????????? setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
??????????? setup.ShadowCopyFiles = "true";
??????????? return setup;
??????? }


??????? /// <summary>??
??????? /// 從當(dāng)前目錄下的指定的程序集文件中加載指定的類型??
??????? /// </summary>??
??????? public static object CreateAndUnwrap(AppDomain appDomain, string assemblyFile, string typeName)
??????? {
??????????? string fullName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, assemblyFile);
??????????? return appDomain.CreateInstanceFromAndUnwrap(fullName, typeName);
??????? }


??????? static void Main()
??????? {
??????????? Console.WriteLine("Current AppDomain:{0}",
??????????????? AppDomain.CurrentDomain.FriendlyName);


??????????? AppDomainSetup setup = CreateAppDomainSetup();

??????????? //建立準(zhǔn)備加載插件的AppDomain??
??????????? AppDomain secAppDomain = AppDomain.CreateDomain("SecAppDomain", null, setup);


??????????? //忽略新建立的AppDomain里面的調(diào)用租約管理??
??????????? secAppDomain.DoCallBack(delegate
??????????? {
??????????????? LifetimeServices.LeaseTime = TimeSpan.Zero;
??????????? });

??????????? IAddin addinOne = (IAddin)CreateAndUnwrap(
?????????????????????????????????????????? secAppDomain, "Implement.dll", "Implement.AddinOne");

??????????? Console.WriteLine(addinOne.Run("Test"));


??????????? //卸載裝入插件的AppDomain??
??????????? AppDomain.Unload(secAppDomain);

??????????? //由于插件所在的AppDmain已被卸載,所以以下的執(zhí)行會(huì)出現(xiàn)異常??
??????????? try
??????????? {
??????????????? Console.WriteLine(addinOne.Run("Test"));
??????????? }
??????????? catch (Exception ex)
??????????? {
??????????????? Console.WriteLine("發(fā)生調(diào)用異常:" + ex.Message);
??????????? }

??????????? Console.ReadLine();
??????? }
??? }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Contract
{

??????? public interface IAddin
??????? {
??????????? string Run(string paramString);
??????? }


}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Contract;
namespace Implement
{
??
?
?
??? public class AddinOne:MarshalByRefObject,IAddin??
??? {??
??????? public string Run(string paramString)??
??????? {??
??????????? const string resultString =??
??????????????? "Current AppDomain:{0},Param String:{1}!";??
?
??????????? return string.Format(??
??????????????? resultString,??
??????????????? AppDomain.CurrentDomain.FriendlyName,??
??????????????? paramString);??
??????? }??
??? }??
?

}


???

總結(jié)

以上是生活随笔為你收集整理的一个简单的插件框架示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。