Native-Interoperabilitäts-ABI-Unterstützung

Die Application Binary Interface (ABI) ist die Schnittstelle, die Laufzeiten und Betriebssysteme verwenden, um binäre Details auf niedriger Ebene auszudrücken. Diese Details können Aufrufkonventionen umfassen (d. h., wie Parameter übergeben und Ergebnisse zurückgegeben werden), Ausnahmebehandlung und ggf. Symbol-Mangling. Die folgende Liste enthält die Namen von Sprachen, Laufzeiten und sogar allgemeinen Technologien, die Sie bei der Suche nach Anleitungen zur Interoperabilität verwenden können.

K

Die Sprache C stellt eine stabile ABI auf allen Plattformen dar, auf denen .NET unterstützt wird. Im Allgemeinen ist C das angenommene Ziel für .NET-Interop-APIs und ist die empfohlene Zielsprache für die meisten Interopszenarien.

In .NET 7+ LibraryImportAttribute bietet quellgenerierte Unterstützung für das Aufrufen von C-Funktionen. Wenn Sie .NET 6 oder früher verwenden, verwenden Sie DllImportAttribute. Weitere Informationen finden Sie unter Bewährte Methoden für Interop.

Weitere Links:

C++

Die C++-Sprache hat keine ABI auf allen .NET-unterstützten Plattformen und den beliebtesten C++-Compilerimplementierungen (d. h. MSVC, clang und GCC) definiert. Dieser Mangel an einer konsistenten ABI macht es schwierig, direkt zu zielen.

Die empfohlene Möglichkeit zur Interoperabilität mit C++ besteht darin, mit C++ gekennzeichnete extern "C" Funktionen zu exportieren und als C-Funktionen aufzurufen.

Weitere Links:

COM und IUnknown

Com und IUnknown ABI wurden so definiert, dass sie an der Sprache C ausgerichtet sind. Es wurde speziell entwickelt, um objektorientierte Programmierung zu unterstützen, ähnlich wie C++, aber um eine stabile ABI bereitzustellen. .NET verfügt über einen umfassenden Verlauf mit COM und IUnknown, und da diese ABI ursprünglich für die Ausrichtung an C entwickelt wurde, wird sie auf allen .NET-Plattformen unterstützt.

In .NET 5+ wird plattformübergreifende, low-level IUnknown-Lebenszeitunterstützung von ComWrappers bereitgestellt. In .NET 8+ stellen GeneratedComInterfaceAttribute und GeneratedComClassAttribute quellgenerierte C#-Projektionen bereit. Wenn Sie auf Versionen vor .NET 5 abzielen, müssen Sie das integrierte COM-Interoperabilitätssystem verwenden, und diese Unterstützung ist auf Windows beschränkt.

Die WinRT-Plattform stellt eine Weiterentwicklung von COM und IUnknown ABI dar. Unterstützung dafür wird vom CsWinRT-Toolkit bereitgestellt und basiert auf ComWrappers.

Weitere Links:

Java Virtual Machine (JVM) basierte Sprachen

Der virtuelle Java-Computer (JVM) definiert eine Fremdfunktionsschnittstelle (FFI) in C, um mit anderen Plattformen zu interagieren. Die Interoperabilität zwischen .NET und Java kann über diese Schnittstelle erreicht werden.

Weitere Links:

Schnell

Die Swift-Programmierumgebung verfügt über eine gut definierte stabile ABI, die in .NET unterstützt wird. In .NET 9+ finden Sie bestimmte APIs, die die Interoperabilität mit Swift unterstützen, unter dem System.Runtime.InteropServices.Swift Namespace.

Objective-C

Die Objective-C-Sprache folgt der ABI der C-Sprache und wird in .NET unterstützt. In .NET 8+ finden Sie bestimmte APIs, die die Interoperabilität mit Objective-C unterstützen, unter dem System.Runtime.InteropServices.ObjectiveC Namespace.

Weitere Links:

Python

Die Referenzimplementierung der Python-Laufzeit, CPython, definiert eine Fremdfunktionsschnittstelle (FFI) in C, um mit anderen Plattformen zu interagieren. Die Interoperabilität zwischen .NET und Python kann über diese Schnittstelle erreicht werden.

Weitere Links:

golang

Die Programmiersprache Go wird für die Interoperabilität in Prozessen nicht unterstützt. Die Go-Laufzeit setzt Anforderungen für das Hosten in einem Prozess mit einer anderen Laufzeit auf. Insbesondere ist diese Anforderung die Verwendung des SA_ONSTACK Flags für Threads, die Signalhandler ausführen. Diese Anforderungen werden derzeit nicht von .NET erfüllt.

Die empfohlene Möglichkeit zur Interoperabilität mit Golang besteht darin, einen von Golang gehosteten Prozess zu verwenden und über einen prozessübergreifenden Kommunikationsmechanismus zu kommunizieren.

ARM64EC

Die ARM64EC ABI wird nicht unterstützt.