Interop-Pass-Struktur von c # nach c ++

c # code:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct Message
{
    public uint MsgId;
    public uint DLC;
    public uint Handle;
    public uint Interval;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] Data;
};

Ich muss diese Struktur wie folgt an eine Funktion in der C ++ nativen .dll senden:

    [DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
    [return: MarshalAs(UnmanagedType.U4)]
    public static extern int AFT_iSetRTSECANWrapper(IntPtr Data);

Ich bereite den Puffer so vor:

        Message frame = new Message();
        frame.MsgId = (uint)MsgId;
        frame.DLC = (uint)DLC;
        frame.Interval = (uint)Interval;

        frame.Data = new byte[64];

        for (int i = 0; i < Data.Length; i++)
        {
            frame.Data[i] = 11;
        }

        //Transmit message 
        int rawsize = Marshal.SizeOf(frame);
        IntPtr frameBuffer = Marshal.AllocHGlobal(rawsize);
        Marshal.StructureToPtr(frame, frameBuffer, false);

         AFT_iSetRTSECANWrapper(frameBuffer);

In C ++ habe ich folgende Struktur:

    typedef  struct { 
unsigned int MsgId;
unsigned int DLC;
unsigned int Handle;
unsigned int Interval;
    unsigned char Data[64]; 
 } Message;

und die anzurufende Funktion ist dies:

    extern "C" __declspec(dllexport) int AFT_iSetRTSECANWrapper(Message *data)

After this i simply try to access the fields in the Message with data->DLC but i got nothing. I can't figure out what's the problem here.

0
Ich sehe nichts falsch. Was bedeutet "ich habe nichts"? Verwenden Sie den Debugger, um nach "Daten" zu suchen, Sie sollten zumindest die 0x0b Byte-Werte im Array sehen.
hinzugefügt der Autor Hans Passant, Quelle
sizeof (char) == sizeof (byte), also sollte es "unsigned char Data [8]" sein.
hinzugefügt der Autor Matt, Quelle

1 Antworten

Ich vermute, dass die Daten nicht im selben zusammenhängenden Abschnitt wie der Rest der Struktur zugewiesen sind, so dass sie nicht übertragen wird. Versuchen

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct Message
{
    public uint MsgId;
    public uint DLC;
    public uint Handle;
    public uint Interval;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] Data = new byte[64];
};

Für das C ++ - Bit, anstatt auf ein intptr zu übertragen, übertragen Sie direkt

[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.U4)]
public static extern int AFT_iSetRTSECANWrapper([in,out] Message Data);

Senden Sie Ihre Nachricht als

Message frame = new Message();
frame.MsgId = (uint)MsgId;
frame.DLC = (uint)DLC;
frame.Interval = (uint)Interval;
for (int i = 0; i < Data.Length; i++)
{
    frame.Data[i] = 11;
}

//Transmit message 
AFT_iSetRTSECANWrapper(frame);
0
hinzugefügt