Comment structurer une structure en tant que pointeur sur une structure?

StackOverflow https://stackoverflow.com/questions/827672

  •  06-07-2019
  •  | 
  •  

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) {...
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top