Comment structurer une structure en tant que pointeur sur une structure?
Question
J'essaie de passer une structure de C # à la bibliothèque C ++. Je passe la structure en tant qu’objet et la fonction C ++ l’attend en tant que pointeur (void *).
J'ai des problèmes pour passer la structure.
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);
Voici le texte de l'exception d'exécution que je reçois:
& "; Impossible de marshal 'paramètre # 1': Combinaison de type géré / non géré non valide (ce type de valeur doit être associé à Struct)."
Bien que j'ai trouvé un article MSDN qui utilise LPStruct exactement dans ce contexte.
C’est ma structure que j’essaie de structurer:
[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
[MarshalAs(UnmanagedType.I4)]
public int userParam1;
}
Ceci est une fonction C ++:
MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...
La solution
Essayez de passer la structure en tant que paramètre ref.
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);
Lorsque vous utilisez une référence combinée à une structure, elle transmet conceptuellement l'adresse.
Autres conseils
Incidemment, UnmanagedType.LPStruct
est rarement, sinon jamais, le bon argument MarshalAs
. Une citation d'Adam Nathan qui est un Microsoft employé:
UnmanagedType.LPStruct n'est pris en charge que dans un cas spécifique: traitement d'un type de valeur System.Guid en tant que GUID non géré avec un niveau supplémentaire d'indirection.