å¤å¹´æ¥å¨ç¨åºè®¾è®¡é¢åå¾®è½¯ææ¯ä¸ç´å¼é¢çæ¯ä¸ªæ¶ä»£ï¼å¨æ¯ä¸ä»£çææ¯èå齿ç¸å ³ç卿ºï¼èè¿äºå¨æºåå ¶å®ç°ç»èå¾å¾æ¯å¤§é¨åçç¨åºè®¾è®¡è¯¾ç¨æ²¡ææ¶åçï¼ä½æ¯å¯¹äºæä»¬çè§£ç¸å ³çææ¯åååéè¦ï¼æ¬æå°å¯¹å ç§ç¸å ³ææ¯åéèå¨å¨æºèåçç»èåç®è¦çéè¿°ï¼ç®æ¯æç å¼çã
        COMææ¯äº1993年馿¬¡åå¸ï¼ç§°å¾ä¸æ¯å¾®è½¯ææ¯çä¸ä¸ªéç¨ç¢ï¼å ¶æä¹å¨äºä½¿ç»ä»¶ç¼ç¨åå¾ä»¥å®ç°ãCOMææ¯æåçææ³èµ·æºäºå°ç±»åæå¯éç¨çäºè¿å¶ç»ä»¶ï¼æç±»çå®ç°åæ¥å£å离以便æç±»çå®ç°å°è£ å°äºè¿å¶é²ç«å¢çèåï¼èè¿éé²ç«å¢ä»¥VPTRåVTBLçå½¢å¼ä¿è¯äºè¿ä¸ªé²ç«å¢çä¸åæ§ã.NETææ¯åå¨è¯è¨å±é¢ä¸æ¯æäºåºäºç»ä»¶çç¨åºè®¾è®¡ãç¸å¯¹äºCOMææ¯ï¼.NETææ¯å°±æ¯ä¸ºåºäºç»ä»¶çç¨åºè®¾è®¡èççï¼æä»¥å ¶ç¼ç æçåè¯è¨å¯è¯»æ§è¦é«åºCOMä¸ä¸ªç级ã使¯ç±äº1993年以åçåå¤å¹´æ¶é´éï¼äººä»¬å©ç¨åºäºCOMçç»ä»¶ç¨åºè®¾è®¡ææ¯å¼åäºå¤§éçé«å¤æåº¦ï¼é«å¯ç¨æ§ç代ç ï¼å¹¶ä¸ä»ä»¬è¿è¡è¯å¥½ï¼æçæé«ï¼å¦æç¨.NETææ¯éåè¿äºä»£ç ç®ç´å°±æ¯å¾ä¸å¿å¤±ï¼å ä¹å¨.NETçå®ç°è¿ç¨ä¸å¹¶ä¸æ¯ææçWindows APIé½è¢«éåï¼æäºåè½æ¯.NETæä¸è½å®æçãé¢å¯¹è¿æ ·çé®é¢ï¼Â .NETäºæä½ææ¯åºè¿èçï¼å¯è§éæ±ææ¯ææ¯çåå¨åã
        .NETäºæä½ææ¯ä¸»è¦å为3ç§ï¼P/Invokeï¼C++ Interopï¼COM Interopï¼å ¶ä¸P/Invoke 主è¦ç¨äºè°ç¨Cåºå½æ°åWindows APIãC++ Interopå主è¦ç¨äºManaged C++è°ç¨Â C++ç±»åºåæ ¸å¿ç®æ³åºï¼å®çè³å 许æç®¡ä»£ç åéæç®¡ä»£ç å¨åä¸ä¸ªæä»¶ä¸ã COM Interop主è¦å æ¬æ£åçRCWåååçCCWãä¸é¢ä»¥ä¸ä¸ªç®åçä¾åå¯¹äºæä½ä¸æ¯è¾éè¦çæ°æ®å°éè¿è¡ç®åçä»ç»ã
 å¦ä½å°éå符串ï¼P/Invokeæ¹å¼ï¼
å设éæç®¡ä»£ç å®ä¹å¦ä¸ï¼
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â,
CharSet = CharSet.Unicode,
CallingConvention =CallingConvention.Cdecl)
]
public extern static void stringMarshal (string inString, StringBuilder outString, int bufferSize);
Â
è¿éæå ç¹éè¦æ³¨æï¼
1.  å¨å£°æå½æ°æ¶å¿ é¡»è¦ç¨extern修饰符ï¼ç®çæ¯ä¸ºäºåè¯ç¼è¯å¨æ¤å½æ°æ¯å¤é¨å®ç°çï¼æ²¡ææ¹æ³ä½ï¼å æ¤ä¸éè¦å¨æç®¡ä»£ç ä¸æç´¢è¿ä¸ªå½æ°ã
2.  å¨å£°æå½æ°æ¶å¿ é¡»è¦ç¨static修饰符ï¼åå æ¯éæç®¡çDLL导åºçéæç®¡æ¹æ³é½æ¯å¯ä»¥ç´æ¥è°ç¨çï¼æ é对ç¸å ³çç±»è¿è¡å®ä¾åï¼å¤§é¨åæ åµä¸æ ¹æ¬å°±ä¸åå¨ç±»ã
3. å 为éæç®¡ä»£ç ä¸çå符串为wchar_t*ç±»åï¼æä»¥CharSetéè¦è®¾ç½®ä¸ºCharSet.Unicodeã
4. å 为éæç®¡ä»£ç çè°ç¨æ¹å¼ä¸º_cdeclï¼Â æä»¥æç®¡é¨åçCallingConventionéè¦è®¾ç½®ä¸ºCallingConvention.Cdeclï¼å¦å¤è¿ç§ç±»åçè°ç¨æ¹å¼æ¯è°ç¨æ¹è´è´£å¤çå æ ï¼æä»¥æ¯æå¯åç±»å忰彿°ä¾å¦printf()çäºæä½ã
5. è¾å ¥å符串éè¦å°è£ 为stringæ¯å 为è¿ä¸ªå符串å±äºåºå®å符串ï¼äºæä½è¿ç¨ä¸ä¸éè¦ååï¼èè¾åºå符串åéè¦å°è£ 为StringBuilderï¼å 为è¿ç§å符串é»è®¤ä¸ºå ·æIN/OUT屿§ï¼å ¶å 容å¯åï¼èä¸å½å符串ç»å¸¸éè¦ååæ¶æçé«ã
Â
æç®¡ä»£ç ä¸è°ç¨éæç®¡ä»£ç æ¹å¼å¦ä¸ï¼
 private static void TestStringMarshal ()
 {
            string inString = "Wally input test string.";
            int bufferSize = inString.Length;
            StringBuilder strbd = new StringBuilder(bufferSize);
            stringMarshal (inString, strbd, bufferSize + 1);
            Console.WriteLine("Wally Input string: {0}", inString);
            Console.WriteLine("Wally output string: {0}", strbd.ToString());
}
Â
æ»ç»
Â Â Â Â Â Â Â Â æ¬æç®è¦çä»ç»äº.NETæç®¡ä»£ç 忬å°éæç®¡ä»£ç çäºæä½ææ¯ï¼å¹¶å¯¹æ°æ®å°éçå®ç°ç»èåäºç®åç说æï¼å¸æå¯¹å¤§å®¶çææ¯æé«ææå¸®å©ï¼ç®æ¯æç å¼çï¼æå¾ å¤§å®¶å¨è¿æ¹é¢ååºæ´å¤æ´å¥½çæç« ã
æ¥èªï¼http://www.cnblogs.com/pugang/archive/2010/04/21/1717206.html