Passage de chaînes entre C# et DLL C : un exemple minimal
Dans cette requête, un développeur a du mal à transmettre des chaînes entre C# et un C DLL. L'analyse de leur code révèle un problème fondamental qui entrave leurs efforts : l'incompatibilité entre les chaînes C std::string et C# à la limite de l'interopérabilité.
La fonction DLL C qu'ils définissent :
extern "C" { string concat(string a, string b){ return a + b; } }
Impossible d’accéder directement à partir de C#. En effet, les std::strings ne sont pas des types de données interopérables et ne doivent pas être transmis au-delà des limites d'interopérabilité.
Pour résoudre ce problème, le développeur doit utiliser d'autres types de données interopérables. Une approche courante consiste à exploiter des tableaux de caractères terminés par un caractère nul, car ceux-ci peuvent être facilement rassemblés entre différents langages de programmation. Voici une version modifiée de leur code C :
extern "C" { void concat(char* str1, char* str2, char** result) { int len1 = strlen(str1); int len2 = strlen(str2); int resultSize = len1 + len2 + 1; //null-terminator included *result = (char*)malloc(resultSize); //allocate memory for the result string strcpy(*result, str1); strcat(*result, str2); //append str2 to str1 } }
Cette fonction prend trois paramètres : deux tableaux de caractères d'entrée (str1 et str2) et un tableau de caractères de résultat (*result) qui sera alloué et renvoyé au appelant.
En C#, le code peut être ajusté en conséquence :
[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern void concat(string str1, string str2, StringBuilder result); ... StringBuilder result = new StringBuilder(10); concat("a", "b", result); Console.WriteLine(result.ToString());
Ce code alloue un StringBuilder d'une capacité de 10 caractères et le transmet à la fonction C comme paramètre de résultat. Une fois la fonction exécutée, la chaîne concaténée sera disponible dans StringBuilder.
En utilisant cette approche, le développeur garantit que les chaînes sont transmises et renvoyées à l'aide de types de données compatibles avec l'interopérabilité, résolvant ainsi l'exception System.AccessViolationException survenue précédemment. .
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!