資源描述:
《C動(dòng)態(tài)調(diào)用Dll的研究》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、C#程序?qū)崿F(xiàn)動(dòng)態(tài)調(diào)用DLL的研究(轉(zhuǎn)載)idefav_2010收錄于2010-12-06閱讀數(shù):公眾公開?原文來(lái)源 摘要:在《csdn開發(fā)高手》2004年第03期中的《化功大法——將DLL嵌入EXE》一文,介紹了如何把一個(gè)動(dòng)態(tài)鏈接庫(kù)作為一個(gè)資源嵌入到可執(zhí)行文件,在可執(zhí)行文件運(yùn)行時(shí),自動(dòng)從資源中釋放出來(lái),通過(guò)靜態(tài)加載延遲實(shí)現(xiàn)DLL函數(shù)的動(dòng)態(tài)加載,程序退出后實(shí)現(xiàn)臨時(shí)文件的自動(dòng)刪除,從而為解決“DLLHell”提供了一種解決方案。這是一個(gè)很好的設(shè)計(jì)思想,而且該作者也用C++實(shí)現(xiàn)了,在Internet上也有相似的VB程序,但在某一技術(shù)論壇上提起這種設(shè)計(jì)方法時(shí),有網(wǎng)友提出:“這種方法好是好,但
2、就是啟動(dòng)速度太慢”。這是因?yàn)槌绦騿?dòng)時(shí)實(shí)現(xiàn)DLL釋放,然后再加載釋放出來(lái)的DLL,這個(gè)過(guò)程會(huì)耗費(fèi)一定的時(shí)間。鑒于此問(wèn)題,經(jīng)過(guò)思索,提出另一個(gè)設(shè)計(jì)方案:DLL作為資源文件嵌入程序,但不需進(jìn)行DLL釋放及其重新加載。本文就是對(duì)該設(shè)計(jì)方案的原理分析及使用C#編程來(lái)實(shí)現(xiàn)該設(shè)計(jì)方案。?關(guān)鍵詞:動(dòng)態(tài)調(diào)用DLL,嵌入DLL,C#?正文:一、?????DLL與應(yīng)用程序動(dòng)態(tài)鏈接庫(kù)(也稱為DLL,即為“DynamicLinkLibrary”的縮寫)是MicrosoftWindows最重要的組成要素之一,打開Windows系統(tǒng)文件夾,你會(huì)發(fā)現(xiàn)文件夾中有很多DLL文件,Windows就是將一些主要的系統(tǒng)功能
3、以DLL模塊的形式實(shí)現(xiàn)。動(dòng)態(tài)鏈接庫(kù)是不能直接執(zhí)行的,也不能接收消息,它只是一個(gè)獨(dú)立的文件,其中包含能被程序或其它DLL調(diào)用來(lái)完成一定操作的函數(shù)(方法。注:C#中一般稱為“方法”),但這些函數(shù)不是執(zhí)行程序本身的一部分,而是根據(jù)進(jìn)程的需要按需載入,此時(shí)才能發(fā)揮作用。DLL只有在應(yīng)用程序需要時(shí)才被系統(tǒng)加載到進(jìn)程的虛擬空間中,成為調(diào)用進(jìn)程的一部分,此時(shí)該DLL也只能被該進(jìn)程的線程訪問(wèn),它的句柄可以被調(diào)用進(jìn)程所使用,而調(diào)用進(jìn)程的句柄也可以被該DLL所使用。在內(nèi)存中,一個(gè)DLL只有一個(gè)實(shí)例,且它的編制與具體的編程語(yǔ)言和編譯器都沒有關(guān)系,所以可以通過(guò)DLL來(lái)實(shí)現(xiàn)混合語(yǔ)言編程。DLL函數(shù)中的代碼所創(chuàng)
4、建的任何對(duì)象(包括變量)都?xì)w調(diào)用它的線程或進(jìn)程所有。下面列出了當(dāng)程序使用DLL時(shí)提供的一些優(yōu)點(diǎn):[1]1)???????使用較少的資源當(dāng)多個(gè)程序使用同一個(gè)函數(shù)庫(kù)時(shí),DLL可以減少在磁盤和物理內(nèi)存中加載的代碼的重復(fù)量。這不僅可以大大影響在前臺(tái)運(yùn)行的程序,而且可以大大影響其他在Windows操作系統(tǒng)上運(yùn)行的程序。2)???????推廣模塊式體系結(jié)構(gòu)DLL有助于促進(jìn)模塊式程序的開發(fā)。這可以幫助您開發(fā)要求提供多個(gè)語(yǔ)言版本的大型程序或要求具有模塊式體系結(jié)構(gòu)的程序。模塊式程序的一個(gè)示例是具有多個(gè)可以在運(yùn)行時(shí)動(dòng)態(tài)加載的模塊的計(jì)帳程序。3)???????簡(jiǎn)化部署和安裝當(dāng)DLL中的函數(shù)需要更新或修復(fù)時(shí)
5、,部署和安裝DLL不要求重新建立程序與該DLL的鏈接。此外,如果多個(gè)程序使用同一個(gè)DLL,那么多個(gè)程序都將從該更新或修復(fù)中獲益。當(dāng)您使用定期更新或修復(fù)的第三方DLL時(shí),此問(wèn)題可能會(huì)更頻繁地出現(xiàn)。二、?????DLL的調(diào)用每種編程語(yǔ)言調(diào)用DLL的方法都不盡相同,在此只對(duì)用C#調(diào)用DLL的方法進(jìn)行介紹。首先,您需要了解什么是托管,什么是非托管。一般可以認(rèn)為:非托管代碼主要是基于win32平臺(tái)開發(fā)的DLL,activeX的組件,托管代碼是基于.net平臺(tái)開發(fā)的。如果您想深入了解托管與非托管的關(guān)系與區(qū)別,及它們的運(yùn)行機(jī)制,請(qǐng)您自行查找資料,本文件在此不作討論。(一)????調(diào)用DLL中的非托
6、管函數(shù)一般方法首先,應(yīng)該在C#語(yǔ)言源程序中聲明外部方法,其基本形式是:[DLLImport(“DLL文件”)]修飾符extern返回變量類型方法名稱(參數(shù)列表)其中:DLL文件:包含定義外部方法的庫(kù)文件。修飾符:訪問(wèn)修飾符,除了abstract以外在聲明方法時(shí)可以使用的修飾符。返回變量類型:在DLL文件中你需調(diào)用方法的返回變量類型。方法名稱:在DLL文件中你需調(diào)用方法的名稱。參數(shù)列表:在DLL文件中你需調(diào)用方法的列表。注意:需要在程序聲明中使用System.Runtime.InteropServices命名空間。?????DllImport只能放置在方法聲明上。DLL文件必須位于程序
7、當(dāng)前目錄或系統(tǒng)定義的查詢路徑中(即:系統(tǒng)環(huán)境變量中Path所設(shè)置的路徑)。返回變量類型、方法名稱、參數(shù)列表一定要與DLL文件中的定義相一致。?若要使用其它函數(shù)名,可以使用EntryPoint屬性設(shè)置,如:[DllImport("user32.dll",EntryPoint="MessageBoxA")]staticexternintMsgBox(inthWnd,stringmsg,stringcaption,inttype);其它可選的DllImportA