设计支持加载项的应用程序
构建可扩展的应用程序时,接口是中心,可使用基类代替接口,但接口通常是首选,因为它允许开发人员选择
自己的基类,本文主要通过一个示例来讨论无缝加载和使用别人创建的类型
一,步骤
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.代码过于简单,不做细讲