2016-05-26 13 views
1

Ich möchte einige Daten von C# nach C++ übergeben. Diese Daten bestehen aus struct und guid. Da guid Klasse ist, habe ich mich entschieden, sie sofort nach den struct-Daten zu kopieren. Gibt es einen besseren Weg, dies zu tun? Diese Lösung funktioniert und Daten werden in C++ korrekt gelesen, aber ich bin etwas besorgt, ob es Fälle gibt, in denen dies nicht funktionieren würde.Marshalled Struktur gefolgt von Daten fester Größe

Struct:

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
struct TEST_STRUCT 
{ 
    public Uint32 var1; 
    public Uint32 var2; 
} 

Verwendung:

TEST_STRUCT testStruct = new TEST_STRUCT(); // filled somewhere 
byte [] guid; // defined above 

IntPtr mem = Marshal.AllocHGlobal(Marshal.SizeOf(testStruct.GetType()) + guid.Length); 
try 
{ 
    Marshal.StructureToPtr(testStruct, mem, false); 
    Marshal.Copy(guid, 0, new IntPtr(mem.ToInt64() + Marshal.SizeOf(testStruct.GetType())), guid.Length); 

    // send data to c++ ... 
} 
finally 
{ 
    Marshal.FreeHGlobal(mem); 
} 
+0

Sie sind richtig, Daten wurden korrekt übertragen. Kannst du es separat posten, damit ich es als Antwort markieren kann? – Geralt

Antwort

1

Sie werden mit ihm in diesem sehr speziellen Fall weg, eine GUID haben keine Ausrichtung erforderlich. Die Struktur ist immer 24 Byte lang.

Aber es hat keinen Sinn, es auf diese Weise zu tun, der pinvoke marshaller weiß, wie man System.Guid korrekt marshallt. Es ist ein Werttyp (eine Struktur), keine Klasse, wie Sie angenommen haben, und seine interne Struktur ist bewusst klobig, so dass es genau einer nativen GUID entspricht. Etwas, das Sie zum Beispiel von der Reference Source sehen können. Das war sehr beabsichtigt, Guids sind wichtig in Interop, COM-Code insbesondere verwendet sie stark.

Also alles, was man braucht:

struct TEST_STRUCT 
{ 
    public Uint32 var1; 
    public Uint32 var2; 
    public Guid guid; 
} 

ich das absichtlich weggelassen [StructLayout] Attribut, es ist nicht notwendig, und die Verpackung muss nicht optimiert werden.

Verwandte Themen