【C#】動態加載dll程序集

原文:http://www.cnblogs.com/bomo/archive/2013/03/01/2938165.htmlhtml

不少時候咱們須要用到引用其餘程序集,有些程序集是.Net生成的,能夠支持反編譯,而C/C++程序集不支持反編譯,不能再C#項目中直接引用,咱們須要預先知道程序集中函數的簽名,而後先聲明爲靜態的函數,例如:windows

引用test.dll,該程序集包含Add方法,返回兩個整型數據的和函數

        [DllImport(@"c:\test.dll")]
        private static extern int Add(int a, int b);

而後再須要的時候使用指針

        private void DoSomething()
        {
            int sum = Add(10, 20);
        }

可是這種方法不能改變函數的名字,下面說說如何動態添加dll程序集code

一、這裏須要用到windows的API來加載程序集,先引入API函數,用於加載程序集htm

按 Ctrl+C 複製代碼
按 Ctrl+C 複製代碼

二、接下來是在代碼中加載程序集,獲得函數指針blog

        int hModule = LoadLibrary(@"c:\test.dll");
        if (hModule == 0) 
            return false;
        //獲得指向Add函數的指針
        IntPtr intPtr = GetProcAddress(hModule, "Add");

三、獲得了函數指針,可是C#不支持指針,可是C#有委託的概念,C#中也是經過委託實現指針函數的功能的,這裏也經過委託來引用io

  先聲明一個委託編譯

        public delegate void MyAdd(int a, int b);

  加載,獲得委託(Marshal 在 System.Runtime.InteropServices 命名空間)class

        MyAdd myadd = (MyAdd)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(MyAdd));

四、使用該委託

        int sum = myadd(10, 20);
相關文章
相關標籤/搜索