zoukankan      html  css  js  c++  java
  • 插件式开发

    以下是构建插件程序集的步骤和代码:

    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中的版本号,才能达到预期效果

  • 相关阅读:
    bzoj3996: [TJOI2015]线性代数
    bzoj3319: 黑白树
    bzoj3745: [Coci2015]Norma
    bzoj2437: [Noi2011]兔兔与蛋蛋
    bzoj1110: [POI2007]砝码Odw
    bzoj4919: [Lydsy1706月赛]大根堆
    bzoj5085: 最大
    bzoj2721: [Violet 5]樱花
    Theoretical & Applied Mechanics Letters第2届编委会2015年度第1次全体编委会工作会议纪要(转自力学学会)
    法国石墨烯研究者成功合成二维材料锗烯
  • 原文地址:https://www.cnblogs.com/weiweiboqi/p/11661294.html
Copyright © 2011-2022 走看看