å¦ä½å¨C#ä¸ç´æ¥æä½C++ç»æä½ ããå¨C#ä¸è°ç¨C++æç³»ç»DLLæ¯æ¯è¾å¸¸è§çæä½ã
ããä¾å¦C++ä¸å®ä¹ç以ä¸ç»æä½ï¼

struct  RCEStructÂ
{
 int Event;  Â
 int Flag;    Â
 char User[40];
} ; ããåæ¶æä¸ä¸ªå ¬å¼æ¹æ³ï¼
ããextern "C" __declspec WORD CALLBACK GetStruct(RCEStruct* pEventStruc);
ããæä»¬å°å®ç¼è¯ä¸º MyCppDll.DLL
ããé£ä¹æä»¬å¨C#ä¸å¯ä»¥ç´æ¥å®ä¹ç¸åçç»æä½åå¼ç¨GetStruct:
[StructLayout(LayoutKind.Sequential)]

public  struct  RCEStructÂ
{
    public int Event;
    public int Flag;
    public char[40] User;
}
[DllImport( " MyCppDll.dll " , CharSet = CharSet.Auto)]
public  static  extern  int  GetStruct(RCEStruct rce);
ããæ³¨æC#éå®ä¹çç»æä½åºè¯¥åC++éå®ä¹ç䏿 ·ãè¿é妿æ¯public string Userå°±æå¯è½åºé(å ·ä½ææ²¡è¯è¿ï¼ä¸ç¥éC#æ¯å¦ä¼èªå¨å°char[]转å为stringï¼å¦å¤è¿è¦æ³¨æï¼å¨C#ä¸ä¸ºUserèµå¼æ¶ï¼é¿åº¦ä¸åºè¶ è¿40)ã
ããéè¿è¿ç§æ¹å¼æä»¬å°±å¯ä»¥åC++ä¼ éæè è·å¾ç»æä½ãä½ä¸ä¸ªéå¶å°±æ¯å¿ é¡»å¨C#端主å¨è°ç¨GetStruct()
ããè¿æä¸ç§æ åµï¼ä¸ä¸ä¸ç§ç¸åï¼å°±æ¯æä»¬ä¸æ¯å¸æå¨C#ä¸è°ç¨C++ç±»åºï¼èæ¯æ³å¨C++ç±»åºä¸è°ç¨æä»¬å·²ç»å好çC#ç±»åºãè¿å¨æç®¡C++鿝å¯ä»¥å®ç°çãå ¶ä¸ä¸ä¸ªåºç¨æ¡ä¾å°±æ¯å¨ä¸ºç¬¬ä¸æ¹ç³»ç»åC++æä»¶çæ¶åï¼æä»¬å¿ é¡»å¨æä»¶ç«¯ä¸»å¨è°ç¨C#ç±»åºï¼åææ¯æä»¬éè¦ä½¿ç¨å®ï¼é¤éæä»¬å®å ¨ç¨C++ä»£ç æ¥åè¿ä¸ªæä»¶ï¼ã
ããè¿æ ·çè¯æä»¬åºè¯¥æ¯å¨C#ç±»åºå ¬å¼æ¹æ³ï¼ä¾å¦ï¼

public  struct  RCEStructÂ
{
    public int Event;
    public int Flag;
    public string User;
}

public  void  DoSomething(RCEStruct rce)
{
    rce.Flag++;
} ããåå®ç¼è¯æ MyCSharpDll.DLL
ããC++端代ç å¦ä¸ï¼
# using    < mscorlib.dll >
# using    < CuteSuProc.dll >

void  SomeMethod(RCEStruct *  pEventStruc)
{
    // å°C++ç»æä½èµå¼å°C#ç»æä½
    MyCSharpDll::RCEStruct* csStruct;
    csStruct->Event = pEventStruc.Event;
    csStruct->Flag = pEventStruc.Flag;
    // csStruct->User ?? å°charè½¬æ¢æstringï¼å¨C++éå¦ä½å¤çï¼
    MyCSharpDll::DoSomething(csStruct);
    // å°C#ç»æä½èµå¼å°C++ç»æä½
    // å 为 pEventStruc ç±å¤çä¼ å ¥ï¼è¢«Â DoSomethingÂ æ¹æ³ä¿®æ¹åï¼å¯è½ä»éè¦å¤çç¥é
    pEventStruc->Event = csStruct.Event;
    pEventStruc->Flag = csStruct.Flag;
    // pEventStruc->User ?? å°stringè½¬æ¢æchar[]
} ããæç®¡C++å¨å¤ç.NETç±»åºæ¶ï¼æäºç»èæ¯å¾ç¹ççï¼è®©äººè§å¾æäºæä¹ãè¬å¦å¾å¤å°æ¹è¦å __gc修饰符ãè¿æåæ°ç»ï¼å符串ç转æ¢é½æ¯è¾éº»ç¦ãæä»¥ä¸é¢ä»£ç å¯è½ä¼æäºå°é误ãä½å¤§è´ææå°±æ¯è¿æ ·ã徿æ¾ï¼è¿æ ·çåæ³é常麻ç¦ãå¯¹ç»æä½è¿è¡æä½åï¼æä»¬è¿è¡ä¸æ¬¡èµå¼ï¼æä½åï¼åè¿è¡ä¸æ¬¡èµå¼ã
ããææ²¡æåæ³ç´æ¥è®©C#æä½åå§çç»æä½å¢ï¼å°±åC#䏿ä½C++䏿 ·ï¼ä¸éè¦éè¿ä¸ä¸ªä¸é´äººï¼è½ä¸è½ç´æ¥è¿æ ·ï¼
# using    < mscorlib.dll >
# using    < CuteSuProc.dll >

void  SomeMethod(RCEStruct *  pEventStruc)
{
    MyCSharpDll::DoSomething(pEventStruc);
} ããçæ¡æ¯å¦å®çãæä»¬æ²¡æåæ³ç´æ¥å°C++éç RCEStruct转æ¢ä¸º C#éç RCEStructã
ããé£ä¹è¿å©ä¸ç§æ¹æ³ï¼å°±æ¯ç´æ¥å¯¹å åè¿è¡æä½ãå 为æ¯ç»æä½ï¼ä»ä»¬è¯å®æ¯ä¿åå¨è¿ç»å å空é´ä¸çã
ããæä»¬å æ¥ççC#ä¸å¦ä½æä½å åï¼ä¹å°±æ¯éæç®¡çæ°æ®ãè¿éè¦å¼ç¨System.Runtime.InteropServiceså½å空é´ã该å½å空é´ä¸çMarshalçä¸äºéææ¹æ³æä¾äºè¿æ ·çåè½ï¼
Marshal.ReadInt32()            // 仿å®å åå°å读å4ä½
Marshal.PtrToStringAnsi()    // 仿å®å åå°å读åå符串
Marshal.WriteInt32()        // å°æ´æ°åå°æå®å åå°å
Marshal.WriteByte()            // å°å符串åå°æå®å åå°å ããæä»¬æ¥ççå ·ä½ç代ç ï¼
using  System;
using  System.Text;
using  System.Runtime.InteropServices;

internal  sealed  class  RCEventÂ
{
    public int Event;
    public int Flag;
    public string User;
} ;

internal  sealed  class  RCEventAgentÂ
{
    internal static RCEvent Read(IntPtr ptr)
{
        RCEvent Event = new RCEvent();
       Â
        Event.Event = ReadEvent(ptr);
        Event.Flag = ReadFlag(ptr);
        Event.User = ReadUser(ptr);
        return Event;
    }
    internal static int ReadEvent(IntPtr basePtr)Â
{
        return Marshal.ReadInt32(basePtr);
    }
    internal static int ReadFlag(IntPtr basePtr)Â
{
        return Marshal.ReadInt32(basePtr,4);
    }
    internal static string ReadUser(IntPtr basePtr)Â
{
        return Marshal.PtrToStringAnsi(new IntPtr(basePtr.ToInt32() + 8));
    }
    internal static void Write(ClientEvent Event,IntPtr ptr)Â
{
        WriteEvent(ptr,Event.Event);
        WriteFlag(ptr,Event.Flag);
        WriteUser(ptr,Event.User);
    }
    internal static void WriteEvent(IntPtr basePtr,int value)Â
{
        Marshal.WriteInt32(basePtr,value);
    }
    internal static void WriteFlag(IntPtr basePtr,int flag)Â
{
        Marshal.WriteInt32(basePtr,4,flag);
    }
    internal static void WriteUser(IntPtr basePtr,string user)Â
{
        WriteString(basePtr,user,8,40);
    }
    private static void WriteString(IntPtr basePtr,string value,int offset,int length)Â
{
        int pos = 0;
        byte[] bytes = Encoding.Default.GetBytes(value);
        while(pos < length)Â
{
            if (pos < bytes.Length)
                Marshal.WriteByte(basePtr,offset,bytes[pos]);
            else
                Marshal.WriteByte(basePtr,offset,0);
            pos ++;
            offset ++;
        }
    }
} ããè¿æ ·æä»¬å°±å¯ä»¥éè¿ReadEventåWriteEventç´æ¥å¨c#ä¸å¤çè¯¥ç»æä½ãæè éè¿ ReadXXX() å WriteXXX() ç´æ¥ä¿®æ¹å ¶å段ã

public  void  DoSomething(IntPtr ptr)
{
    RCEvent Event = RCEventAgent.Read(ptr);
    Event.Flag ++;
    RCEventAgent.Write(ptr, Event);
    // æè 以ä¸ä»£ç
    // RCEventAgent.WriteFlag( ptr, RCEventAgent.ReadFlag(ptr) + 1 );
} ããC++ä¸åå¯ä»¥ç´æ¥å°ç»æä½å°åä¼ ç»C#ï¼
# using    < mscorlib.dll >
# using    < CuteSuProc.dll >

void  SomeMethod(RCEStruct *  pEventStruc)
{
    MyCSharpDll::DoSomething(pEventStruc);
} Â