日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺談.NET互操作技術(shù)重點(diǎn)托管代碼

 多年來在程序設(shè)計(jì)領(lǐng)域微軟技術(shù)一直引領(lǐng)著每個時代,在每一代的技術(shù)背后都有相關(guān)的動機(jī),而這些動機(jī)及其實(shí)現(xiàn)細(xì)節(jié)往往是大部分的程序設(shè)計(jì)課程沒有涉及的,但是對于我們理解相關(guān)的技術(shù)又十分重要,本文將對幾種相關(guān)技術(shù)和隱藏在動機(jī)背后的細(xì)節(jié)做簡要的闡述,算是拋磚引玉。

創(chuàng)新互聯(lián)公司是一家以成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站推廣、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為廣告制作等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。

COM技術(shù)于1993年首次發(fā)布,稱得上是微軟技術(shù)的一個里程碑,其意義在于使組件編程化得以實(shí)現(xiàn)。COM技術(shù)最初的思想起源于將類做成可重用的二進(jìn)制組件,把類的實(shí)現(xiàn)和接口分離以便把類的實(shí)現(xiàn)封裝到二進(jìn)制防火墻的背后,而這道防火墻以VPTR和VTBL的形式保證了這個防火墻的不變性。.NET技術(shù)則在語言層面上支持了基于組件的程序設(shè)計(jì)。相對于COM技術(shù),.NET技術(shù)就是為基于組件的程序設(shè)計(jì)而生的,所以其編碼效率和語言可讀性要高出COM一個等級。但是由于1993年以后的十多年時間里,人們利用基于COM的組件程序設(shè)計(jì)技術(shù)開發(fā)了大量的高復(fù)雜度,高可用性的代碼,并且他們運(yùn)行良好,效率極高,如果用.NET技術(shù)重寫這些代碼簡直就是得不償失,加之在.NET的實(shí)現(xiàn)過程中并不是所有的Windows API都被重寫,有些功能是.NET所不能完成的。面對這樣的問題, .NET互操作技術(shù)應(yīng)運(yùn)而生,可見需求才是技術(shù)的原動力。

.NET互操作技術(shù)主要分為3種,P/Invoke,C++ Interop,COM Interop,其中P/Invoke 主要用于調(diào)用C庫函數(shù)和Windows API。C++ Interop則主要用于Managed C++調(diào)用 C++類庫和核心算法庫,它甚至允許托管代碼和非托管代碼在同一個文件中。 COM Interop主要包括正向的RCW和反向的CCW。下面以一個簡單的例子對互操作中比較重要的數(shù)據(jù)封送進(jìn)行簡單的介紹。

如何封送字符串(P/Invoke方式)

假設(shè)非托管代碼定義如下:

 
 
  1. void _cdecl stringMarshal( const wchar_t* inString,  wchar_t* outString, int buffersize)
  2. {
  3.     If(NULL != inString)
  4. {
  5.     wcscpy_s(outString, buffersize, inString);
  6. }
  7. }

這段代碼編譯生成的文件名為:stringMarshal.dll

在托管代碼中其托管定義如下:

 
 
  1. [DllImport
  2. (“stringMarshal.dll”,
  3. CharSetCharSet = CharSet.Unicode,
  4. CallingConventionCallingConvention =CallingConvention.Cdecl)
  5. ]
  6. public extern static void stringMarshal (string inString, StringBuilder outString, int bufferSize);

這里有幾點(diǎn)需要注意:

1.  在聲明函數(shù)時必須要用extern修飾符,目的是為了告訴編譯器此函數(shù)是外部實(shí)現(xiàn)的,沒有方法體,因此不需要在托管代碼中搜索這個函數(shù)。

2.  在聲明函數(shù)時必須要用static修飾符,原因是非托管的DLL導(dǎo)出的非托管方法都是可以直接調(diào)用的,無需對相關(guān)的類進(jìn)行實(shí)例化,大部分情況下根本就不存在類。

3. 因?yàn)榉峭泄艽a中的字符串為wchar_t*類型,所以CharSet需要設(shè)置為CharSet.Unicode。

4. 因?yàn)榉峭泄艽a的調(diào)用方式為_cdecl, 所以托管部分的CallingConvention需要設(shè)置為CallingConvention.Cdecl,另外這種類型的調(diào)用方式是調(diào)用方負(fù)責(zé)處理堆棧,所以支持可變類型參數(shù)函數(shù)例如printf()的互操作。

5. 輸入字符串需要封裝為string是因?yàn)檫@個字符串屬于固定字符串,互操作過程中不需要變化,而輸出字符串則需要封裝為StringBuilder,因?yàn)檫@種字符串默認(rèn)為具有IN/OUT屬性,其內(nèi)容可變,而且當(dāng)字符串經(jīng)常需要變化時效率高。

托管代碼中調(diào)用非托管代碼方式如下:

 
 
  1. private static void TestStringMarshal ()
  2.  {
  3.     string inString = "Wally input test string.";
  4.     int bufferSize = inString.Length;
  5.     StringBuilder strbd = new StringBuilder(bufferSize);
  6.     stringMarshal (inString, strbd, bufferSize + 1);
  7.     Console.WriteLine("Wally Input string: {0}", inString);
  8.     Console.WriteLine("Wally output string: {0}", strbd.ToString());
  9. }

總結(jié)

本文簡要的介紹了.NET托管代碼和本地非托管代碼的互操作技術(shù),并對數(shù)據(jù)封送的實(shí)現(xiàn)細(xì)節(jié)做了簡單的說明,希望對大家的技術(shù)提高有所幫助,算是拋磚引玉,期待大家在這方面寫出更多更好的文章。


網(wǎng)站題目:淺談.NET互操作技術(shù)重點(diǎn)托管代碼
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/cojeeid.html