1. 程式人生 > >C#編寫動態連結庫類庫dll檔案

C#編寫動態連結庫類庫dll檔案

1、DLL 即:動態連結庫
  DLL是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程式同時使用的程式碼和資料的庫,DLL不是可執行檔案。動態連結提供了一種方法,使程序可以呼叫不屬於其可執行程式碼的函式。函式的可執行程式碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結並與使用它們的程序分開儲存的函式。DLL 還有助於共享資料和資源。多個應用程式可同時訪問記憶體中單個DLL 副本的內容。DLL 是一個包含可由多個程式同時使用的程式碼和資料的庫。(來自百度)

2、DLL的好處主要有:
  1)當程式越來越龐大時,DLL避免了EXE檔案的過大。分成DLL之後,不用把全部功能都集中到EXE裡,需要的時候才調入記憶體。


  2)DLL模組化了生產程式。DLL是產品,EXE就是個集裝箱。因此對DLL模組的更新只需要替換此DLL檔案即可,不用更新整個程式。
  3)編譯EXE時,不用編譯DLL的內容,加快了編譯速度。
  4)DLL可重用。當一個DLL模式設計好之後,可以被其它專案或程式所引用。
  5)DLL可以起到保密的作用。也就是說DLL可以將實現功能的原始碼隱藏起來,呼叫者只能使用而不能看到其內部程式碼。

“動態連結”這幾字指明瞭DLLs是如何工作的。對於常規的函式庫,連結器從中拷貝它需要的所有庫函式,並把確切的函式地址傳送給呼叫這些函式的程式。而對於DLLs,函式儲存在一個獨立的動態連結庫檔案中。在建立Windows程式時,連結過程並不把DLLs檔案連結到程式上。直到程式執行並呼叫一個DLLs中的函式時,該程式才要求這個函式的地址。此時Windows才在DLLs中尋找被呼叫函式,並把它的地址傳送給呼叫程式。採用這種方法,DLLs達到了複用程式碼的極限。


3.DLL的呼叫

DLL(動態連結庫)的呼叫可以分為兩種:一種是隱式呼叫,一種是顯示呼叫。

  1、隱式的呼叫

  這種呼叫方式需要把產生動態連線庫時產生的.LIB檔案加入到應用程式的工程中,在使用DLL中的函式時,只須說明一下後就可以直接通過函式名呼叫DLL的輸出函式,呼叫方法和程式內部其他的函式是一樣的。隱式呼叫不需要呼叫LoadLibrary()和FreeLibrary()。程式設計師在建立一個DLL檔案時,連結程式會自動生成一個與之對應的LIB匯入檔案。該檔案包含了每一個DLL匯出函式的符號名和可選的標識號,但是並不含有實際的程式碼。LIB檔案作為DLL的替代檔案被編譯到應用程式專案中。

  當程式設計師通過隱式呼叫方式編譯生成應用程式時,應用程式中的呼叫函式與LIB檔案中匯出符號相匹配,這些符號或標識號被寫入到生成的EXE檔案中。LIB檔案中也包含了對應的DLL檔名(但不是完全的路徑名),連結程式也將其儲存在EXE檔案內部。當應用程式執行過程中需要載入DLL檔案時,Windows根據這些資訊發現並載入DLL,然後通過符號名或標識號實現對DLL函式的動態連結。所有被應用程式呼叫的DLL檔案都會在應用程式EXE檔案載入時被載入在到記憶體中。

  2、顯式呼叫

  這種呼叫方式是指在應用程式中用LoadLibrary或MFC提供的AfxLoadLibrary顯式的將自己所做的動態連線庫調進來,並指定DLL的路徑作為引數。LoadLibary返回HINSTANCE引數,應用程式在呼叫GetProcAddress函式時使用這一引數。當完成對動態連結庫的匯入以後,再使用GetProcAddress()獲取想要引入的函式,該函式將符號名或標識號轉換為DLL內部的地址,之後就可以象使用本應用程式自定義的函式一樣來呼叫此引入函數了。在應用程式退出之前,應該用FreeLibrary或MFC提供的AfxFreeLibrary釋放動態連線庫。

4.方法/步驟(來源於百度)

開啟vs2015選單欄新建->專案,選擇C#程式設計環境下的類庫,起名叫imageprocess,準備做一個圖片處理的類


2.將class後面的類名改為imagepro(注意是改引用下class1的檔名為imagepro,然後系統會彈出一個確認框,點確認即可),每個.cs檔案包含一個類,每個類又會包含很多方法,那麼這個圖片處理的類imagepro裡可以寫無數個方法即函式,下面我們先演示一個圖片取反的方法



3.Bitmap型別定義一張圖片,我們發現缺乏相關引用,於是在解決方案的引用資料夾裡右鍵新增引用,從.Net庫裡把System.Drawing新增進來,然後在using里加上using System.Drawing



4.下面我們在imagepro類裡新增方法Reverse,Reverse函式的型別就是Bitmap,直接返回處理後的圖片,這個方法是給圖片畫素取反,類似底片的效果

然後我們在Reverse函式裡新增如下程式碼

public Bitmap Reverse(Bitmap image)
 {
  for (int i = 0; i < image.Width; i++) //迴圈遍歷寬
            {
                for (int j = 0; j < image.Height; j++)//迴圈遍歷高度
                {
                    Color pix = image.GetPixel(i, j);//獲取影象畫素值
                    int r = 255 - pix.R;//畫素值取反
                    int g = 255 - pix.G;//轉換顏色
                    int b = 255 - pix.B; //轉換顏色
                    image.SetPixel(i, j, Color.FromArgb(r, g, b));//儲存畫素值
                }
}
       return image;
 }
5.最後選單欄選擇生成->生成imageprocess,或者按shift+F6快捷鍵生成imageprocess.dll,那麼這個dll檔案就可以被其他c#程式引用了包括asp.net程式。