Looking for c# Keywords? Try Ask4Keywords

C# Language C ++ name mangling


пример

Компиляторы C ++ кодируют дополнительную информацию в именах экспортируемых функций, таких как типы аргументов, чтобы сделать возможными перегрузки с различными аргументами. Этот процесс называется изменением имени . Это приводит к проблемам с импортированием функций в C # (и взаимодействием с другими языками вообще), поскольку имя функции int add(int a, int b) больше не add , это может быть ?add@@YAHHH@Z , _add@8 или что-либо еще, в зависимости от компилятора и соглашения о вызове.

Существует несколько способов решения проблемы смены имени:

  • Экспортирование функций с использованием extern "C" для переключения на внешнюю связь C, которая использует сглаживание имени C:

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

    Имя функции все равно будет _add@8 ( _add@8 ), но с StdCall компилятора C # распознается StdCall + extern "C" .

  • Указание имен экспортируемых функций в myDLL.def определения модуля myDLL.def :

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

    В этом случае имя функции будет чисто add .

  • Импортирование измененного имени. Для просмотра искаженного имени вам понадобится некоторое средство просмотра DLL, и вы можете указать его явно:

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