程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 在C#中動態調用native dll的導出函數

在C#中動態調用native dll的導出函數

編輯:關於C語言

在 C++ 中我們能夠通過 LoadLibrary,  GetProcAddress 來動態調用 dll 的導出函數.
在 C# 中也能夠用這樣的方式嗎?
在 DotNet 2.0 裡面這樣是可以的, 這完全得益於 2.0新增的一個函數
Marshal.GetDelegateForFunctionPointer 方法
此方法在 .Net Framework 2.0 版中是新增的。

將非托管函數指針轉換為委托。
實例代碼如下:


public delegate int MsgBox(int hwnd,string msg,string cpp,int ok);

        [DllImport("Kernel32")]
        public static extern int GetProcAddress(int handle, String funcname);
        [DllImport("Kernel32")]
        public static extern int LoadLibrary(String funcname);
        [DllImport("Kernel32")]
        public static extern int FreeLibrary(int handle);

        private static Delegate GetAddress(int dllModule, string functionname, Type t)
        {
            int addr = GetProcAddress(dllModule, functionname);
            if (addr == 0)
                return null;
            else
                return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int huser32 = 0;
            huser32 = LoadLibrary("user32.dll");        
            MsgBox mymsg = (MsgBox)GetAddress(huser32, "MessageBoxA", typeof(MsgBox));
            mymsg(this.Handle.ToInt32(), txtmsg.Text, txttitle.Text , 64);
            FreeLibrary(huser32);
        }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved