Argument Exception geworfen von PtrToStructure
-
20-09-2019 - |
Frage
Kann jemand bitte erklären, die folgende Argument Ausnahme: Die Struktur muss keinen Wert Klasse , um mich zu gefallen. Es ist Ursache durch die folgende Codezeile in meinem Programm:
Marshal.PtrToStructure(m.LParam, dbh);
da dbh
ist vom Typ:
[StructLayout(LayoutKind.Sequential)]
public struct Device_Broadcast_Header
{
public int dbch_size;
public int dbch_devicetype;
public int dbch_reserved;
}
Danke
Lösung
Sie können diese insbesondere nicht nennen Marshal.PtrToStructure
Überlastung mit einem Wert-Typ ( dh eine struct
).
Wenn Sie rufen Sie diese Überlastung Sie eine Instanz empfangen kann Ihrer geben Sie zurück.
Andere Tipps
Es tut uns keinen Code Beispiel zu geben, aber hier ist ein link Das könnte helfen Sie.
Hier ist der Schlüsseltext aus dem obigen Link:
Das Problem hat nichts mit der RegisterTraceGuids API.
Nach dem doc Marshal.PtrToStructure (IntPtr, Object) http://msdn.microsoft.com/en-us/library/30ex8z62. aspx , Wirft es das Argument dass Sie sah, als Struktur-Layout nicht ist sequentielle oder explizite oder Struktur ist eine geschachtelte Wert ein.
In diesem Fall ist die Struktur erklärt als sequenzielle jedoch die Elemente in dem Array (TraceGuidReg [i]) auf die eingerahmte wegen des Arrays verwalteten Heap Objekt, so bekam man den Fehler „der Struktur darf kein Wert Klasse sein. "
Sie müßten die Überlastung verwenden Marshal.PtrToStructure Methode (IntPtr, Art) http://msdn.microsoft.com/en-us/library/4ca6d5z7. aspx und weist das Ergebnis der PtrToStructure auf die Array-Elemente.
[StructLayout(LayoutKind.Sequential)]
public class Device_Broadcast_Header_Wrapper{
public Device_Broadcast_Header Header
}
Device_Broadcast_Header_Wrapper wapper = new Device_Broadcast_Header_Wrapper();
Marshal.PtrToStructure(m.LParam, wapper);