一直對調用DLL的概念模糊不清,今天先大致掃掃盲。
目前所知道的DLL有兩種調用方法,一種是作為COM組件,註冊後直接引用。
註冊:regsvr32 +檔案路徑+檔案名稱 一般WINDOWS系統都內建有一些的COM庫,可以讓編程者直接使用。但是一些自訂的,尤其是自己封裝的,就必須註冊一下,讓系統認識。
註冊後,直接引用COM組件就可以了。
對於有入口函數的DLL,也可以用直接調用的方法。首先必須將DLL與可執行檔放在一個路徑下。
然後是調用DLL檔案的格式:
基本:
[DLLImport(“DLL檔案”)]
其他選擇性參數:
EntryPoint 表示使用DLL檔案中的某個方法,如:EntryPoint="MessageBoxA"
CharSet 指示用在進入點中的字元集,如:CharSet=CharSet.Ansi;
SetLastError 指示方法是否保留 Win32"上一錯誤",如:SetLastError=true;
ExactSpelling 指示 EntryPoint 是否必須與指示的進入點的拼字完全符合,如:ExactSpelling=false;
PreserveSig指示方法的簽名應當被保留還是被轉換, 如:PreserveSig=true;
CallingConvention指示進入點的呼叫慣例, 如:CallingConvention=CallingConvention.Winapi;
一個完整的DLLImport:
[DllImport("HHPT850.dll", EntryPoint = "MessageBoxA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
引用後,還需要重新封裝為C#能識別的方法:
修飾符 extern 返回變數類型 方法名稱 (參數列表)
完整例子:
[DllImport("HHPT850.dll", EntryPoint = "MessageBoxA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]<br /> public static extern int MsgBox(int hWnd, string msg, string caption, int type);
-----------------------------------------------------------------------------------------------------
對於.NET封裝的DLL,不用註冊成COM組件,也不用DLLImport,直接在引用處引用即可