.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精品视频|