C#程序實現動態調用DLL的研究
2007/1/24 21:35:31

C#程序實現動態調用DLL的研究
摘 要:在《csdn開發高手》2004年第03期中的《化功大法——將DLL嵌入EXE》一文,介紹了如何把一個動態鏈接庫作為一個資源嵌入到可執行文件,在可執行文件運行時,自動從資源中釋放出來,通過靜態加載延遲實現DLL函數的動態加載,程序退出后實現臨時文件的自動刪除,從而為解決“DLL Hell”提供了一種解決方案。這是一個很好的設計思想,而且該作者也用C++實現了,在Internet上也有相似的VB程序,但在某一技術論壇上提起這種設計方法時,有網友提出:“這種方法好是好,但就是啟動速度太慢”。這是因為程序啟動時實現DLL釋放,然后再加載釋放出來的DLL,這個過程會耗費一定的時間。鑒于此問題,經過思索,提出另一個設計方案:DLL作為資源文件嵌入程序,但不需進行DLL釋放及其重新加載。本文就是對該設計方案的原理分析及使用C#編程來實現該設計方案。
 
關鍵詞:動態調用DLL,嵌入DLL,C#
 
正 文:
一、      DLL與應用程序
動態鏈接庫(也稱為DLL,即為“Dynamic Link Library”的縮寫)是Microsoft Windows最重要的組成要素之一,打開Windows系統文件夾,你會發現文件夾中有很多DLL文件,Windows就是將一些主要的系統功能以DLL模塊的形式實現。 
動態鏈接庫是不能直接執行的,也不能接收消息,它只是一個獨立的文件,其中包含能被程序或其它DLL調用來完成一定操作的函數(方法。注:C#中一般稱為“方法”),但這些函數不是執行程序本身的一部分,而是根據進程的需要按需載入,此時才能發揮作用。
DLL只有在應用程序需要時才被系統加載到進程的虛擬空間中,成為調用進程的一部分,此時該DLL也只能被該進程的線程訪問,它的句柄可以被調用進程所使用,而調用進程的句柄也可以被該DLL所使用。在內存中,一個DLL只有一個實例,且它的編制與具體的編程語言和編譯器都沒有關系,所以可以通過DLL來實現混合語言編程。DLL函數中的代碼所創建的任何對象(包括變量)都歸調用它的線程或進程所有。
下面列出了當程序使用 DLL 時提供的一些優點:[1]
1)        使用較少的資源
當多個程序使用同一個函數庫時,DLL 可以減少在磁盤和物理內存中加載的代碼的重復量。這不僅可以大大影響在前臺運行的程序,而且可以大大影響其他在 Windows 操作系統上運行的程序。 
2)        推廣模塊式體系結構
DLL 有助于促進模塊式程序的開發。這可以幫助您開發要求提供多個語言版本的大型程序或要求具有模塊式體系結構的程序。模塊式程序的一個示例是具有多個可以在運行時動態加載的模塊的計帳程序。 
3)        簡化部署和安裝
當 DLL 中的函數需要更新或修復時,部署和安裝 DLL 不要求重新建立程序與該 DLL 的鏈接。此外,如果多個程序使用同一個 DLL,那么多個程序都將從該更新或修復中獲益。當您使用定期更新或修復的第三方 DLL 時,此問題可能會更頻繁地出現。
二、      DLL的調用
每種編程語言調用DLL的方法都不盡相同,在此只對用C#調用DLL的方法進行介紹。首先,您需要了解什么是托管,什么是非托管。一般可以認為:非托管代碼主要是基于win 32平臺開發的DLL,activeX的組件,托管代碼是基于.net平臺開發的。如果您想深入了解托管與非托管的關系與區別,及它們的運行機制,請您自行查找資料,本文件在此不作討論。
(一)    調用DLL中的非托管函數一般方法
首先,應該在C#語言源程序中聲明外部方法,其基本形式是:
[DLLImport(“DLL文件”)]
修飾符 extern 返回變量類型 方法名稱 (參數列表)
其中:
DLL文件:包含定義外部方法的庫文件。
修飾符: 訪問修飾符,除了abstract以外在聲明方法時可以使用的修飾符。
返回變量類型:在DLL文件中你需調用方法的返回變量類型。
方法名稱:

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 天天做天天爱夜夜爽| 极品美女养成系统| 国产AV无码专区亚洲AV琪琪| 在免费jizzjizz在线播| 女教师巨大乳孔中文字幕| 久久99精品久久只有精品| 欧美性一交激情视频在线| 人妻尝试又大又粗久久| 美女扒开尿口让男人30视频| 国产成人亚洲综合一区| 2022韩国最新三级伦理在线观看| 天天看免费高清影视| 中文在线日本免费永久18近| 日韩aⅴ人妻无码一区二区| 亚洲剧情在线观看| 波多野结衣69| 俺去啦在线视频| 精品欧美成人高清在线观看| 国产偷窥熟女精品视频大全| 五月天亚洲色图| 国产精品无码专区在线观看| 99在线精品免费视频| 娃娃脸中文字幕1080p| 中国体育生gary飞机| 无遮挡色视频真人免费| 久久精品成人一区二区三区| 欧美在线视频一区| 亚洲欧美激情精品一区二区| 男人把女人c爽的免费视频| 午夜无码A级毛片免费视频| 色香视频在线观看| 国产午夜无码片在线观看影院| 久久波多野结衣| 国产精品亚洲а∨无码播放麻豆 | 国产剧果冻传媒星空在线| 免费看污成人午夜网站| 国产精品久久久久久久网站 | 香蕉在线精品一区二区| 国产综合第一页| 97久久精品人人做人人爽| 大肉大捧一进一出好爽视频动漫|