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) {...
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top