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.

Était-ce utile?

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
scroll top