以下是构建插件程序集的步骤和代码:
1,编写HostSDK程序集,构造接口IAddId:在控制台应用程序中,通过创建类库,HOstSDK.cs,生成后在bin文件夹有经编译后生成的HOstSDK.dll
namespace HostSDK
{
public interface IAddId
{
String DoSomething(string x);
}
}
2编写AddInTypes.dll程序集,实现公共接口类型,需要引用HOstSDK.dll程序集
1 namespace AddInTypes 2 { 3 public sealed class AddIn_A:IAddId 4 { 5 public AddIn_A() { 6 } 7 public String DoSomething(string x) 8 { 9 return "AddIn_A:" + x; 10 } 11 } 12 public sealed class AddIn_B : IAddId 13 { 14 public AddIn_B() 15 { 16 } 17 public String DoSomething(string x) 18 { 19 return "AddIn_B:" + x+"您好!"; 20 } 21 } 22 }
3,最后编译一个Host.exe应用程序,需要引用HostSDK.dll程序集.为了发现插件类型,假定以.dll扩展名结尾的程序集为我们搜索目标.并将程序集部署在Host.exe文件相同的目录下(拷贝HostSDk类库中bin文件夹生成的HostSDK.dl到Host的bin目录下l)
1 namespace ConsoleApplication1 2 { 3 static class Program 4 { 5 public static void Main(string[] args) 6 { 7 ///设计支持插件的应用程序 8 //查找Host.exe所在目录 9 String AddInDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 10 //假设插件程序集与宿主执行文件在一个目录 11 String[] AddInAssemblies = Directory.GetFiles(AddInDir, "*.dll"); 12 //创建一个可用的插件类型集合 13 List<Type> AddInTypes = new List<Type>(); 14 //加载程序集,并查看那个类型宿主可用 15 foreach (String file in AddInAssemblies) 16 { 17 Assembly AddInAssembly = Assembly.LoadFrom(file); 18 19 //检查每个公开导出类型 20 foreach (Type t in AddInAssembly.GetExportedTypes()) 21 { 22 //如果类型实现是实现插件接口,那么类型就对宿主可用 23 if (t.IsClass && typeof(IAddId).IsAssignableFrom(t)) 24 { 25 AddInTypes.Add(t); 26 } 27 } 28 } 29 //初始化完成,宿主已经发现可用插件,下面示范宿主如何构建插件对象并使用他们 30 foreach (Type t in AddInTypes) 31 { 32 IAddId ai = (IAddId)Activator.CreateInstance(t); 33 Console.WriteLine(ai.DoSomething("王浩")); 34 } 35 Console.Read(); 36 37 }
4,运行结果:
5,如果我们 Console.WriteLine(ai.DoSomething(5));那么仅仅在AddInTypes中修改Public String DoSomething(int x);是不够的.这时需要修改AddInTypes.dll中的版本号,才能达到预期效果