VS 中的 lib 和 dll 的區別和使用
引言
在 vs/c# 專案開發中,經常會遇到 lib 和 dll 檔案,而且建立工程專案以及工程專案打包時也是必須要面對的,所以有必要掌握 lib 和 dll 的區別和使用。
什麼是 lib 和 dll
-
一種是 lib 包含了函式所在的 dll檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的 dll 提供,稱為動態連結庫(dynamic link library)。
-
一種是 lib 包含函式程式碼本身,在編譯時直接將程式碼加入程式當中,稱為 lib 靜態連結庫(static link library)。
兩種庫連結方式
- 動態連結使用動態連結庫,允許可執行模組( .dll 檔案或 .exe 檔案 ),僅包含在執行時定位 dll 函式的可執行程式碼所需的資訊
- 靜態連結使用靜態連結庫,連結器從靜態連結庫 LIB 獲取所有被引用函式,並將庫同程式碼一起放到可執行檔案中
lib 和 dll 的使用
lib
c# 不能直接呼叫 lib 庫,需要將其打包為 dll 才能呼叫
dll
將 dll 檔案拷貝到工程 debug 檔案下即可(如果不拷貝,編譯連結不報錯,執行報錯:無法找到***.dll)
工程呼叫 dll 方法舉例
[DllImport("user32.dll", EntryPoint="MessageBoxA")] static extern int MsgBox(int hWnd, string msg, string caption, int type);
lib 與 dll 區別
-
lib 是編譯時用到的,dll 是執行時用到的。如果要完成原始碼的編譯,只需要 lib;如果要使動態連結的程式執行起來,只需要 dll。
-
如果有 dll 檔案,那麼 lib 一般是一些索引資訊,記錄了 dll 中函式的入口和位 置,dll 中是函式的具體內容;如果只有 lib 檔案,那麼這個 lib 檔案是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的 lib 檔案,在執行程式時 不需要再掛動態庫,缺點是導致應用程式比較大,而且失去了動態庫的靈活性,釋出新版本時要釋出新的應用程式才行。
-
動態連結的情況下,有兩個檔案:一個是 LIB 檔案,一個是 DLL 檔案。LIB 包含被 DLL 匯出的函式名稱和位置,DLL 包含實際的函式和資料,應用程式使用 LIB 檔案連結到 DLL 檔案。在應用程式的可執行檔案中,存放的不是被呼叫的函式程式碼,而是 DLL中相應函式程式碼的地址,從而節省了記憶體資源。DLL和LIB檔案必須隨應用程式一起發行,否則應用程式會產生錯誤。如果不想用 lib 檔案或者沒有 lib 檔案,可以用 WIN32 API 函式 LoadLibrary、GetProcAddress 裝載。
-
開發成功後的應用程式在釋出時,只需要有 .exe 檔案和 .dll 檔案,並不需要 .lib 檔案和 .h 標頭檔案