Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Двоичный интерфейс приложения (ABI) — это интерфейс, используемый средой выполнения и операционными системами для выражения двоичных сведений низкого уровня. Эти сведения могут включать соглашения о вызовах (т. е. как передаются параметры и возвращаются результаты), обработка исключений и изменение символов. Следующий список содержит имена языков, сред выполнения и даже общих технологий, которые можно использовать при поиске рекомендаций по взаимодействию.
С
Язык C представляет стабильный ABI на всех платформах, где поддерживается .NET. Как правило, C является предполагаемым целевым объектом для API взаимодействия .NET и является рекомендуемым целевым языком для большинства сценариев взаимодействия.
В .NET 7+ LibraryImportAttribute предоставляет поддержку с генерацией из исходного кода для вызова функций C. Если вы нацелены на .NET 6 или более ранние версии, используйте DllImportAttribute. Дополнительные сведения см. в рекомендациях по взаимодействию.
Дополнительные ссылки:
-
LibraryImportAttributeпошаговое руководство - CsWin32 — это генератор источников для доступа к поверхности API Windows Win32
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 можно достичь с помощью этого интерфейса.
Дополнительные ссылки:
- Предоставление API C для модуля расширения
- Python для .NET
- CSnakes — использование Python из .NET.
язык программирования Go
Язык программирования Go не поддерживается для взаимодействия в процессе. Среда выполнения Go предъявляет требования к совместному использованию процесса с другой средой выполнения. В частности, это требование — использование флага SA_ONSTACK в потоках, выполняющих обработчики сигналов. Эти требования в настоящее время не выполняются в .NET.
Рекомендуемый способ взаимодействия с golang — использовать размещенный в golang процесс и взаимодействовать с помощью механизма взаимодействия между процессами.
ARM64EC
ARM64EC ABI не поддерживается.