.NET Framework 讓開發者輕鬆整合第三方組件,但若在建置時不知所需組件 (如增益集案例),動態擴充便成挑戰。CLR 團隊在 Visual Studio「Orcas」 (VS 2008) 引入 System.AddIn 命名空間,提供完整的受控增益集模型,解決發現、啟動、隔離、安全性、生命週期管理與版本相容等核心難題。本系列分兩期探討:本期著重初版應用程式加入擴充性的挑戰與 API 如何簡化工作;下期探討宿主升級時如何保持舊增益集相容。
宿主定義物件模型後,與增益集互動經歷:
以計算機範例,宿主視圖為抽象基類:
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 等多載,利於效能調校與分組管理。
宿主可隨時關閉增益集:
AddInController.GetAddInController(calculator).Shutdown();
模型同時支援類 GC 行為:釋放參考即可讓增益集自然回收。底層結合參考計數與遠端服務實現。
增益集開發者只需:
[AddIn("Name", Version="1.0.0.0")] 屬性描述增益集。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 增益集團隊部落格。