Inbyggt interoperabilitetsstöd för ABI

ABI (Application Binary Interface ) är det gränssnitt som runtimes och operativsystem använder för att uttrycka binär information på låg nivå. Den här informationen kan omfatta anropskonventioner (dvs. hur parametrar skickas och resultat returneras), undantagshantering och symbol-mangling. Listan som följer innehåller namnen på språk, runtimes och till och med allmänna tekniker som du kan använda när du letar efter vägledning om samverkan.

C

C-språket representerar en stabil ABI på alla plattformar där .NET stöds. I allmänhet är C det antagna målet för .NET interop-API:er och är det rekommenderade målspråket för de flesta interop-scenarier.

I .NET 7+, LibraryImportAttribute tillhandahåller källgenererat stöd för att anropa C-funktioner. Om du riktar in dig på .NET 6 eller tidigare använder du DllImportAttribute. Mer information finns i Metodtips för Interop.

Ytterligare länkar:

C++

C ++-språket har ingen definierad ABI för alla .NET-plattformar som stöds och de mest populära C++-kompilatorimplementeringarna (dvs. MSVC, clang och GCC). Denna brist på en konsekvent ABI gör det svårt att direkt fokusera på det.

Det rekommenderade sättet att samverka med C++ är att exportera funktioner som är markerade med extern "C" och anropa dem som C-funktioner.

Ytterligare länkar:

COM och IUnknown

COM och IUnknown ABI definierades för att överensstämma med C-språket. Den var särskilt utformad för att stödja objektorienterad programmering, liknande C++, men för att tillhandahålla en stabil ABI. .NET har en djup historik med COM och IUnknown, och eftersom denna ABI ursprungligen utformades för att anpassa sig till C stöds den på alla .NET-plattformar.

I .NET 5+ tillhandahålls plattformsoberoende livstidsstöd på låg nivå av IUnknown. I .NET 8+, GeneratedComInterfaceAttribute och GeneratedComClassAttribute ange källgenererade C#-projektioner. Om du riktar in dig på versioner före .NET 5 måste du använda det inbyggda COM-interopsystemet och det här stödet är begränsat till Windows.

WinRT-plattformen representerar en utveckling av COM och IUnknown ABI. Stöd för detta tillhandahålls av CsWinRT-verktygslådan och bygger på ComWrappers.

Ytterligare länkar:

JVM-baserade språk (Java Virtual Machine)

Java Virtual Machine (JVM) definierar ett externt funktionsgränssnitt (FFI) i C för att samverka med andra plattformar. Samverkan mellan .NET och Java kan uppnås via det här gränssnittet.

Ytterligare länkar:

Snabb

Swift-programmeringsmiljön har en väldefinierad stabil ABI som stöds i .NET. I .NET 9+ finns specifika API:er som stöder interop med Swift under System.Runtime.InteropServices.Swift namnområdet.

Objective-C

Objective-C-språket följer C-språkets ABI och stöds i .NET. I .NET 8+ finns specifika API:er som stöder interop med Objective-C under System.Runtime.InteropServices.ObjectiveC namnområdet.

Ytterligare länkar:

python

Referensimplementeringen av Python-körningen, CPython, definierar ett externt funktionsgränssnitt (FFI) i C för att samverka med andra plattformar. Samverkan mellan .NET och Python kan uppnås via det här gränssnittet.

Ytterligare länkar:

golang

Programmeringsspråket Go stöds inte för processkompatibilitet. Go-körningen ställer krav på att bli körd i en process med en annan runtime. Mer specifikt är det kravet användningen av SA_ONSTACK-flaggan på de trådar som kör signalhanterare. Dessa krav uppfylls för närvarande inte av .NET.

Det rekommenderade sättet att samverka med golang är att använda en golang-värdbaserad process och kommunicera via en kommunikationsmekanism mellan processer.

ARM64EC

ARM64EC ABI stöds inte.