.NET互操作技術(shù)的三種方式
2010/11/9 15:44:03

  
  .NET互操作技術(shù)主要分為3種,P/Invoke,C++ Interop,COM Interop,其中P/Invoke 主要用于調(diào)用C庫(kù)函數(shù)和Windows API。C++ Interop則主要用于Managed C++調(diào)用 C++類(lèi)庫(kù)和核心算法庫(kù),它甚至允許托管代碼和非托管代碼在同一個(gè)文件中。 COM Interop主要包括正向的RCW和反向的CCW。

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

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

  void _cdecl stringMarshal( const wchar_t* inString, wchar_t* outString, int buffersize) { If(NULL != inString) { wcscpy_s(outString, buffersize, inString); } }

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

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

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

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

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

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

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

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

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

返回列表
返回首頁(yè) 主站蜘蛛池模板: 久久无码无码久久综合综合| 免费高清日本完整版| 5╳社区视频在线5sq| 好男人看片在线视频观看免费观看| 久久精品国产亚洲香蕉| 欧美日韩一区二区不卡三区| 免费人成动漫在线播放r18| 色爱无码av综合区| 国产无遮挡又黄又爽高清视| 91精品国产91久久久久青草| 好男人在线社区www| 中文字幕永久更新| 日韩有码第一页| 亚洲一线产区二线产区精华| 污视频网站在线观看免费| 啊灬啊别停灬用力啊呻吟| 青青青青啪视频在线观看| 国产精品久久久久久久久久久不卡 | 亚洲一区二区三区高清| 毛片网站在线观看| 免费a级毛片无码| 精品国产人成亚洲区| 国产AV日韩A∨亚洲AV电影| 韩国精品视频在线观看| 国产日产久久高清欧美一区| 在线日本妇人成熟| 国内最真实的XXXX人伦| avtom影院入口永久在线app| 小h片在线播放| 中国又粗又大又爽的毛片| 无码人妻一区二区三区免费视频| 久久机热re这里只有精品15| 最好看的免费观看视频| 亚洲а∨天堂久久精品| 欧美在线看片a免费观看| 亚洲欧美日韩精品中文乱码| 特级毛片免费观看视频| 免费又黄又爽又猛的毛片| 精品免费人成视频APP| 噜噜噜亚洲色成人网站| 色妞妞www精品视频|