Comment puis-je passer un const char * à une fonction C à partir de C #?

J’essaie d’appeler une fonction C simple à partir d’une DLL externe à partir de mon application C #. Cette fonction est définie comme

void set_param(const char *data) 

Maintenant, j’ai quelques problèmes pour utiliser cette fonction:

  1. Comment spécifier ce “const” dans le code C #? public static extern void set_param(sbyte *data) semble manquer la partie “const”.

  2. Comment puis-je remettre une chaîne C 8 bits simple en appelant cette fonction? Un appel à set_param("127.0.0.1") génère un message d’erreur, “impossible de convertir de” chaîne “en” sbyte “” *.

Il semble que vous utilisiez le jeu de caractères ANSI, vous pouvez donc déclarer le P / Invoke comme ceci:

 [DllImport("yourdll.dll", CharSet = CharSet.Ansi)] public static extern void set_param([MarshalAs(UnmanagedType.LPStr)] ssortingng lpSsortingng); 

Le .NET marshaller se charge de faire des copies de chaînes et de convertir les données au bon type pour vous.

Si vous rencontrez une erreur avec une stack non équilibrée, vous devez définir la convention d’appel pour qu’elle corresponde à votre DLL C, par exemple:

 [DllImport("yourdll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 

Voir pinvoke.net pour de nombreux exemples utilisant les fonctions de l’API Windows.

Consultez également la documentation de Microsoft sur les chaînes appelant l’invocation .

Un caractère const char* est simplement une ssortingng dans .NET – le côté géré ne comprend pas (encore) la notion de parameters en lecture seule.

Si vous utilisez cela dans un contexte P / Invoke, vous devez déclarer un atsortingbut MarshalAs et le marshal en tant que LPStr . La signature qui en résulterait ressemblerait à quelque chose comme

 [DllImport("SomeModule.dll")] public static extern void set_param([MarshalAs(UnmanagedType.LPStr)]ssortingng lpSsortingng); 

Cet article sur MSDN contient également des informations sur la manière de regrouper des chaînes natives dans un environnement géré.