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