如何利用C#創建和調用DLL

一、             寫在前面
 
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;
          }
     }
}











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: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 模塊。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章