如何利用C 建立和呼叫DLL 轉)

2022-04-20 17:56:27 字數 4013 閱讀 4662

一、寫在前面

c# 語言是一種簡單但功能強大的程式語言,用於編寫企業應用程式。

c# 語言從c和 c++語言演化而來,在語句、表示式和運算子方面使用了許多 c++ 功能。

c# 語言在型別安全性、版本轉換、事件和垃圾**等方面進行了相當大的改進和創新。

c# 語言提供對常用 api 樣式(如 .net 框架、com、自動化和 c 樣式 api 等)的訪問。

什麼是動態鏈結庫?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 ");

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 = and num2 =",num1, num2);

long maxcd = maxcdclass.maxcd(num1,num2);

console.writeline("the maxcd of and is ",num1, num2, maxcd);

若要生成可執行檔案 myclient.exe,請使用以下命令列:

csc /out:myclient.exe /reference:mylibrary.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

七、小結

節省記憶體和減少交換操作。很多程序可以同時使用乙個 dll,在記憶體中共享該 dll 的乙個副本。相反,對於每個用靜態鏈結庫生成的應用程式,windows 必須在記憶體中載入庫**的乙個副本。

節省磁碟空間。許多應用程式可在磁碟上共享 dll 的乙個副本。相反,每個用靜態鏈結庫生成的應用程式均具有作為單獨的副本鏈結到其可執行影象中的庫**。

公升級到 dll 更為容易。dll 中的函式更改時,只要函式的引數和返回值沒有更改,就不需重新編譯或重新鏈結使用它們的應用程式。相反,靜態鏈結的物件**要求在函式更改時重新鏈結應用程式。

提供售後支援。例如,可修改顯示器驅動程式 dll 以支援當初交付應用程式時不可用的顯示器。

支援多語言程式。只要程式遵循函式的呼叫約定,用不同程式語言編寫的程式就可以呼叫相同的 dll 函式。程式與 dll 函式在下列方面必須是相容的:函式期望其引數被推送到堆疊上的順序,是函式還是應用程式負責清理堆疊,以及暫存器中是否傳遞了任何引數。

提供了擴充套件 mfc 庫類的機制。可以從現有 mfc 類派生類,並將它們放到 mfc 擴充套件 dll 中供 mfc 應用程式使用。

使國際版本的建立輕鬆完成。通過將資源放到 dll 中,建立應用程式的國際版本變得容易得多。可將用於應用程式的每個語言版本的字串放到單獨的 dll 資源檔案中,並使不同的語言版本載入合適的資源。

使用 dll 的乙個潛在缺點是應用程式不是獨立的;它取決於是否存在單獨的 dll 模組。

使用vs2008的朋友,可以在新建程式時,新建乙個類庫程式;然後編寫、新建所需的類——>右擊類庫專案——>點選生成即可

——>生成的dll檔案已在相應的bin\debug\*.dll 中

C 如何建立和呼叫DLL

c 如何建立和呼叫dll 載 一 寫在前面 c 語言是一種簡單但功能強大的程式語言,用於編寫企業應用程式。c 語言從c和 c 語言演化而來,在語句 表示式和運算子方面使用了許多 c 功能。c 語言在型別安全性 版本轉換 事件和垃圾 等方面進行了相當大的改進和創新。c 語言提供對常用 api 樣式 如...

C 中建立和使用dll

c 中建立和使用dll比c 中方便多了!c 中沒有了c 中的.h標頭檔案,確實省了很多麻煩。建立乙個dll using system using system.collections.generic using system.text namespace classlibrary1 非常簡單地就建立...

C 中dll的建立和使用

一 dll的建立 1 新建專案類庫 2 編寫需要使用的函式 using system using system.collections.generic using system.linq using system.text using system.threading.tasks using sys...