Maison > développement back-end > C++ > Comment transmettre de manière transparente des chaînes entre les DLL C# et C ?

Comment transmettre de manière transparente des chaînes entre les DLL C# et C ?

Susan Sarandon
Libérer: 2025-01-03 19:35:41
original
350 Les gens l'ont consulté

How to Seamlessly Pass Strings Between C# and C   DLLs?

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

En C#, la fonction est appelée en utilisant interop :

[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern string concat(string a, string b);
Copier après la connexion

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

Et dans C# :

[DllImport("...", CallingConvention = CallingConvention.Cdecl)
static extern void foo(string str);
Copier après la connexion

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

En C# :

[DllImport("...", CallingConvention = CallingConvention.Cdecl)
static extern void foo(StringBuilder str, int len);
Copier après la connexion

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!

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