作為軟件設計和開發人員大都有過使用DLL(動態連接庫)的經歷,DLL的產生使得我們的應用程序在可維護性、代碼的重復使用等方面都有了很大的提高。以前用的DLL一般都是用Visual C++、Delphi或者VB等編程語言來編寫的,這種DLL的編寫和使用,我們大都已經比較習慣了。作為新一代的程序開發語言--Visual C#,到底是如何編寫和使用DLL的呢!本文就試著就這方面的問題來進行簡單的介紹。
Visual C++、Delphi或者VB等編程語言來編寫成的DLL文件,在編譯完成過以後,產生DLL文件已經是一個可以直接供計算機使用的二進制文件。但用Visual C#編譯器生成的受管代碼(managed code)雖然也是二進制文件,但不是可以直接供計算機使用的原始代碼(機器語言代碼)。他實質上是一種中間語言(IL)代碼,這種IL代碼要轉變成可以供計算機直接使用的原始代碼,就需要經過"下一代窗口服務"( Next Generation Windows Services,簡寫為NGWS ) runtime的即時編譯器(即JIT)進行編譯。
經過以上比較,我們可以看出,用Visual C#生成的DLL文件已經和以前的DLL文件有了本質上的區別。用Visual C#生成的DLL文件在程序設計中更多的表現為一種類(Class)或者類庫(Class Library)。本文就試著通過一個具體程序的例子,按照下面步驟來具體介紹:
(1).創建一個DLL源代碼。
(2).編譯此DLL源代碼,生成DLL文件。
(3).用此DLL來創建一個簡單的客戶端程序。
一. 程序設計開發及運行環境:
(1).微軟視窗2000專業版
(2)..Net FrameWork SDK Beta 2
二. 創建一個DLL源代碼(dll.cs)
由於用Visual C#創建的DLL,此DLL是不需要執行的界面,所以在DLL文件就沒有必要定義Main ( )函數,來作為應用程序執行的入口。Dll.cs的源程序代碼如下:
Dll.cs:
namespace Dll file://定義了名稱空間,在調用DLL的時候就要導入此名稱空間。
{
public class Show file://定義了一個類,在程序中就要來繼承此類。
{
public string Messages ( )
file://定義了一個方法,此方法的作用就是返回下面字符串。
{
return "歡迎使用Visual C#做的DLL文件!" ;
}
}
}
通過此DLL的源程序可以看出,此DLL表現為一個小型的類庫,這是因為在此DLL中封裝了名字叫DLL的名稱空間,在此名稱空間中又定義了一個Show類,在此類中有一個方法就是Messages。雖然定義的內容相對少了些,但卻相當完全。
三. 編譯此DLL源代碼,生成DLL文件
要把DLL源代碼編譯成DLL文件,就需要配置好編譯器Csc.exe的參數和開關。我們知道編譯器Csc.exe可以把源代碼編譯成四種不同的文件,分別是控制應用程序、代碼庫、Windows應用程序、模塊程序。編譯命令具體如下:
csc /target:exe myProj.cs // 創建一個myProj.exe控制程序
csc /target:winexe myProject.cs file://創建一個myProj.exe的Windows程序
csc /target:library myProject.cs file://創建一個myProj.dll代碼庫
csc /target:module myProject.cs file://創建一個myProj.dll模塊
對於如何配置編譯器Csc.exe的其他參數和開關,可以參考稍前發表的文章《如何用CSC.exe來編譯Visual C#的代碼文件》,在此篇文章裡面有比較詳細的介紹。通過以下編譯命令可以得到mydll.dll文件:
Csc /r:system.dll /t:library /out:mydll.dll dll.cs
四.用此DLL來創建一個簡單的客戶端程序(test.exe)
通過以上的源程序代碼可以看到生成的mydll.dll文件雖然是一個以DLL為擴展名,實際上是一個類庫,和我們經常用到的System.dll、System.Windows.Forms.dll等這些文件相似。同樣用mydll.dll創建程序也和用以上這些類庫創建程序相類似。就是第一步就是導入此名稱空間--Dll。然後在去繼承裡面封裝好的類--Show,再調用類中定義好的方法--Messages。下面就是按照以上的步驟,創建的客戶端的源程序代碼( test.cs ) :
test.cs:
using Dll ; // 導入此名稱空間
using System ;
public class GetMessage
{
public static void Main ( )
{
Show hi = new Show ( ) ; // 繼承名稱空間中定義的Show類
Console.WriteLine ( hi.Messages ( ) ) ; // 調用此類中的方法
}
}
在把test.cs編譯成執行程序中,要在編譯命令中添加一個引用,就是引用mydll.dll文件。具體的編譯命令如下:
csc /r:mydll.dll /r:system.dll test.cs
五.總結:
通過此篇文章,可以看出用Visual C#制作一個DLL其實並不是一件很復雜的事件,但對DLL的調用卻和以往有了較大區別,其中最主要的原因是,用Visual C#或者其他.Net 程序開發語言制作的DLL和以前的DLL有了實質上的區別。它已經不是嚴格意義上的動態連接庫了,而是一個類或者類庫。