【摘 要】很多進程可以同時使用一個DLL,在記憶體中共用該DLL的一個副本。相反,對於每個用靜態連結庫產生的應用程式,Windows 必須在記憶體中載入庫代碼的一個副本。
C# 語言從C和 C++語言演化而來,在語句、運算式和運算子方面使用了許多 C++ 功能。C# 語言在型別安全、版本轉換、事件和記憶體回收等方面進行了相當大的改進和創新。C# 語言提供對常用 API 樣式(如 .NET 架構、COM、自動化和 C 樣式 API 等)的訪問。
什麼是動態連結程式庫?DLL三個字母是Dynamic Link Library的縮寫形式,動態連結程式庫 (DLL) 是作為共用函數庫的可執行檔。動態連結提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個DLL中,該DLL包含一個或多個已被編譯、連結並與使用它們的進程分開儲存的函數。DLL還有助於共用資料和資源,多個應用程式可同時訪問記憶體中單個DLL副本的內容。
首先對接下來要做的事情做個簡單的介紹,本文將利用C#語言建立一個名為MyDLL.DLL的動態連結程式庫,在這個動態連結程式庫檔案中將提供兩個功能一個是對兩個參數交換他們的值,另一個功能是求兩個參數的最大公約數。然後建立一個應用程式使用這個DLL,運行並輸出結果。
建立以下三個C#代碼檔案:
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;
}
}
}
MyMaxCD.csusing 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;
}
}
}
接下來的把這兩個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檔案。簡單寫一個小程式來測試一下我們剛才寫的兩個方法是否正確:MyClient.csusing 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: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