Wie Marschall ich eine Struktur als Zeiger auf eine Struktur?
Frage
Ich versuche, eine Struktur von C # in C ++ Bibliothek zu übergeben. Ich gehe Struktur als ein Objekt, und C ++ Funktion erwartet es als Zeiger (void *).
Ich habe Probleme mit der Struktur übergeben.
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);
Hier ist der Laufzeitausnahmetext erhalte ich:
"Can not Marschall 'Parameter # 1':. Ungültige verwaltete / nicht verwalteten Typ Kombination (dieser Wert Typ muss mit Struct gepaart werden)"
Obwohl ich einen MSDN-Artikel gefunden, die LPStruct verwendet in genau diesen Kontext.
Das ist meine Struktur ich Marschall bin versucht:
[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
[MarshalAs(UnmanagedType.I4)]
public int userParam1;
}
Dies ist C ++ Funktion:
MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...
Lösung
Versuchen Sie, die Struktur als ref Parameter.
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);
Wenn Sie eine ref mit einer Struktur kombiniert verwenden, geht es vom Konzept her die Adresse.
Andere Tipps
Im übrigen ist UnmanagedType.LPStruct
selten, wenn überhaupt, das richtige MarshalAs
Argument. Ein Zitat von Adam Nathan , die ein Microsoft ist Mitarbeiter:
UnmanagedType.LPStruct ist nur für einen bestimmten Fall unterstützt:. einen System.Guid Werttypen als unmanaged GUID mit einem zusätzlichen Dereferenzierungsebene Behandlung