設計支援載入項的應用程式

發表於2013-07-22

     構建可擴充套件的應用程式時,介面是中心,可使用基類代替介面,但介面通常是首選,因為它允許開發人員選擇

 自己的基類,本文主要通過一個示例來討論無縫載入和使用別人建立的型別

 一,步驟

      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.程式碼過於簡單,不做細講

相關文章