動態連結庫(DLL)
一、 動態連結庫概述:
什麼是動態連結庫?DLL三個字母是Dynamic Link Library 的縮寫形式,動態連結庫 (DLL) 是作為共享函式庫的可執行檔案。動態連結提供了一種方法,使程式可以呼叫不屬於其可執行程式碼的函式。函式的可執行程式碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結並與使用它們的程式分開儲存的函式。DLL 還有助於共享資料和資源。多個應用程式可同時訪問記憶體中單個 DLL 副本的內容。
和大多數程式設計師一樣,你一定很使用過DLL吧。也曾感受到它的帶給你程式設計和編碼上的好處吧!今天這裡探討一個主題:如何在C#建立和呼叫DLL(動態連結庫), 其實在很大意義上而講,DLL讓我更靈活的組織編寫我們的應用程式,作為軟體設計者,可一個根據它來達到很高的程式碼重用效果。下面我來介紹一下在C#中如何建立和呼叫DLL。
二、準備工作
我們需要對我們接下來要做的事情做個簡單的介紹,在本文我們將利用C#語言建立一個名為 MyDLL.DLL的動態連結庫,在這個動態連結庫檔案中我們將提供兩個功能一個是對兩個引數交換他們的值,另一個功能是求兩個引數的最大公約數。然後建立一個應用程式使用這個DLL。執行並輸出結果。
三、建立DLL
讓我們建立以下三個C#程式碼檔案:
1、 MySwap.cs
using System;
namespace MyMethods {
public class SwapClass {
public static bool Swap(ref long i,ref long j) {
i = i+j;
j = i-j;
i = i-j;
return true;
}
}
}
2、MyMaxCD.cs
using System;
namespace MyMethods {
public class MaxCDClass {
public static long MaxCD(long i, long j) {
long a,b,temp;
if(i>j) {
a = i; b = j;
} else {
b = i; a = j;
}
temp = a % b;
while(temp!=0) {
a = b;
b = temp;
temp = a % b;
}
return b;
}
}
}
需要注意的是:我們在製作這兩個檔案的時候可以用Visual Studio.NET或者其他的文字編輯器,就算是記事本也可以。這兩個檔案雖然不在同一個檔案裡面,但是他們是屬於同一個namespace(名稱空間)這對以後我們使用這兩個方法提供了方便。當然他們也可以屬於不同的名稱空間,這是完全可以的,但只是在我們應用他們的時候就需要引用兩個不同的名稱空間,所以作者建議還是寫在一個名稱空間下面比較好。
接下來的任務是把這兩個cs檔案變成我們需要的DLL檔案。
方法是這樣的:
在安裝了Microsoft.NET Framework的作業系統上,我們可以在Windows所在目錄下找到Microsoft.NET目錄。
在這個目錄下面提供了C#的編譯器,CSC.EXE執行:
csc /target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.cs,
完成後可在本目錄下面找到我們剛才生成的MyDLL.DLL檔案/target:library 編譯器選項通知編譯器輸出 DLL 檔案而不是 EXE 檔案。
後跟檔名的 /out 編譯器選項用於指定 DLL 檔名。
如果/out後面不跟檔名編譯器使用第一個檔案 (MySwap.cs) 作為 DLL 檔名。生成的檔案為MySwap.DLL檔案。
OK!我們建立動態連結庫檔案的任務完成了,現在是我們享受勞動成果的時候了,下面我將介紹如何使用我們所建立的動態連結庫檔案。
四、使用DLL
我們簡單寫一個小程式來測試一下我們剛才寫的兩個方法是否正確:
MyClient.cs程式碼如下:
using System;
using MyMethods; //這裡我們引用剛才定義的名稱空間,如果剛才的兩個檔案我們寫在兩個不同的名稱空間
class MyClient {
public static void Main(string[] args) {
if (args.Length != 2) {
Console.WriteLine("Usage: MyClient <num1><num2>");
return;
}
long num1 = long.Parse(args[0]);
long num2 = long.Parse(args[1]);
SwapClass.Swap(ref num1,ref num2); // 請注意,檔案開頭的 using 指令使您得以在編譯時使用未限定的類名來引用 DLL 方法
Console.WriteLine("The result of swap is num1 = {0} and num2 ={1}",num1, num2);
long maxcd = MaxCDClass.MaxCD(num1,num2);
Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1, num2, maxcd); } }
若要生成可執行檔案 MyClient.exe,請使用以下命令列:
csc /out:MyClient.exe /reference:MyDLL.DLL MyClient.cs
/out 編譯器選項通知編譯器輸出 EXE 檔案並且指定輸出檔名 (MyClient.exe)。
/reference 編譯器選項指定該程式所引用的 DLL 檔案。
五、執行
若要執行程式,請輸入 EXE 檔案的名稱,檔名的後面跟兩個數字,例如:MyClient 123 456
六、輸出
The result of swap is num1 = 456 and num2 = 123 The MaxCD of 456 and 123 is 3
七、小結:
動態連結具有下列優點:
1、節省記憶體和減少交換操作。很多程式可以同時使用一個 DLL,在記憶體中共享該 DLL 的一個副本。相反,對於每個用靜態連結庫生成的應用程式,Windows 必須在記憶體中載入庫程式碼的一個副本。
2、節省磁碟空間。許多應用程式可在磁碟上共享 DLL 的一個副本。相反,每個用靜態連結庫生成的應用程式均具有作為單獨的副本連結到其可執行影象中的庫程式碼。
3、升級到 DLL 更為容易。DLL 中的函式更改時,只要函式的引數和返回值沒有更改,就不需重新編譯或重新連結使用它們的應用程式。相反,靜態連結的物件程式碼要求在函式更改時重新連結應用程式。
4、提供售後支援。例如,可修改顯示器驅動程式 DLL 以支援當初交付應用程式時不可用的顯示器。
5、支援多語言程式。只要程式遵循函式的呼叫約定,用不同程式語言編寫的程式就可以呼叫相同的 DLL 函式。程式與 DLL 函式在下列方面必須是相容的:函式期望其引數被推送到堆疊上的順序,是函式還是應用程式負責清理堆疊,以及暫存器中是否傳遞了任何引數。
6、提供了擴充套件 MFC 庫類的機制。可以從現有 MFC 類派生類,並將它們放到 MFC 擴充套件 DLL 中供 MFC 應用程式使用。
7、使國際版本的建立輕鬆完成。通過將資源放到 DLL 中,建立應用程式的國際版本變得容易得多。可將用於應用程式的每個語言版本的字串放到單獨的 DLL 資原始檔中,並使不同的語言版本載入合適的資源。使用 DLL 的一個潛在缺點是應用程式不是獨立的;它取決於是否存在單獨的 DLL 模組。
相關文章
- 動態連結庫(DLL)的建立和使用
- P/Invoke之C#呼叫動態連結庫DLLC#
- IIS無法訪問動態連結庫DLL的原因
- lua——alien庫實現lua呼叫C動態連結庫(dll、so)
- 動態連結庫與靜態連結庫
- cmake 連結動態連結庫
- DLL動態庫動態載入
- windows和linux gcc生成動態連結庫DLL和SO並用python呼叫WindowsLinuxGCPython
- Windows環境下,動態連結庫(DLL)的“匯入”與“匯出”概念Windows
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- 【連結 1】與靜態連結庫連結
- VS中呼叫DLL動態庫的方法
- 載入動態連結庫——dlopen dlsym dlclose
- C#呼叫C++動態連結庫C#C++
- 動態連結庫的生成和使用(二)
- C++呼叫C#的動態庫dllC++C#
- 如何連結兩個名字一樣動態庫
- 封裝動態庫dll與靜態庫lib(原理及簡單例項)封裝單例
- 在 Linux中如何使用動態連結模組庫?Linux
- 靜態連結動態連結的連結順序問題和makefile示例
- 使用js動態新增連結隨機連結JS隨機
- Gazebo新增模型並控制模型運動作為動態障礙物(Ubuntu16.04, Gazebo7.16),附錄動態連結庫和靜態連結庫區別模型Ubuntu
- 動態連結的相關結構
- 編譯 pyav 成 wheel 並使用 auditwheel 固化動態連結庫編譯
- JNI呼叫c動態連結庫函式程式碼實踐函式
- [pwn基礎]動態連結原理
- 動態連結的PLT與GOTGo
- 用動態連結動態洩露system地址並利用
- FFmpeg開發筆記(四)FFmpeg的動態連結庫介紹筆記
- 【技術向】Linux動態連結庫預載入型後門Linux
- Linux環境下:程式的連結, 裝載和庫[靜態連結]Linux
- 關於動態連結串列的理解
- 動態連結串列的建立(程式碼)
- 安卓動態連結庫檔案體積最佳化探索實踐安卓
- 動態連結的步驟與實現
- C編譯: 動態連線庫 (.so檔案)編譯
- jQuery動態修改連結的href屬性值jQuery
- 靜態庫與動態庫
- gcc庫連結GC