Maison > développement back-end > C++ > Comment transmettre efficacement des chaînes entre C# et une DLL C ?

Comment transmettre efficacement des chaînes entre C# et une DLL C ?

Patricia Arquette
Libérer: 2025-01-01 01:19:09
original
1034 Les gens l'ont consulté

How to Efficiently Pass Strings Between C# and a C   DLL?

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;
    }
}
Copier après la connexion

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
    }
}
Copier après la connexion

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());
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal