2009-08-06 4 views
7

Sie haben eine Struktur, die ein Byte-ArrayRangierung eine unbekannte Größe Array

byte[] 

jedoch die Größe des Arrays hängt von der Bild führt Sie einreichen (widthxheight)

So ... wie tun Sie

[MarshalAs(UnmanagedType.ByValArray, SizeConst = ???)] 
public Byte[] ImageData; 

die SizeConst ein Muss, wenn sie mit Byte-Arrays arbeiten C-DLLs von C# übergeben wird?

+0

Ein benutzerdefinierter Marshaller scheint die einzige Wahl zu sein. – IllidanS4

Antwort

2

Sie müssen den Marshalling-Typ ändern. SizeConst ist erforderlich, wenn Sie als ByValArray marshalieren, nicht jedoch mit anderen Typen. Weitere Informationen finden Sie unter UnmanagedType enum.

Mein Verdacht ist, dass Sie als C-Zeiger auf das Array zu marshall wollen:

[MarshalAs(UnmanagedType.LPArray)] 

Dies wird es marshall führen bis hin zu einem Standard-C-Array (BYTE *), so dass nur ein Zeiger übergeben wird durch. Auf diese Weise können Sie Arrays beliebiger Größe übergeben. In der Regel möchten Sie die Array-Größe auch als einen anderen Parameter (oder image width/height/bpp, der die gleichen Informationen bereitstellt) übergeben, da es in C/C++ keine Möglichkeit gibt, dies einfach zu sagen.

+0

Danke für die Antwort Reed. Allerdings habe ich das und jetzt bekomme ich diesen Fehler Ungültige Managed/unmanaged Typ Kombination (Arrays Felder müssen mit ByValArray oder SafeArray gepaart werden) Beim Aufbau der IntPtr und dann Marshal.StructureToPtr ... Gedanken? – Olewolfe

+0

Schauen Sie sich die Enum. Es würden mehr Informationen benötigt. Ich ging davon aus, dass Sie von verwalteten verwaltet -> nicht verwaltet, aber wenn Sie umgekehrt gehen, können Sie es entweder als IntPtr (anstelle von einem Byte []) oder einrichten, um ein SafeArray zu verwenden. –

+1

Leider verwendet alles außer [MarshalAs (UnmanagedType.ArrayByVal, sizeConst = xxxx)] die Speicheradressierung. Also im Wesentlichen gibt es eine Struktur (die ein Byte [] enthält), die in ein IntPtr konvertiert werden muss, damit es an die DLL übergeben werden kann. Und die Daten im Byte [] werden durcheinander gebracht. Verifiziere dies, indem ich die Daten vom IntPtr in ein Byte [] kopiere und die Daten ansehe, um zu sehen, dass alles geändert wird, wenn ich nicht die MarshalAs in der Struktur gesetzt habe. – Olewolfe