c#創(chuàng)建、使用Dll動態(tài)鏈接庫
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
最近因為項目需要,需要調(diào)用一個動態(tài)鏈接庫,由于以前沒有接觸過,也不知道如何編寫調(diào)用DLL,特此記錄下學習筆記。
一、什么是DLL以及使用它的好處 1 DLL (DynamicLink Library ) DLL是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫,DLL不是可執(zhí)行文件。動態(tài)鏈接提供了一種方法,使進程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個應用程序可同時訪問內(nèi)存中單個DLL 副本的內(nèi)容。DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫。(來自百度) 2 DLL的好處 1)當程序越來越龐大時,DLL避免了EXE文件的過大。分成DLL之后,不用把全部功能都集中到EXE里,需要的時候才調(diào)入內(nèi)存。 上述可能說的有些難懂,下面是項目開發(fā)遇到的難題,其中就是選擇DLL連接庫,可以感性認識DLL的好處: 發(fā)生的背景 在開發(fā)新項目中使用了新的語言開發(fā)C#和新的技術方案WEB Service,但是在新項目中,一些舊的模塊需要繼續(xù)使用,一般是采用C或C++或Delphi編寫的,如何利用舊模塊對于開發(fā)人員來說,有三種可用方法供選擇: 第一、將C或C++函數(shù)用C#徹底改寫一遍,這樣整個項目代碼比較統(tǒng)一,維護也方便一些。但是盡管微軟以及某些書籍說,C#和C++如何接近,但是改寫起來還是很痛苦的事情,特別是C++里的指針和內(nèi)存操作; 第二、將C或C++函數(shù)封裝成COM,在C#中調(diào)用COM比較方便,只是在封裝時需要處理C或C++類型和COM類型之間的轉換,也有一些麻煩,另外COM還需要注冊,注冊次數(shù)多了又可能導致混亂; 第三、將C或C++函數(shù)封裝成動態(tài)鏈接庫,封裝的過程簡單,工作量不大。 因此我決定采用加載動態(tài)鏈接庫的方法實現(xiàn),于是產(chǎn)生了在C#中如何調(diào)用自定義的動態(tài)鏈接庫問題,我在網(wǎng)上搜索相關主題,發(fā)現(xiàn)一篇調(diào)用系統(tǒng)API的文章,但是沒有說明如何解決此問題,在MSDN上也沒有相關詳細說明。基于此,我決定自己從簡單出發(fā),逐步試驗,看看能否達到自己的目標。 “動態(tài)鏈接”這幾字指明了DLLs是如何工作的。對于常規(guī)的函數(shù)庫,鏈接器從中拷貝它需要的所有庫函數(shù),并把確切的函數(shù)地址傳送給調(diào)用這些函數(shù)的程序。而對于DLLs,函數(shù)儲存在一個獨立的動態(tài)鏈接庫文件中。在創(chuàng)建Windows程序時,鏈接過程并不把DLLs文件鏈接到程序上。直到程序運行并調(diào)用一個DLLs中的函數(shù)時,該程序才要求這個函數(shù)的地址。此時Windows才在DLLs中尋找被調(diào)用函數(shù),并把它的地址傳送給調(diào)用程序。采用這種方法,DLLs達到了復用代碼的極限。
二、在VS2010中如何創(chuàng)建和編寫DLL 方法很簡單,就是在程序的解決方案中添加一個項目,然后選擇“類庫”。注意,一定要在“解決方案”上添加項目才行,在項目中只能添加類文件了。類庫項目一但添加,在程序編譯的時候就會自動生成為DLL文件。 編寫DLL這和編寫類文件代碼是一致的。你可以在多個CS類文件中編寫,也可以全放在一起CS類文件中編寫。當然推薦的方式是根據(jù)功能分類將類庫分別寫在不同的CS文件中。(雖然在不同文件中,但同屬一個項目的類文件會被編譯進一個DLL庫文件中)
三、在VS2010中如何使用自己編寫的DLL 方法也很簡單,在你的程序中的解決方案管理器里,找到“引用”然后點右鍵添加,在彈出的對話框中選擇“瀏覽”,然后選擇你剛才創(chuàng)建并編譯過的DLL文件。然后在程序文件中使用using 來引入你DLL中的命名空間。注:如果DLL項目就在你當前的程序解決方案中,那么你可以直接在添加“引用”中選擇“項目”而不是“瀏覽”。這樣就可以直接引用本解決方案中編寫的DLL類庫。
http://jingyan.baidu.com/article/6525d4b1091539ac7d2e9407.html,上面有最簡單的例程,我牛刀小試了一下,正確完成!
四.c#調(diào)用Matlab生成的DLL 1、創(chuàng)建一個簡單的.m文件 打開Matlab 2009a,新建一個.m文件,輸入如下代碼: function result=twice(inputvar); 將代碼保存為twice.m文件,如圖所示。 2、使用Matlab DeployTool生成.Net組件 在Matlab 2009a的Command Window中輸入deploytool并回車,如圖所示。 就可以打開Matlab的DeployTool,如圖所示。 在DeployTool窗體中,點擊新建按鈕,打開新建項目對話框,如圖所示。 在左邊的列表中選擇MATLAB Builder NE,并在右邊的列表中選擇.NET Component,我們將這個工程命名為twice.prj,并點擊OK,則進入項目設置界面,如圖所示。 在Twice文件夾中添加我們剛才建好的.m文件,如圖所示。 點擊編譯按鈕或使用快捷鍵Ctrl+B則對該工程進行編譯。編譯完成后的主窗口如圖所示。 3、創(chuàng)建一個測試用的Windows應用程序,將其命名為MatlabTest,如圖所示。 4、添加對MWArray.dll的引用 MWArray.dll一般位于[Matlab安裝位置]\R2009a\toolbox\dotnetbuilder\bin\win32\v2.0文件夾中,我們注意到Matlab 2009a對應的MWArray.dll是2.9.0.0版本的。在進行Matlab版本升級的時候,比較頭疼的就是這個dll。 因為版本升級意味著之前生成的dll都需要重新生成。關于版本升級的問題,我將在后面的博文中詳細介紹。 之所以添加MWArray.dll,是因為在這種混合編程方式下,我們經(jīng)常要 using MathWorks.MATLAB.NET.Arrays; 5、添加對Matlab生成的twice.dll的引用。 6、添加窗體中相應的組件。 添加一個Label控件,并修改其Text屬性為“計算結果”; 添加一個Label控件,用于顯示計算結果; 添加一個Button控件,用于執(zhí)行計算方法。 設計好后的Form1窗體如圖所示。 7、編寫相應的后臺代碼。
[c#] view plaincopy
8、執(zhí)行并查看結果 在代碼中輸入了一個變量i并為其賦值5,可以看到經(jīng)過調(diào)用Matlab計算,順利返回計算結果10。
五、創(chuàng)建和使用DLL 一個實例可以參考:http://blog.csdn.net/cpcpc/article/details/6134463
代碼鏈接:http://download.csdn.net/source/2980458 更多關于DLL的調(diào)用可以參考: http://blog.csdn.net/zlei2013141/article/details/6963524 http://bbs.ednchina.com/BLOG_ARTICLE_186713.HTM http://blog.csdn.net/nocky/article/details/7687603
更多,請關注:http://blog.csdn.net/tiandijun/,歡迎交流! 該文章在 2017/2/15 10:49:41 編輯過 |
關鍵字查詢
相關文章
正在查詢... |