Passer des chaînes de C# à la DLL C et inversement
Lorsqu'ils tentent de transmettre des chaînes entre C# et C, les développeurs rencontrent souvent des difficultés. Dans cet article, nous approfondissons ce problème et proposons une solution concise.
Le problème
Considérez le code suivant, où C définit une fonction pour concaténer des chaînes :
extern "C" { string concat(string a, string b){ return a + b; } }
En C#, la fonction est appelée en utilisant interop :
[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern string concat(string a, string b);
Cependant, cette approche aboutit à une System.AccessViolationException.
La solution
Le problème réside dans l'incompatibilité de C std::string avec la limite d'interopérabilité. Pour résoudre ce problème, des types compatibles avec l'interopérabilité doivent être utilisés à la limite, tels que des tableaux de caractères terminés par un caractère nul.
Passer des chaînes de C# à C
Pour chaînes passées de C# à C , la fonction C peut être modifiée :
void foo(const char *str) { // do something with str }
Et dans C# :
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(string str);
Passer des chaînes de C à C#
Pour les chaînes passées de C à C#, la fonction C devient :
void foo(char *str, int len) { // write no more than len characters into str }
En C# :
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(StringBuilder str, int len);
En adhérant à ces directives, les développeurs peuvent transmettre des chaînes de manière transparente entre les DLL C# et C.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!