Ler em inglês

Compartilhar via


Suporte a ABI de interoperabilidade nativa

A ABI (Interface Binária do Aplicativo) é 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), tratamento de exceções e mutilaçã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 diretrizes sobre interoperabilidade.

C

A linguagem C representa uma ABI estável em todas as plataformas em que há suporte para o .NET. 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 origem para chamar funções C. Se você estiver direcionando o .NET 6 ou anterior, use DllImportAttribute. Para obter mais informações, consulte Práticas recomendadas de interoperabilidade.

Links adicionais:

C++

A linguagem C++ não tem ABI definida em todas as plataformas com suporte do .NET e nas implementações de compilador C++ mais populares (ou seja, MSVC, clang e GCC). Essa 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 de funções C.

Links adicionais:

COM e IUnknown

O COM e IUnknown o ABI foram definidos para se alinhar 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 tem suporte em todas as plataformas .NET.

No .NET 5+, o suporte vitalício de baixo nível, IUnknown multiplataforma é fornecido pelo ComWrappers. No .NET 8+ GeneratedComInterfaceAttribute e GeneratedComClassAttribute fornecer projeções C# geradas pela origem. Se você estiver direcionando versões anteriores ao .NET 5, deverá usar o sistema de interoperabilidade COM interno e esse suporte é limitado ao Windows.

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

Links adicionais:

Linguagens baseadas em Java Virtual Machine (JVM)

A Java Virtual Machine (JVM) define uma interface de função externa (FFI) em C para interoperar com outras plataformas. A interoperabilidade entre o .NET e o Java pode ser obtida por meio dessa interface.

Links adicionais:

Swift

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

Objective-C

A linguagem Objective-C segue a ABI da linguagem C e tem suporte em .NET. No .NET 8+, APIs específicas que dão suporte à interoperabilidade com Objective-C podem ser encontradas no System.Runtime.InteropServices.ObjectiveC namespace.

Links adicionais:

Python

A implementação de referência do tempo de execução do Python, CPython, define uma interface de função externa (FFI) em C para interoperar com outras plataformas. A interoperabilidade entre o .NET e o Python pode ser obtida por meio dessa interface.

Links adicionais:

golang

A linguagem de programação Go não é suportada para interoperabilidade em processo. O runtime Go impõe requisitos para ser hospedado em um processo com outro runtime. Especificamente, esse requisito é o uso do sinalizador em threads que executam manipuladores de SA_ONSTACK sinal. No momento, esses requisitos não são atendidos pelo .NET.

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

ARM64EC

Não há suporte para a ABI ARM64EC .