明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

如何使用C#創(chuàng)建與調(diào)用DLL

[摘要]一、寫在前面C# 語(yǔ)言是一種簡(jiǎn)單但功能強(qiáng)大的編程語(yǔ)言,用于編寫企業(yè)應(yīng)用程序。 C# 語(yǔ)言從C和 C++語(yǔ)言演化而來(lái),在語(yǔ)句、表達(dá)式和運(yùn)算符方面使用了許多 C++ 功能。C# 語(yǔ)言在類型安全性、版本轉(zhuǎn)換、事件和垃圾回收等方面進(jìn)行了相當(dāng)大的改進(jìn)和創(chuàng)新。C# 語(yǔ)言提供對(duì)常用 API 樣式(如 .NET ...

一、寫在前面
C# 語(yǔ)言是一種簡(jiǎn)單但功能強(qiáng)大的編程語(yǔ)言,用于編寫企業(yè)應(yīng)用程序。

C# 語(yǔ)言從C和 C++語(yǔ)言演化而來(lái),在語(yǔ)句、表達(dá)式和運(yùn)算符方面使用了許多 C++ 功能。

C# 語(yǔ)言在類型安全性、版本轉(zhuǎn)換、事件和垃圾回收等方面進(jìn)行了相當(dāng)大的改進(jìn)和創(chuàng)新。

C# 語(yǔ)言提供對(duì)常用 API 樣式(如 .NET 框架、COM、自動(dòng)化和 C 樣式 API 等)的訪問(wèn)。

       什么是動(dòng)態(tài)鏈接庫(kù)?DLL三個(gè)字母對(duì)于你來(lái)說(shuō)一定很熟悉吧,它是Dynamic Link Library 的縮寫形式,動(dòng)態(tài)鏈接庫(kù) (DLL) 是作為共享函數(shù)庫(kù)的可執(zhí)行文件。動(dòng)態(tài)鏈接提供了一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個(gè) DLL 中,該 DLL 包含一個(gè)或多個(gè)已被編譯、鏈接并與使用它們的進(jìn)程分開(kāi)存儲(chǔ)的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個(gè)應(yīng)用程序可同時(shí)訪問(wèn)內(nèi)存中單個(gè) DLL 副本的內(nèi)容。

和大多數(shù)程序員一樣,你一定很使用過(guò)DLL吧。也曾感受到它的帶給你程序設(shè)計(jì)和編碼上的好錯(cuò)吧今天我想和大家探討一個(gè)主題:如何在C#創(chuàng)建和調(diào)用DLL(動(dòng)態(tài)鏈接庫(kù)), 其實(shí)在很大意義上而講,DLL讓我更靈活的組織編寫我們的應(yīng)用程序,作為軟件設(shè)計(jì)者,可一個(gè)根據(jù)它來(lái)達(dá)到很高的代碼重用效果。下面我來(lái)介紹一下在C#中如何創(chuàng)建和調(diào)用DLL。

 

二、準(zhǔn)備工作

 

我們需要對(duì)我們接下來(lái)要做的事情做個(gè)簡(jiǎn)單的介紹,在本文我們將利用C#語(yǔ)言創(chuàng)建一個(gè)名為 MyDLL.DLL的動(dòng)態(tài)鏈接庫(kù),在這個(gè)動(dòng)態(tài)鏈接庫(kù)文件中我們將提供兩個(gè)功能一個(gè)是對(duì)兩個(gè)參數(shù)交換他們的值,另一個(gè)功能是求兩個(gè)參數(shù)的最大公約數(shù)。然后創(chuàng)建一個(gè)應(yīng)用程序使用這個(gè)DLL。運(yùn)行并輸出結(jié)果。

 

三、創(chuàng)建DLL

 

讓我們創(chuàng)建以下三個(gè)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;

          }

     }

}

}需要注意的是:我們?cè)谥谱鬟@兩個(gè)文件的時(shí)候可以用Visual Studio.NET或者其他的文本編輯器,就算是記事本也可以。這兩個(gè)文件雖然不在同一個(gè)文件里面,但是他們是屬于同一個(gè)namespace(名稱空間)這對(duì)以后我們使用這兩個(gè)方法提供了方便。當(dāng)然他們也可以屬于不同的名稱空間,這是完全可以的,但只是在我們應(yīng)用他們的時(shí)候就需要引用兩個(gè)不同的名稱空間,所以作者建議還是寫在一個(gè)名稱空間下面比較好。
接下來(lái)的任務(wù)是把這兩個(gè)cs文件變成我們需要的DLL文件。方法是這樣的:
在安裝了Microsoft.NET Framework的操作系統(tǒng)上,我們可以在Windows所在目錄下找到Microsoft.NET目錄。在這個(gè)目錄下面提供了C#的編譯器,CSC.EXE
運(yùn)行:csc /target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.cs
完成后可在本目錄下面找到我們剛才生成的MyDLL.DLL文件
/target:library 編譯器選項(xiàng)通知編譯器輸出 DLL 文件而不是 EXE 文件。后跟文件名的 /out 編譯器選項(xiàng)用于指定 DLL 文件名。
如果/out后面不跟文件名編譯器使用第一個(gè)文件 (MySwap.cs) 作為 DLL 文件名。生成的文件為MySwap.DLL文件
OK!我們創(chuàng)建動(dòng)態(tài)鏈接庫(kù)文件的任務(wù)完成了,現(xiàn)在是我們享受勞動(dòng)成果的時(shí)候了,下面我將介紹如何使用我們所創(chuàng)建的動(dòng)態(tài)鏈接庫(kù)文件。
 
四、   使用DLL
 
我們簡(jiǎn)單寫一個(gè)小程序來(lái)測(cè)試一下我們剛才寫的兩個(gè)方法是否正確,好吧,跟我來(lái):
MyClient.cs 
using System;

using MyMethods;

//這里我們引用剛才定義的名稱空間,如果剛才的兩個(gè)文件我們寫在兩個(gè)不同的名稱空間
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);

// 請(qǐng)注意,文件開(kāi)頭的 using 指令使您得以在編譯時(shí)使用未限定的類名來(lái)引用 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);

     }

}

若要生成可執(zhí)行文件 MyClient.exe,請(qǐng)使用以下命令行:

csc /out:MyClient.exe /reference:MyLibrary.DLL MyClient.cs

/out 編譯器選項(xiàng)通知編譯器輸出 EXE 文件并且指定輸出文件名 (MyClient.exe)。/reference 編譯器選項(xiàng)指定該程序所引用的 DLL 文件。

 

五、執(zhí)行

 

若要運(yùn)行程序,請(qǐng)輸入 EXE 文件的名稱,文件名的后面跟兩個(gè)數(shù)字,例如:

MyClient 123 456

 

六、輸出

 

The result of swap is num1 = 456 and num2 = 123

The MaxCD of 456 and 123 is 3

 

七、小結(jié)

動(dòng)態(tài)鏈接具有下列優(yōu)點(diǎn):

節(jié)省內(nèi)存和減少交換操作。很多進(jìn)程可以同時(shí)使用一個(gè) DLL,在內(nèi)存中共享該 DLL 的一個(gè)副本。相反,對(duì)于每個(gè)用靜態(tài)鏈接庫(kù)生成的應(yīng)用程序,Windows 必須在內(nèi)存中加載庫(kù)代碼的一個(gè)副本。
節(jié)省磁盤空間。許多應(yīng)用程序可在磁盤上共享 DLL 的一個(gè)副本。相反,每個(gè)用靜態(tài)鏈接庫(kù)生成的應(yīng)用程序均具有作為單獨(dú)的副本鏈接到其可執(zhí)行圖像中的庫(kù)代碼。
升級(jí)到 DLL 更為容易。DLL 中的函數(shù)更改時(shí),只要函數(shù)的參數(shù)和返回值沒(méi)有更改,就不需重新編譯或重新鏈接使用它們的應(yīng)用程序。相反,靜態(tài)鏈接的對(duì)象代碼要求在函數(shù)更改時(shí)重新鏈接應(yīng)用程序。
提供售后支持。例如,可修改顯示器驅(qū)動(dòng)程序 DLL 以支持當(dāng)初交付應(yīng)用程序時(shí)不可用的顯示器。
支持多語(yǔ)言程序。只要程序遵循函數(shù)的調(diào)用約定,用不同編程語(yǔ)言編寫的程序就可以調(diào)用相同的 DLL 函數(shù)。程序與 DLL 函數(shù)在下列方面必須是兼容的:函數(shù)期望其參數(shù)被推送到堆棧上的順序,是函數(shù)還是應(yīng)用程序負(fù)責(zé)清理堆棧,以及寄存器中是否傳遞了任何參數(shù)。
提供了擴(kuò)展 MFC 庫(kù)類的機(jī)制?梢詮默F(xiàn)有 MFC 類派生類,并將它們放到 MFC 擴(kuò)展 DLL 中供 MFC 應(yīng)用程序使用。
使國(guó)際版本的創(chuàng)建輕松完成。通過(guò)將資源放到 DLL 中,創(chuàng)建應(yīng)用程序的國(guó)際版本變得容易得多?蓪⒂糜趹(yīng)用程序的每個(gè)語(yǔ)言版本的字符串放到單獨(dú)的 DLL 資源文件中,并使不同的語(yǔ)言版本加載合適的資源。
使用 DLL 的一個(gè)潛在缺點(diǎn)是應(yīng)用程序不是獨(dú)立的;它取決于是否存在單獨(dú)的 DLL 模塊。