天天看點

c#中如何利用反射動态加載程式集

首先,建立一個類庫,生成一個dll檔案,内部代碼如下:

using System;

namespace ClassLibrary3
{
    public class Class1
    {

        public int Add(int x,int y)
        {
            return x + y;
        }
    }
}
           

生成出一個ClassLibrary3.dll 檔案,将這個檔案複制進入項目生成的exe檔案的同一個檔案夾下,然後使用下面代碼加載動态加載dll:

using System;
using System.Reflection;
namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly as1 = Assembly.LoadFrom("ClassLibrary3.dll");
            Type t = as1.GetType("ClassLibrary3.Class1");
            MethodInfo[] msi = t.GetMethods();
            Console.Write( msi[0].Invoke(Activator.CreateInstance(t), new object[] { 1, 2 }));
            Console.ReadKey();

        }
    }
}
           

輸出結果為:3。在這裡需要注意的一點是,如果類Class1有命名空間的話,那麼需要加上命名空間,這點在之前的反射的文章中已經指出過,在這邊再強調一下。

還有一點有些同學分不清namespace和dll的差別,其實程式集和命名空間實際上沒有什麼關系。程式集是.NET中相關類型的實體組織形式,有點類似于Windows的可執行檔案或者動态連結庫檔案。命名空間僅僅隻是為了解決類名稱的沖突問題而提供的給類“分類”的系統。一個程式集可以包含多個命名空間,而一個命名空間也可以跨多個程式集。