C#中托管DLL和非托管DLL的區(qū)別詳解
首先解釋一下,托管DLL和非托管DLL的區(qū)別。狹義解釋講,托管DLL就在Dotnet環(huán)境生成的DLL文件。非托管DLL不是在Dotnet環(huán)境生成的DLL文件。
托管DLL文件,可以在Dotnet環(huán)境通過 “添加引用” 的方式,直接把托管DLL文件添加到項(xiàng)目中。然后通過 Using DLL命
名空間,來調(diào)用相應(yīng)的DLL對象 。
非托管DLL文件,在Dotnet環(huán)境應(yīng)用時(shí),通過 DllImport 調(diào)用。
C# 調(diào)用非托管DLL文件。DLL文件是用C語言編寫的。
托管DLL就是能夠在公共語言運(yùn)行庫(Common Language Runtime,簡稱CLR)中能夠直接引用的,并且擴(kuò)展名為“DLL”的文件。
具體所指就是封裝各種命名空間所在的DLL文件,如System.dll等。非托管DLL就是平常所的動(dòng)態(tài)鏈接庫等,其中就包括了封裝所 有Windows API函數(shù)的DLL文件。各種非托管DLL中的函數(shù)在公共語言運(yùn)行庫中不能直接被調(diào)用,而需要經(jīng)過.Net框架提供的“平 臺(tái)調(diào)用”服務(wù)后才可以。
“平臺(tái)調(diào)用”是.Net框架為Visual Basic .Net、Visual C#等.Net開發(fā)語言提供的一種服務(wù),用以在托管代碼中引入各種
非托管DLL中封裝的函數(shù)(其中包括Windows API函數(shù))?!捌脚_(tái)調(diào)用”依賴于元數(shù)據(jù)在運(yùn)行時(shí)查找導(dǎo)出函數(shù)并封裝其參數(shù)。
在托管代碼中使用“平臺(tái)調(diào)用”服務(wù)調(diào)用非托管DLL中封裝的函數(shù)時(shí),“平臺(tái)服務(wù)”將依次執(zhí)行以下操作:
1. 查找包含該函數(shù)所在的DLL文件。
2. 如果找到,則將該DLL文件 加載到內(nèi)存中。
3. 查找函數(shù)在內(nèi)存中的地址并將其參數(shù)推到堆棧上,并封送所需的數(shù)據(jù)。
4. 將控制權(quán)轉(zhuǎn)移給非托管函數(shù)。 這樣整個(gè)函數(shù)調(diào)用完成。
在Visual Basic .Net中使用“平臺(tái)調(diào)用”服務(wù),申明Windows API函數(shù)主要有二種具體的實(shí)現(xiàn)方法:
1. 使用DllImport特征類來申明Windows API函數(shù)。
2. 使用“Declare”語句來申明Windows API函數(shù)。
這二種方法雖有異曲同工之效,但在繁簡上卻有很大差異,第一種方法申明過程比較復(fù)雜,很容易在申明Windows API函數(shù)時(shí)出錯(cuò),所以并不提倡。而第二種方法相對簡單,并且又保存了以前Visual Basic中的很多語法,所以在平常時(shí)大都使用這種方
法來申明Windows API函數(shù)。
regasm:
regasm注冊的是.net框架下生成的dll(托管與clr)
regsvr32:
regsvr32注冊的是要用C++寫的(非托管)
而C#寫的就必須用Regasm注冊
托管DLL,說白了,就是 完全由.NET托管代碼實(shí)現(xiàn)的DLL,完全依賴于 .NET 平臺(tái)的 CLR 運(yùn)行。托管DLL,受.NET CLR管控,支 持內(nèi)存自動(dòng)回收等的,對于.NET平臺(tái)是安全DLL
非托管DLL,是指完全或者部分 不是用.NET代碼實(shí)現(xiàn),不依賴于.NET平臺(tái)即可運(yùn)行,例如 COM方式 的DLL,不支持自動(dòng)回收內(nèi)存 ,對于.NET平臺(tái)而言,也是非安全可控的。
其他平臺(tái)的使用vc++、vb等語言寫成的dll文件,在.net環(huán)境下使用的話,可以使用regsvr32注冊后,就可以在.net下使用了。
到此這篇關(guān)于C#中托管DLL和非托管DLL的區(qū)別詳解的文章就介紹到這了,更多相關(guān)C# 托管DLL和非托管DLL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)萬物皆可排序的隊(duì)列方法詳解
本文詳細(xì)講解了C#實(shí)現(xiàn)萬物皆可排序隊(duì)列的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01
RSA密鑰--JAVA和C#的區(qū)別及聯(lián)系
這篇文章主要介紹了關(guān)于RSA密鑰事件JAVA和C#的區(qū)別及聯(lián)系,文章從RSA語法介紹開始展開詳細(xì)介紹了C#轉(zhuǎn)JAVA及JAVA轉(zhuǎn)C#,需要的小伙伴可以可以參考一下2021-10-10
C#中FileSystemWatcher類實(shí)現(xiàn)監(jiān)控文件夾
在C#中,如果你想要監(jiān)控一個(gè)文件夾內(nèi)文件的變動(dòng)情況,比如文件的創(chuàng)建、刪除、修改等,你可以使用FileSystemWatcher類,下面就來介紹一下FileSystemWatcher監(jiān)控的使用,感興趣的可以了解一下2024-03-03
C#實(shí)現(xiàn)身份證實(shí)名認(rèn)證接口的示例代碼
身份證實(shí)名認(rèn)證,即通過姓名和身份證號校驗(yàn)個(gè)人信息的匹配程度,廣泛應(yīng)用于金融、互聯(lián)網(wǎng)等多個(gè)領(lǐng)域,本文主要介紹了C#實(shí)現(xiàn)身份證實(shí)名認(rèn)證接口的示例代碼,感興趣的可以了解一下2024-09-09
c#遠(yuǎn)程html數(shù)據(jù)抓取實(shí)例分享
這篇文章主要介紹了c#遠(yuǎn)程html數(shù)據(jù)抓取的方法,大家參考使用吧2013-12-12

