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

Comment puis-je transmettre de manière transparente des chaînes entre C# et une DLL C ?

DDD
Libérer: 2025-01-05 03:53:39
original
963 Les gens l'ont consulté

How Can I Seamlessly Pass Strings Between C# and a C   DLL?

Interfacer des chaînes entre C# et DLL C

Encapsuler la manipulation de chaînes dans une DLL C et l'invoquer à partir de C# peut sembler simple ; cependant, faire passer des chaînes au-delà des limites de l’interopérabilité présente un défi. Cet article explore les complexités impliquées dans de tels échanges et propose une solution de contournement pour un transfert de chaînes transparent.

Le piège

Passer directement les chaînes de la bibliothèque standard C (std::string) à travers la frontière C#/.NET est incompatible. En effet, C# ne fournit pas d'équivalent pour std::string. En conséquence, les tentatives d'interopérabilité échouent avec une System.AccessViolationException.

La solution : les chaînes interopérables

Pour surmonter cet obstacle, nous devons utiliser des types de chaînes interopérables à la frontière. L'une de ces options concerne les tableaux de caractères terminés par un caractère nul, qui peuvent être facilement gérés en C et en C#. Cette approche implique l'allocation et la désallocation de mémoire au sein du même module.

Passer des chaînes de C# à C

Considérez la fonction C suivante qui accepte un tableau de caractères terminé par un caractère nul :

void foo(const char *str) {
  // ...
}
Copier après la connexion

En C#, nous pouvons déclarer une fonction d'interopérabilité comme suit :

[DllImport("...")]
static extern void foo(string str);

// ...

foo("bar");
Copier après la connexion

Dans ce scénario, le compilateur C# rassemble automatiquement la chaîne gérée (« bar ») dans un tableau de caractères terminé par un caractère nul, qui est transmis à la fonction C.

Passer des chaînes de C à C#

D'un autre côté, les fonctions C peuvent écrire des chaînes dans des tampons alloués par le C# caller:

void foo(char *str, int len) {
  // Perform operations within len characters of str
}
Copier après la connexion

Et en C#:

[DllImport("...")]
static extern void foo(StringBuilder str, int len);

// ...

StringBuilder sb = new StringBuilder(10);
foo(sb, sb.Capacity);
Copier après la connexion

Ici, C# alloue un objet StringBuilder et expose son tampon interne à la fonction C via les paramètres StringBuilder et Capacité. La fonction C peut ensuite remplir le tampon avec jusqu'à des caractères de capacité.

Conclusion

En adoptant des types de chaînes interopérables, les chaînes peuvent être transmises de manière transparente entre les DLL C# et C, fournissant un mécanisme pratique pour échanger des données textuelles entre différentes langues et plates-formes.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal