Поддержка ABI для взаимодействия на уровне нативных компонентов

Двоичный интерфейс приложения (ABI) — это интерфейс, используемый средой выполнения и операционными системами для выражения двоичных сведений низкого уровня. Эти сведения могут включать соглашения о вызовах (т. е. как передаются параметры и возвращаются результаты), обработка исключений и изменение символов. Следующий список содержит имена языков, сред выполнения и даже общих технологий, которые можно использовать при поиске рекомендаций по взаимодействию.

С

Язык C представляет стабильный ABI на всех платформах, где поддерживается .NET. Как правило, C является предполагаемым целевым объектом для API взаимодействия .NET и является рекомендуемым целевым языком для большинства сценариев взаимодействия.

В .NET 7+ LibraryImportAttribute предоставляет поддержку с генерацией из исходного кода для вызова функций C. Если вы нацелены на .NET 6 или более ранние версии, используйте DllImportAttribute. Дополнительные сведения см. в рекомендациях по взаимодействию.

Дополнительные ссылки:

C++

Язык C++ не определяет ABI на всех поддерживаемых платформах .NET и наиболее популярных реализациях компилятора C++ (то есть MSVC, clang и GCC). Отсутствие согласованного ABI затрудняет непосредственную нацеленность.

Рекомендуемый способ взаимодействия с C++ — экспортировать функции, помеченные extern "C", и вызывать их как функции C.

Дополнительные ссылки:

COM и IUnknown

Com и IUnknown ABI были определены для соответствия языку C. Он был специально разработан для поддержки объектно-ориентированного программирования, аналогично C++, но для обеспечения стабильного ABI. .NET имеет глубокую историю с COM и IUnknown, так как этот ABI изначально был разработан для выравнивания с C, он поддерживается на всех платформах .NET.

В .NET 5+ обеспечивается низкоуровневая кроссплатформенная поддержка жизненного цикла с помощью IUnknownComWrappers. В .NET 8+ GeneratedComInterfaceAttribute и GeneratedComClassAttribute обеспечивают генерируемые из исходного кода проекции C#. Если вы используете версии до .NET 5, необходимо использовать встроенную систему взаимодействия COM, и эта поддержка ограничена Windows.

Платформа WinRT является шагом в эволюции COM и IUnknown ABI. Поддержка этого обеспечивается набором инструментов CsWinRT и основана на ComWrappers.

Дополнительные ссылки:

Языки на основе виртуальных машин Java (JVM)

Виртуальная машина Java (JVM) определяет внешний интерфейс функции (FFI) в C для взаимодействия с другими платформами. Взаимодействие между .NET и Java можно достичь с помощью этого интерфейса.

Дополнительные ссылки:

Свифт

Среда программирования Swift имеет хорошо определенный стабильный ABI, поддерживаемый в .NET. В .NET 9+ определенные API, поддерживающие взаимодействие с Swift, можно найти в System.Runtime.InteropServices.Swift пространстве имен.

Objective-C

Язык Objective-C следует ABI языка C и поддерживается в .NET. В .NET 8+ можно найти конкретные API, поддерживающие взаимодействие с Objective-C, в пространстве имен System.Runtime.InteropServices.ObjectiveC.

Дополнительные ссылки:

Питон

Эталонная реализация исполняющей среды Python, CPython, определяет интерфейс взаимодействия с внешними функциями (FFI) на C для взаимодействия с другими платформами. Взаимодействие между .NET и Python можно достичь с помощью этого интерфейса.

Дополнительные ссылки:

язык программирования Go

Язык программирования Go не поддерживается для взаимодействия в процессе. Среда выполнения Go предъявляет требования к совместному использованию процесса с другой средой выполнения. В частности, это требование — использование флага SA_ONSTACK в потоках, выполняющих обработчики сигналов. Эти требования в настоящее время не выполняются в .NET.

Рекомендуемый способ взаимодействия с golang — использовать размещенный в golang процесс и взаимодействовать с помощью механизма взаимодействия между процессами.

ARM64EC

ARM64EC ABI не поддерживается.