首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 深度解析:System.AddIn 打造可擴充應用程式架構

     編輯:關於.NET

.NET Framework 讓開發者輕鬆整合第三方組件,但若在建置時不知所需組件 (如增益集案例),動態擴充便成挑戰。CLR 團隊在 Visual Studio「Orcas」 (VS 2008) 引入 System.AddIn 命名空間,提供完整的受控增益集模型,解決發現、啟動、隔離、安全性、生命週期管理與版本相容等核心難題。本系列分兩期探討:本期著重初版應用程式加入擴充性的挑戰與 API 如何簡化工作;下期探討宿主升級時如何保持舊增益集相容。

關鍵術語

  • 宿主:支援擴充性的應用程式 (Excel、Word、SQL Server 等)。
  • 擴充性:操控宿主物件或延伸宿主功能的機制,透過宿主 SDK 公開的物件模型實現。
  • SDK:一組公用介面與文件,允許宿主與增益集互通服務。
  • 增益集:由宿主動態載入的自訂組件,透過公用 API 延伸宿主功能。
  • 管線:讓宿主與增益集跨版本、跨安全界限通訊的機制,包含「宿主視圖」、「增益集視圖」與「合約」。

建構可擴充宿主:三階段互動

宿主定義物件模型後,與增益集互動經歷:

  1. 發現:尋找可用增益集,提供足夠資訊供選擇,支援智慧型快取。
  2. 啟動:在適當隔離沙箱 (AppDomain) 中載入並啟動增益集,套用權限集 (FullTrust/Intranet/Internet)。
  3. 生命週期管理:維持增益集運作,賦予宿主隨時關閉能力,支援跨 AppDomain 邊界的參考計數與遠端服務。

宿主視圖:定義服務契約

以計算機範例,宿主視圖為抽象基類:

public abstract class Calculator {
    public abstract double Add(double a, double b);
    public abstract double Subtract(double a, double b);
    public abstract double Multiply(double a, double b);
    public abstract double Divide(double a, double b);
}

宿主直接針對此視圖撰寫程式,無需理會隔離細節。

發現增益集

String addInRoot = Environment.CurrentDirectory;
AddInStore.Update(addInRoot);  // 更新快取,偵測新安裝的增益集/管線組件
Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(Calculator), addInRoot);
// tokens 擁有 Name、Version、Publisher、Description 四屬性,尚未載入任何組件
AddInToken calcToken = ChooseCalculator(tokens);  // 讓使用者選擇

啟動與隔離

Calculator calculator = calcToken.Activate<Calculator>(AddInSecurityLevel.Internet);

單行程式碼完成:建立新 AppDomain、載入組件、套用 Internet 權限集、設定 ApplicationBase 與設定檔、掛接管線組件。亦支援自訂權限集、自備 AppDomain 等多載,利於效能調校與分組管理。

圖 1 從發現到啟動的完整流程
圖 1 從發現到啟動的完整流程

生命週期管理

宿主可隨時關閉增益集:

AddInController.GetAddInController(calculator).Shutdown();

模型同時支援類 GC 行為:釋放參考即可讓增益集自然回收。底層結合參考計數與遠端服務實現。

增益集開發:零負擔

增益集開發者只需:

  1. 套用 [AddIn("Name", Version="1.0.0.0")] 屬性描述增益集。
  2. 繼承宿主定義的抽象基類 (如 Calculator) 並實作所有方法。
[AddIn("Sample Calculator AddIn", Version="1.0.0.0")]
public class SampleCalculatorAddIn : Calculator {
    public override double Add(double a, double b) { return a + b; }
    public override double Subtract(double a, double b) { return a - b; }
    public override double Multiply(double a, double b) { return a * b; }
    public override double Divide(double a, double b) { return a / b; }
}

管線程式碼 (遠端、生命週期、安全性) 完全對增益集開發者隱藏。

總結與展望

模型目標:動態組合可隔離組件、跨版本相容、不增加增益集開發難度、簡化宿主工作。下期將深入管線架構與版本演進策略。更多範例與回饋請見 CLR 增益集團隊部落格。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved