Chaînes UTF-8 dans les wrappers ABI générés
Statut documentaire : reference — voir Maturité et preuves.
Le contrat ABI natif généré définit déjà une convention concrète pour les chaînes. À la frontière native, les chaînes sont projetées en pointeurs UTF-8 terminés par zéro.
Le générateur fixe explicitement les règles d'ownership suivantes :
- chaîne en entrée : UTF-8, ownership appelant ;
- chaîne en sortie/retour : UTF-8, ownership module et libération via
Freedu module ; - chaîne in/out : ownership appelant en entrée, module en sortie ;
- le module ne doit pas conserver les pointeurs de chaînes d'entrée après l'appel.
Comportement du wrapper généré
Les wrappers natifs générés allouent les buffers UTF-8 de résultat et exposent une fonction Free du module. La même symétrie d'allocation est utilisée par GetLastError : l'appelant reçoit une allocation UTF-8, la copie puis la libère via le module.
Le modèle C# généré projette les chaînes source vers string. Les pointeurs caractères utilisés comme signatures de chaînes sont eux aussi projetés vers string, car le wrapper natif généré réalise la conversion UTF-8.
Les chaînes de retour sont décodées par le runtime .NET généré plutôt que d'être exposées comme IntPtr au code applicatif.
Distinction importante entre les couches
Le contrat du wrapper généré supporte les chaînes UTF-8, mais tous les exécuteurs génériques ou bridges expérimentaux du code ne supportent pas nécessairement chaque type publié.
Il faut donc distinguer :
support publication/générateur
!=
certification de tous les bridges d'exécution
Cette page est en reference pour la convention chaîne de l'ABI native générée. Les pages propres aux bridges doivent annoncer leur sous-ensemble d'exécution.
Null et vide
La convention native générée est fondée sur un pointeur et une terminaison zéro. Les bindings doivent préserver la différence sémantique entre une référence nulle lorsque le contrat l'autorise et une chaîne vide lorsque l'API cible les distingue.
Le code applicatif ne doit jamais posséder directement le pointeur UTF-8 natif. L'infrastructure générée/runtime gère encodage, copie et libération.
Projection .NET
Pour .NET, la projection normale est string / string nullable. Le binding réalise :
chaîne managée
-> buffer UTF-8 limité à l'appel
-> wrapper natif généré
-> Runtime
Pour un retour :
Runtime
-> pointeur UTF-8 propriété du module
-> copie vers string par le runtime .NET généré
-> Free du module
Note cross-topology
RPC transporte les chaînes comme valeurs du protocole sans exposer le pointeur natif. La parité sémantique doit être validée au niveau du contrat généré, et non en imposant la même représentation physique en local et à distance.