欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中互操作性簡(jiǎn)介

 更新時(shí)間:2020年07月23日 10:45:47   作者:Learning hard  
這篇文章主要介紹了C#中互操作性的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

一、引言

   這個(gè)系列是在C#基礎(chǔ)知識(shí)中遺留下來的一個(gè)系列的,因?yàn)樵贑# 4.0中的一個(gè)新特性就是對(duì)COM互操作改進(jìn),然而COM互操作性卻是.NET平臺(tái)下其中一種互操作技術(shù),為了幫助大家更好的了解.NET平臺(tái)下的互操作技術(shù),所以才有了這個(gè)系列。然而有些朋友們可能會(huì)有這樣的疑問——“為什么我們需要掌握互操作技術(shù)的呢?” 對(duì)于這個(gè)問題的解釋就是——掌握了.NET平臺(tái)下的互操作性技術(shù)可以幫助我們?cè)?NET中調(diào)用非托管的dll和COM組件。.NET是建立在操作系統(tǒng)的之上的一個(gè)開發(fā)框架,其中.NET 類庫(kù)中的類也是對(duì)Windows API的抽象封裝,然而.NET類庫(kù)不可能對(duì)所有Windows API進(jìn)行封裝,當(dāng).NET中沒有實(shí)現(xiàn)某個(gè)功能的類,然而該功能在Windows API被實(shí)現(xiàn)了,此時(shí)我們完全沒必要去自己在.NET中自定義個(gè)類,這時(shí)候就可以調(diào)用Windows  API 中的函數(shù)來實(shí)現(xiàn),此時(shí)就涉及到托管代碼與非托管代碼的交互,此時(shí)就需要使用到互操作性的技術(shù)來實(shí)現(xiàn)托管代碼和非托管代碼更好的交互。.NET 平臺(tái)下提供了3種互操作性的技術(shù):

  1. Platform Invoke(P/Invoke),即平臺(tái)調(diào)用,主要用于調(diào)用C庫(kù)函數(shù)和Windows API
  2. C++ Introp, 主要用于Managed C++(托管C++)中調(diào)用C++類庫(kù)
  3. COM Interop, 主要用于在.NET中調(diào)用COM組件和在COM中使用.NET程序集。

下面就對(duì)這3種技術(shù)分別介紹下。                                                           

二、平臺(tái)調(diào)用

  使用平臺(tái)調(diào)用的技術(shù)可以在托管代碼中調(diào)用動(dòng)態(tài)鏈接庫(kù)(Dll)中實(shí)現(xiàn)的非托管函數(shù),如Win32 Dll和C/C++ 創(chuàng)建的dll??吹竭@里,有些朋友們應(yīng)該會(huì)有疑問——在怎樣的場(chǎng)合我們可以使用平臺(tái)調(diào)用技術(shù)來調(diào)用動(dòng)態(tài)鏈接庫(kù)中的非托管函數(shù)呢?

  這個(gè)問題就如前面引言中說講到的一樣,當(dāng)在開發(fā)過程中,.NET類庫(kù)中沒有提供相關(guān)API然而Win32 API 中提供了相關(guān)的函數(shù)實(shí)現(xiàn)時(shí),此時(shí)就可以考慮使用平臺(tái)調(diào)用的技術(shù)在.NET開發(fā)的應(yīng)用程序中調(diào)用Win32 API中的函數(shù);

  然而還有一個(gè)使用場(chǎng)景就是——由于托管代碼的效率不如非托管代碼,為了提高效率,此時(shí)也可以考慮托管代碼中調(diào)用C庫(kù)函數(shù)。

2.1 在托管代碼中通過平臺(tái)調(diào)用來調(diào)用非托管代碼的步驟

(1).  獲得非托管函數(shù)的信息,即dll的名稱,需要調(diào)用的非托管函數(shù)名等信息

(2). 在托管代碼中對(duì)非托管函數(shù)進(jìn)行聲明,并且附加平臺(tái)調(diào)用所需要屬性

(3). 在托管代碼中直接調(diào)用第二步中聲明的托管函數(shù)

2.2 平臺(tái)調(diào)用的調(diào)用過程

(1)  查找包含該函數(shù)的DLL,當(dāng)需要調(diào)用某個(gè)函數(shù)時(shí),當(dāng)然第一步就需要知道包含該函數(shù)的DLL的位置,所以平臺(tái)調(diào)用的第一步也就是查找DLL,其實(shí)在托管代碼中調(diào)用非托管代碼的調(diào)用過程可以想象成叫某個(gè)人做事情,首先我們要找到那個(gè)人在哪里(即查找函數(shù)的DLL過程),找到那個(gè)人之后需要把要做的事情告訴他(相當(dāng)于加載DLL到內(nèi)存中和傳入?yún)?shù)),最后讓他去完成需要完成的事情(相當(dāng)于讓非托管函數(shù)去執(zhí)行任務(wù))。

(2) 將找到的DLL加載到內(nèi)存中。

(3) 查找函數(shù)在內(nèi)存中的地址并把其參數(shù)推入堆棧,來封送所需的數(shù)據(jù)。CLR只會(huì)在第一次調(diào)用函數(shù)時(shí),才會(huì)去查找和加載DLL,并查找函數(shù)在內(nèi)存中的地址。當(dāng)函數(shù)被調(diào)用過一次之后,CLR會(huì)將函數(shù)的地址緩存起來,CLR這種機(jī)制可以提高平臺(tái)調(diào)用的效率。在應(yīng)用程序域被卸載之前,找到的DLL都一直存在于內(nèi)存中。

(4) 執(zhí)行非托管函數(shù)。

平臺(tái)調(diào)用的過程可以通過下圖更好地理解:

三、C++ Interop

  第二部分主要向大家介紹了第一種互操作性技術(shù),然后我們也可以使用C++ Interop技術(shù)來實(shí)現(xiàn)與非托管代碼進(jìn)行交互。然而C++ Interop 方式有一個(gè)與平臺(tái)調(diào)用不一樣的地方,就是C++ Interop 允許托管代碼和非托管代碼存在于一個(gè)程序集中,甚至同一個(gè)文件中。C++ Interop 是在源代碼上直接鏈接和編譯非托管代碼來實(shí)現(xiàn)與非托管代碼進(jìn)行互操作的,而平臺(tái)調(diào)用是加載編譯后生成的非托管DLL并查找函數(shù)的入口地址來實(shí)現(xiàn)與非托管函數(shù)進(jìn)行互操作的。C++ Interop使用托管C++來包裝非托管C++代碼,然后編譯生成程序集,然后再托管代碼中引用該程序集,從而來實(shí)現(xiàn)與非托管代碼的互操作。 關(guān)于具體的使用和與平臺(tái)調(diào)用的比較,這里就不多介紹,我將會(huì)在后面的專題中具體介紹。

四、COM Interop

  COM(Component Object Model,組件對(duì)象模型)是微軟之前推薦的一個(gè)開發(fā)技術(shù),由于微軟過去十多年里面開發(fā)了大量的COM組件,然而不可能在使用.NET技術(shù)重寫這些COM組件實(shí)現(xiàn)的功能,所以為了解決在.NET中的托管代碼能夠調(diào)用COM組件的問題,.NET 平臺(tái)下提供了COM Interop,即COM互操作技術(shù),COM Interop不僅支持在托管代碼中使用COM組件,而且還支持想CMO組件功能托管對(duì)象。下面就這兩種支持分別做一個(gè)介紹。

4.1 在.NET中使用COM組件

 在.NET中使用COM對(duì)象,主要有3種方法:

  1. 使用TlbImp工具為COM組件創(chuàng)建一個(gè)互操作程序集來綁定早期的COM對(duì)象,這樣就可以在程序中添加互操作程序集來調(diào)用COM對(duì)象
  2. 通過反射來后期綁定COM對(duì)象
  3. 通過P/Invoke創(chuàng)建COM對(duì)象或使用C++ Interop為COM對(duì)象編寫包裝類

但是我們經(jīng)常使用的都是方法一,下面介紹下使用方法一在.NET 中使用COM對(duì)象的步驟:

      1.找到要使用的COM 組件并注冊(cè)它。使用 regsvr32.exe 注冊(cè)或注銷 COM DLL。                               
      2.在項(xiàng)目中添加對(duì) COM 組件或類型庫(kù)的引用。                            

  • 添加引用時(shí),Visual Studio 會(huì)用到Tlbimp.exe(類型庫(kù)導(dǎo)入程序),Tlbimp.exe程序?qū)⑸梢粋€(gè) .NET Framework 互操作程序集。該程序集又稱為運(yùn)行時(shí)可調(diào)用包裝 (RCW),其中包含了包裝COM組件中的類和接口。Visual Studio 將生成組件的引用添加至項(xiàng)目。                             

      3. 創(chuàng)建RCW中類的實(shí)例,這樣就可以使用托管對(duì)象一樣來使用COM對(duì)象。

下面通過一個(gè)圖更好地說明在.NET中使用COM組件的過程:

4.2 在COM中使用.NET程序集

   .NET 公共語(yǔ)言運(yùn)行時(shí)通過COM可調(diào)用包裝(COM Callable Wrapper,即CCW)來完成與COM類型庫(kù)的交互。CCW可以使COM客戶端認(rèn)為是在與普通的COM類型交互,同時(shí)使.NET組件認(rèn)為它正在與托管應(yīng)用程序交互。在這里CCW是非托管COM客戶端與托管對(duì)象之間的一個(gè)代理。 CCW既可以維護(hù)托管對(duì)象的生命周期,也負(fù)責(zé)數(shù)據(jù)類型在COM和.NET之間的相互轉(zhuǎn)換。實(shí)現(xiàn)在COM使用.NET 類型的基本步驟如:

1. 在C#項(xiàng)目中添加互操作特性

     可以修改C#項(xiàng)目屬性使程序集對(duì)COM可見。右鍵解決方案選擇屬性,在“應(yīng)用程序標(biāo)簽”中選擇“程序集信息”按鈕,在彈出的對(duì)話框中選擇 “使程序集COM可見” 選項(xiàng),如下圖所示:

2. 生成COM類型庫(kù)并對(duì)它進(jìn)行注冊(cè)以供COM客戶端使用

 在“生成”標(biāo)簽中,選中 “為COM互操作注冊(cè)”選項(xiàng),如下圖:

  勾選“為COM互操作注冊(cè)”選項(xiàng)后,Visual Studio會(huì)調(diào)用類型庫(kù)導(dǎo)出工具(Tlbexp.exe)為.NET程序集生成COM類型庫(kù)再使用程序集注冊(cè)工具(Regasm.exe)來完成對(duì).NET程序集和生成的COM類型庫(kù)進(jìn)行注冊(cè),這樣COM客戶端可以使用CCW服務(wù)來對(duì).NET對(duì)象進(jìn)行調(diào)用了。

五、總結(jié)

  介紹到這里,本專題的內(nèi)容就結(jié)束,本專題主要對(duì).NET 提供的互操作的技術(shù)做了一個(gè)總的概括,在后面的專題中將會(huì)對(duì)具體的技術(shù)進(jìn)行詳細(xì)的介紹和給出一些簡(jiǎn)單的使用例子。

以上就是C#中互操作性簡(jiǎn)介的詳細(xì)內(nèi)容,更多關(guān)于c# 互操作性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中調(diào)用命令行cmd開啟wifi熱點(diǎn)的實(shí)例代碼

    C#中調(diào)用命令行cmd開啟wifi熱點(diǎn)的實(shí)例代碼

    最近想在win7上開啟wifi熱點(diǎn),于是就弄出下面這個(gè)小東西,里面涉及如何在控制臺(tái)上輸入命令,分享一下。首先在VS中創(chuàng)建一個(gè)window窗口,然后創(chuàng)建兩個(gè)四個(gè)button,兩個(gè)輸入框
    2013-04-04
  • C#連接Oracle的方法實(shí)例總結(jié)

    C#連接Oracle的方法實(shí)例總結(jié)

    這篇文章主要介紹了C#連接Oracle的方法,結(jié)合實(shí)例形式總結(jié)分析了幾種常見的C#連接Oracle數(shù)據(jù)庫(kù)的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-06-06
  • C#利用delegate實(shí)現(xiàn)Javascript的each方法

    C#利用delegate實(shí)現(xiàn)Javascript的each方法

    這篇文章主要為大家介紹了介紹了C#利用delegate實(shí)現(xiàn)Javascript的each方法,感興趣的朋友可以參考一下
    2016-01-01
  • C#實(shí)現(xiàn)動(dòng)態(tài)圖標(biāo)閃爍顯示的示例代碼

    C#實(shí)現(xiàn)動(dòng)態(tài)圖標(biāo)閃爍顯示的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)動(dòng)態(tài)圖標(biāo)閃爍顯示的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • C#實(shí)現(xiàn)打印與打印預(yù)覽功能的思路及代碼

    C#實(shí)現(xiàn)打印與打印預(yù)覽功能的思路及代碼

    這篇文章主要介紹了C#實(shí)現(xiàn)打印與打印預(yù)覽功能的思路及代碼,有需要的朋友可以參考一下
    2013-12-12
  • C#操作windows注冊(cè)表的方法

    C#操作windows注冊(cè)表的方法

    這篇文章主要介紹了C#操作windows注冊(cè)表的方法,涉及C#針對(duì)注冊(cè)表的讀取與寫入技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • c#圖片處理之圖片裁剪成不規(guī)則圖形

    c#圖片處理之圖片裁剪成不規(guī)則圖形

    最近項(xiàng)目要求實(shí)現(xiàn)不規(guī)則裁剪功能。本來想用html5的canvas在前端實(shí)現(xiàn)的,但是發(fā)現(xiàn)有點(diǎn)困難,以下為C#端對(duì)圖對(duì)片的處理
    2014-05-05
  • C#實(shí)現(xiàn)加密bat文件的示例詳解

    C#實(shí)現(xiàn)加密bat文件的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)加密bat文件的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • C#?時(shí)間戳轉(zhuǎn)換實(shí)例

    C#?時(shí)間戳轉(zhuǎn)換實(shí)例

    本文主要介紹了C#?時(shí)間戳轉(zhuǎn)換實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 仿orm自動(dòng)生成分頁(yè)SQL分享

    仿orm自動(dòng)生成分頁(yè)SQL分享

    平時(shí)接觸的數(shù)據(jù)庫(kù)有sql2000-2008,Oracle,SQLite 。 分頁(yè)邏輯,Oracle和SQLite相對(duì)好寫,就SQL事多,Sql2000下只能用top,排序2次,而Sql2005+就可以使用ROW_NUMBER()分析函數(shù)了,據(jù)說Sql2012對(duì)分頁(yè)又有了改進(jìn)
    2014-01-01

最新評(píng)論