• 设计支持加载项的应用程序


         构建可扩展的应用程序时,接口是中心,可使用基类代替接口,但接口通常是首选,因为它允许开发人员选择

     自己的基类,本文主要通过一个示例来讨论无缝加载和使用别人创建的类型

     一,步骤

          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();
        }
    }
    Wintellect.HostSDK

             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方法";
            }
        }
    }
    AddInTypes

             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);
            }
        }
    }
    WintellectInvokeTest

             备注:1.引用关系:AddInTypes和WintellectInvokeTest引用Wintellect.HostSDK

                     2.运行WintellectInvokeTest前,请将AddInTypes.dll复制到WintellectInvokeTest的Debuge目录下即可

                     3.代码过于简单,不做细讲

  • 相关阅读:
    通过user-agent判断h5页面是在哪个手机App(QQ、微信、支付宝)下打开的
    vscode格式化插件
    简单直接,“NODE_ENV”总结
    NativeScript又一个Hybrid技术(附与Weex,ReactNative比较)
    ReactNative开发中遇到的问题记录
    两个在线编辑网站runjs和jsbin
    go 如何单测
    go语法-type等
    go语法-结构体和接口-细节
    解决 Webstorm 每次更新 Git 代码都要输入密码的问题
  • 原文地址:https://www.cnblogs.com/liangjie/p/3204561.html
Copyright © 2020-2023  润新知