.net 互操作概述

.net 互操作概述

ID:21976471

大小:75.50 KB

頁數(shù):21頁

時(shí)間:2018-10-21

.net 互操作概述_第1頁
.net 互操作概述_第2頁
.net 互操作概述_第3頁
.net 互操作概述_第4頁
.net 互操作概述_第5頁
資源描述:

《.net 互操作概述》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

1、.NET互操作概述互操作性使您能夠保留和利用在現(xiàn)有非托管代碼中的投入互操作是托管和非托管代碼之間的調(diào)用,COM、COM+、C++組件、ActiveX組件和Win32API都是非托管代碼.NETFramework通過平臺調(diào)用服務(wù)、System.Runtime.InteropServices命名空間和CLR以及通過COM互操作性(COM互操作)支持與非托管代碼的互操作性.NET互操作方式平臺調(diào)用C++中的ItJustWorks(IJW)COM互操作.NET互操作特點(diǎn)PInvoke和COM互操作都使用封送處理在托管和非托管代碼之間轉(zhuǎn)換諸如整數(shù)、字符串、數(shù)組、結(jié)構(gòu)

2、和指針等參數(shù)平臺調(diào)用概述平臺調(diào)用使托管代碼能夠調(diào)用從非托管動(dòng)態(tài)鏈接庫(DLL)導(dǎo)出的函數(shù),比如Win32API和自定義DLL。利用平臺調(diào)用這種服務(wù),托管代碼可以調(diào)用在動(dòng)態(tài)鏈接庫(DLL)(如Win32API中的DLL)中實(shí)現(xiàn)的非托管函數(shù)。此服務(wù)將查找并調(diào)用導(dǎo)出的函數(shù),然后根據(jù)需要跨越互用邊界封送其參數(shù)(整數(shù)、字符串、數(shù)組、結(jié)構(gòu)等)。出于性能的考慮,應(yīng)檢查.NETFramework中是否有可用的等價(jià)函數(shù)而不是使用平臺調(diào)用。平臺調(diào)用依賴于元數(shù)據(jù)在運(yùn)行時(shí)查找導(dǎo)出的函數(shù)并封送其參數(shù)可以調(diào)用Win32API和其他DLL中的函數(shù)來控制操作系統(tǒng)中的一大部分平臺調(diào)用通常做

3、法標(biāo)識DLL中的函數(shù)最低限度上,必須指定函數(shù)的名稱和包含該函數(shù)的DLL的名稱創(chuàng)建用于容納DLL函數(shù)的類可以使用現(xiàn)有類,為每一非托管函數(shù)創(chuàng)建單獨(dú)的類,或者創(chuàng)建包含一組相關(guān)的非托管函數(shù)的一個(gè)類在托管代碼中創(chuàng)建原型[VisualBasic]使用帶Function和Lib關(guān)鍵字的Declare語句。在某些少見的情況下,可以使用帶SharedFunction關(guān)鍵字的DllImportAttribute。這些情況在本節(jié)后面部分進(jìn)行說明。[C#]使用DllImportAttribute標(biāo)識DLL和函數(shù)。用static和extern修飾符標(biāo)記方法。[C++]使用DllIm

4、portAttribute標(biāo)識DLL和函數(shù)。用extern“C”標(biāo)記包裝方法或函數(shù)。調(diào)用DLL函數(shù)像處理其他任何托管方法一樣調(diào)用托管類上的方法。傳遞結(jié)構(gòu)和實(shí)現(xiàn)回調(diào)函數(shù)屬于特殊情況。平臺調(diào)用過程查找包含該函數(shù)的DLL。將該DLL加載到內(nèi)存中。查找函數(shù)在內(nèi)存中的地址并將其參數(shù)推到堆棧上,以封送所需的數(shù)據(jù)。將控制權(quán)轉(zhuǎn)移給非托管函數(shù)。平臺調(diào)用過程注意:只在第一次調(diào)用函數(shù)時(shí),才會查找和加載DLL并查找函數(shù)在內(nèi)存中的地址。平臺調(diào)用會向托管調(diào)用方引發(fā)由非托管函數(shù)生成的異常標(biāo)識DLL中的函數(shù)函數(shù)的名稱和序號(函數(shù)入口點(diǎn))實(shí)現(xiàn)所在的DLL文件的名稱(文件在那)DLL內(nèi)容說明

5、GDI32.dll用于設(shè)備輸出的圖形設(shè)備接口(GDI)函數(shù),例如用于繪圖和字體管理的函數(shù)。Kernel32.dll用于內(nèi)存管理和資源處理的低級別操作系統(tǒng)函數(shù)。User32.dll用于消息處理、計(jì)時(shí)器、菜單和通信的Windows管理函數(shù)。常用的DLL創(chuàng)建用于容納DLL函數(shù)的類要封裝平臺功能,一種有效的方法是將常用的DLL函數(shù)包裝在托管類中。雖然不必在每種情形下都這樣做,但由于定義DLL函數(shù)可能會相當(dāng)麻煩并且容易出錯(cuò),所以提供類包裝是一種很方便的方法。在一個(gè)類中,為每個(gè)要調(diào)用的DLL函數(shù)定義靜態(tài)方法。定義中可以包括一些附加信息,如在傳遞方法參數(shù)時(shí)使用的字符集或

6、調(diào)用約定;如果省略這些信息,將選擇默認(rèn)設(shè)置。包裝之后,就可以按照對其他任何靜態(tài)函數(shù)調(diào)用方法的相同方式來對該函數(shù)調(diào)用方法。平臺調(diào)用將自動(dòng)處理底層的導(dǎo)出函數(shù)在托管代碼中創(chuàng)建原型指定DLL指定函數(shù)入口點(diǎn)非托管函數(shù)在托管的原型定義可以調(diào)整平臺調(diào)用的默認(rèn)值usingSystem.Runtime.InteropServices;publicclassWin32{[DllImport("user32.dll",EntryPoint="MessageBoxA")]publicstaticexternintMsgBox(inthWnd,Stringtext,Stringca

7、ption,uinttype);}調(diào)整定義無論是否顯式設(shè)置屬性字段,屬性字段都可用于定義托管代碼的行為。平臺調(diào)用將按照在程序集中作為元數(shù)據(jù)存在的各個(gè)字段上設(shè)置的默認(rèn)值來執(zhí)行操作。通過調(diào)整一個(gè)或多個(gè)字段的值,可更改此默認(rèn)行為。在許多情況下,可使用DllImportAttribute來設(shè)置值。BestFitMapping啟用或禁用最佳匹配映射。CallingConvention指定用于傳遞方法參數(shù)的調(diào)用約定。默認(rèn)值為WinAPI,該值對應(yīng)于基于32位Intel的平臺的__stdcall。CharSet控制名稱重整以及將字符串參數(shù)封送到函數(shù)中的方式。默認(rèn)值為Ch

8、arSet.Ansi。EntryPoint指定要調(diào)用的DLL入口點(diǎn)

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。