应用程序二进制接口(ABI)是运行时和操作系统用来表达低级二进制详细信息的接口。 这些详细信息可能包括调用约定(即传递参数的方式和返回结果)、异常处理和符号混乱。 下面的列表包含语言、运行时,甚至是在查找互操作性指南时可能使用的常规技术的名称。
C
C 语言表示支持 .NET 的所有平台的稳定 ABI。 通常,C 是 .NET 互操作 API 的假定目标,是大多数互操作方案的建议目标语言。
在 .NET 7+ 中, LibraryImportAttribute 提供对调用 C 函数的源生成支持。 如果您针对 .NET 6 或更早版本,请使用 DllImportAttribute。 有关详细信息,请参阅 互操作最佳做法。
其他链接:
-
LibraryImportAttribute演练 - CsWin32 是用于访问 Windows Win32 API 图面的源生成器
C++
C++语言在所有 .NET 支持的平台和最常用的C++编译器实现(即 MSVC、clang 和 GCC)中没有定义 ABI。 这种缺乏一致的 ABI 使得难以直接定位。
推荐的与 C++ 进行互操作的方法是导出带有 extern "C" 标记的函数并将它们作为 C 函数调用。
其他链接:
- ClangSharp 绑定生成器
COM 和 IUnknown
COM 和 IUnknown ABI 已定义为与 C 语言保持一致。 它专门用于支持面向对象的编程,类似于C++,但提供了稳定的 ABI。 .NET 与 COM IUnknown有着深厚的历史,并且由于此 ABI 最初旨在与 C 保持一致,因此在所有 .NET 平台上都支持它。
在 .NET 5+ 中,由 IUnknown 提供低级别、跨平台的 ComWrappers 生存期支持。 在 .NET 8+ 中,GeneratedComInterfaceAttribute 和 GeneratedComClassAttribute 提供源生成的 C# 投影。 如果你面向 .NET 5 之前的版本,则必须使用 内置的 COM 互操作系统,并且此支持仅限于 Windows。
WinRT 平台表示 COM 和 IUnknown ABI 的演变。 对此的支持由CsWinRT 工具包提供,并建立在ComWrappers之上。
其他链接:
基于 Java 虚拟机(JVM)的语言
Java 虚拟机(JVM)在 C 中定义一个外部函数接口(FFI),以便与其他平台进行互操作。 可以通过此接口实现 .NET 和 Java 之间的互操作性。
其他链接:
Swift
Swift 编程环境具有一个定义完善的稳定 ABI,在 .NET 中受支持。 在 .NET 9+ 中,可以在命名空间下 System.Runtime.InteropServices.Swift 找到支持与 Swift 互操作的特定 API。
Objective-C
Objective-C 语言遵循 C 语言的 ABI, 在 .NET 中受支持。 在 .NET 8+ 中,可以在命名空间下 System.Runtime.InteropServices.ObjectiveC 找到支持与 Objective-C 互操作的特定 API。
其他链接:
Python
Python 运行时的参考实现 CPython 定义了一个外部函数接口 (FFI),用于与其他平台进行互操作。 可以通过此接口实现 .NET 和 Python 之间的互操作性。
其他链接:
- 为扩展模块提供 C API
- Python for .NET
- CSnakes - 从 .NET 使用 Python。
golang(Go 编程语言)
Go 编程语言不支持进程内互操作性。 Go 运行时对在具有另一个运行时的进程中托管提出了要求。 具体而言,该要求是在运行信号处理程序的线程上使用 SA_ONSTACK 标志。 .NET 当前未满足这些要求。
与 golang 互操作的建议方法是使用 golang 托管的进程并通过进程间通信机制进行通信。
ARM64EC
不支持 ARM64EC ABI。