C# Language C ++ nom mangling


Exemple

Les compilateurs C ++ codent des informations supplémentaires dans les noms des fonctions exportées, telles que les types d'argument, pour créer des surcharges avec différents arguments possibles. Ce processus s'appelle le mangling name . Cela pose des problèmes avec l'importation de fonctions dans C # (et l'interopérabilité avec d'autres langages en général), le nom de la fonction int add(int a, int b) n'étant plus add , cela peut être ?add@@YAHHH@Z , _add@8 ou autre chose, en fonction du compilateur et de la convention d'appel.

Il y a plusieurs façons de résoudre le problème de la manipulation de noms:

  • Exporter des fonctions en utilisant extern "C" pour basculer vers la liaison externe C qui utilise la gestion du nom C:

    extern "C" __declspec(dllexport) int __stdcall add(int a, int b)
    
    [DllImport("myDLL.dll")]
    

    Le nom de la fonction sera toujours _add@8 ( _add@8 ), mais le nom de StdCall + extern "C" est reconnu par le compilateur C #.

  • Spécification des noms de fonction exportés dans le fichier de définition de module myDLL.def :

    EXPORTS
      add
    
    int __stdcall add(int a, int b)
    
    [DllImport("myDLL.dll")]
    

    Le nom de la fonction sera pur add dans ce cas.

  • Importer un nom mutilé. Vous aurez besoin d'un visualiseur de DLL pour voir le nom tronqué, vous pourrez alors le spécifier explicitement:

    __declspec(dllexport) int __stdcall add(int a, int b)
    
    [DllImport("myDLL.dll", EntryPoint = "?add@@YGHHH@Z")]