Suporte ABI de interoperabilidade nativa

A Interface Binária de Aplicativo (ABI) é a interface que os tempos de execução e os sistemas operacionais usam para expressar detalhes binários de baixo nível. Esses detalhes podem incluir convenções de chamada (ou seja, como os parâmetros são passados e os resultados retornados), manipulação de exceções e manipulação de símbolos. A lista a seguir contém os nomes de linguagens, tempos de execução e até mesmo tecnologias gerais que você pode usar ao procurar orientação sobre interoperabilidade.

C

A linguagem C representa uma ABI estável em todas as plataformas onde o .NET é suportado. Em geral, C é o destino assumido para APIs de interoperabilidade do .NET e é a linguagem de destino recomendada para a maioria dos cenários de interoperabilidade.

No .NET 7+, LibraryImportAttribute fornece suporte gerado pela fonte para chamar funções C. Se estiveres a direcionar o .NET 6 ou anterior, usa DllImportAttribute. Para obter mais informações, consulte Práticas recomendadas de interoperabilidade.

Ligações adicionais:

C++

A linguagem C++ não tem ABI definida em todas as plataformas suportadas pelo .NET e nas implementações de compilador C++ mais populares (ou seja, MSVC, clang e GCC). Esta falta de uma ABI consistente dificulta o direcionamento direto.

A maneira recomendada de interoperar com C++ é exportar funções marcadas com extern "C" e chamá-las como funções C.

Ligações adicionais:

COM e IUnknown

O COM e IUnknown o ABI foram definidos para se alinharem com a linguagem C. Ele foi projetado especificamente para suportar programação orientada a objetos, semelhante ao C++, mas para fornecer uma ABI estável. O .NET tem um histórico profundo com COM e IUnknown, e como essa ABI foi originalmente projetada para se alinhar com C, ela é suportada em todas as plataformas .NET.

No .NET 5 e superior, o suporte de ciclo de vida de baixo nível e entre plataformas IUnknown é fornecido pela ComWrappers. No .NET 8+, GeneratedComInterfaceAttribute e GeneratedComClassAttribute fornecem projeções C# geradas pelo código-fonte. Se estiver a utilizar versões anteriores ao .NET 5, deve usar o sistema de interoperabilidade COM incorporado, e este suporte está limitado ao Windows.

A plataforma WinRT representa uma evolução da COM e da ABI. O suporte para isso é fornecido pelo kit de ferramentas CsWinRT e é baseado no ComWrappers.

Ligações adicionais:

Linguagens baseadas em Java Virtual Machine (JVM)

A Java Virtual Machine (JVM) define uma interface de função estrangeira (FFI) em C para interoperar com outras plataformas. A interoperabilidade entre .NET e Java pode ser alcançada através desta interface.

Ligações adicionais:

Rápido

O ambiente de programação Swift tem uma ABI estável bem definida que é suportada no .NET. No .NET 9+, APIs específicas que suportam interoperabilidade com Swift podem ser encontradas sob o System.Runtime.InteropServices.Swift namespace.

Objective-C

A linguagem Objective-C segue a ABI da linguagem C e é suportada no .NET. No .NET 8+, APIs específicas que suportam interoperabilidade com Objective-C podem ser encontradas no System.Runtime.InteropServices.ObjectiveC namespace.

Ligações adicionais:

Python

A implementação de referência do tempo de execução do Python, CPython, define uma interface de função estrangeira (FFI) em C para interoperar com outras plataformas. A interoperabilidade entre .NET e Python pode ser alcançada através desta interface.

Ligações adicionais:

Golang

A linguagem de programação Go não é suportada para interoperabilidade em processo. O ambiente de execução Go impõe requisitos para ser hospedado num processo com outro ambiente de execução. Especificamente, esse requisito é o uso do sinalizador SA_ONSTACK em threads que executam manipuladores de sinais. Esses requisitos não são atendidos atualmente pelo .NET.

A maneira recomendada de interoperar com golang é usar um processo hospedado em golang e se comunicar através de um mecanismo de comunicação entre processos.

ARM64EC

O ARM64EC ABI não é suportado.