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
308 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!

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