Erreur PInvoke lors du marshalling d'une structure contenant une chaîne
-
11-07-2019 - |
Question
J'ai une structure C ++
struct UnmanagedStruct
{
char* s;
// Other members
};
et une structure C #
struct ManagedStruct {
[MarshalAs(UnmanagedType.LPStr)]
string s;
// Other members
}
la bibliothèque C ++ expose
extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );
Et il est importé comme
[DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
static extern ManagedStruct foo( string input );
Cependant, lorsque j'appelle cette fonction, je reçois
MarshalDirectiveException non gérée
La signature de type de la méthode n'est pas compatible PInvoke.
Le fait est que cet appel de fonction fonctionne si je supprime les caractères * et la chaîne s de la structure.
La solution
Pour ce type de scénario, n'utilisez pas directement une chaîne. Changez plutôt le type en tant que valeur IntPtr et utilisez Marshal.PtrToStringAuto / Ansi / Uni selon le cas. Dans ce cas, puisque votre code natif utilise char *
, PtrToStringAnsi est le meilleur choix.
struct ManagedStruct {
IntPtr s;
public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow