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) { // ... }
En C#, nous pouvons déclarer une fonction d'interopérabilité comme suit :
[DllImport("...")] static extern void foo(string str); // ... foo("bar");
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 }
Et en C#:
[DllImport("...")] static extern void foo(StringBuilder str, int len); // ... StringBuilder sb = new StringBuilder(10); foo(sb, sb.Capacity);
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!