構建可擴充套件的應用程式時,介面是中心,可使用基類代替介面,但介面通常是首選,因為它允許開發人員選擇
自己的基類,本文主要通過一個示例來討論無縫載入和使用別人建立的型別
一,步驟
1.建立一個“宿主SDK”程式集,它定義了一個介面,介面的方法作為宿主應用程式與載入項之間的通訊機制使用。
2.載入項開發人員在自己的載入項程式集中定義自己的型別
3.建立一個單獨的“宿主應用程式”
二,例項
0.程式碼結構
1.Wintellect.HostSDK程式碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Wintellect.HostSDK { public interface IAddIn { void Print(); } }
2.AddInTypes程式碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Wintellect.HostSDK; namespace AddInTypes { public class AddIn_A:IAddIn { public void Print() { Console.WriteLine("呼叫物件為:"+this.ToString()); } public override string ToString() { return "AddInTypes程式集中的AddIn_A類中的Print方法"; } } public class AddIn_B : IAddIn { public void Print() { Console.WriteLine("呼叫物件為:" + this.ToString()); } public override string ToString() { return "AddInTypes程式集中的AddIn_B類中的Print方法"; } } }
3.WintellectInvokeTest程式碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.IO; using Wintellect.HostSDK; namespace WintellectInvokeTest { class Program { static void Main(string[] args) { Assembly TempAssemly = null; IAddIn TempIAddIn = null; List<Type> TargetTypes = new List<Type>(); String AddInDir = GetCurrentDirectory(); String[] AddInAssemblies = Directory.GetFiles(AddInDir, "*.dll"); foreach (String aia in AddInAssemblies) { TempAssemly = Assembly.LoadFrom(aia); foreach (Type t in TempAssemly.GetExportedTypes()) { if (t.IsClass && typeof(IAddIn).IsAssignableFrom(t)) { TargetTypes.Add(t); } } } foreach (Type t in TargetTypes) { TempIAddIn = (IAddIn)Activator.CreateInstance(t); TempIAddIn.Print(); } Console.Read(); } private static String GetCurrentDirectory() { return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); } } }
備註:1.引用關係:AddInTypes和WintellectInvokeTest引用Wintellect.HostSDK
2.執行WintellectInvokeTest前,請將AddInTypes.dll複製到WintellectInvokeTest的Debuge目錄下即可
3.程式碼過於簡單,不做細講