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


很多時候我們需要用到引用其他程序集,有些程序集是.Net生成的,可以支持反編譯,而C/C++程序集不支持反編譯,不能再C#項目中直接引用,我們需要預先知道程序集中函數的簽名,然后先聲明為靜態的函數,例如:

引用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程序集

1、這里需要用到windows的API來加載程序集,先引入API函數,用於加載程序集

        [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
        static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

        [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
        static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName);

        [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
        static extern bool FreeLibrary(int hModule);

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

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

3、得到了函數指針,但是C#不支持指針,但是C#有委托的概念,C#中也是通過委托實現指針函數的功能的,這里也通過委托來引用

  先聲明一個委托

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

  加載,得到委托(Marshal 在 System.Runtime.InteropServices 命名空間)

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

4、使用該委托

        int sum = myadd(10, 20);

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM