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


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

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

     一,步骤

          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.代码过于简单,不做细讲

  • 相关阅读:
    Linux线程信号
    有理想的程序员必须知道的15件事
    Linux下 mplayer 使用手册
    Winxp下 gvim 编程环境搭建
    在WPF中弹出右键菜单时判断鼠标是否选中该项
    F#基本类型——Discriminated Unions
    在WPF的TreeView中实现右键选定
    WPF TreeView tools
    F#基本类型——Structure
    增强了一下DownloaderPlus的视频转换功能
  • 原文地址:https://www.cnblogs.com/liangjie/p/3204561.html
Copyright © 2020-2023  润新知