다음을 통해 공유


네이티브 상호운용성 ABI 지원

애플리케이션 바이너리 인터페이스(ABI)는 런타임 및 운영 체제가 하위 수준 이진 세부 정보를 표현하는 데 사용하는 인터페이스입니다. 이러한 세부 정보에는 호출 규칙(즉, 매개 변수가 전달되고 결과가 반환되는 방법), 예외 처리 및 기호 맨글링이 포함될 수 있습니다. 다음 목록에는 상호 운용성에 대한 지침을 검색할 때 사용할 수 있는 언어, 런타임 및 일반 기술의 이름이 포함됩니다.

C

C 언어는 .NET이 지원되는 모든 플랫폼에서 안정적인 ABI를 나타냅니다. 일반적으로 C는 .NET interop API에 대해 가정된 대상이며 대부분의 interop 시나리오에 권장되는 대상 언어입니다.

.NET 7 이상 LibraryImportAttribute 에서는 C 함수 호출에 대한 소스 생성 지원을 제공합니다. .NET 6 이하를 대상으로 하는 경우 DllImportAttribute를 사용하세요. 자세한 내용은 Interop 모범 사례를 참조 하세요.

추가 링크:

C++

C++ 언어에는 지원되는 모든 .NET 플랫폼 및 가장 인기 있는 C++ 컴파일러 구현(즉, MSVC, clang 및 GCC)에 정의된 ABI가 없습니다. 일관된 ABI가 없기 때문에 직접 대상으로 지정하기가 어렵습니다.

C++와 상호 운용하는 권장 방법은 표시된 extern "C" 함수를 내보내고 C 함수로 호출하는 것입니다.

추가 링크:

COM 및 IUnknown

COM 및 IUnknown ABI는 C 언어에 맞게 정의되었습니다. C++를 유사하게 개체 지향 프로그래밍을 지원하지만 안정적인 ABI를 제공하도록 특별히 설계되었습니다. .NET은 COM과 깊은 역사를 가지고 있으며 IUnknown, 이 ABI는 원래 C에 맞게 설계되었으므로 모든 .NET 플랫폼에서 지원됩니다.

.NET 5 이상에서는 플랫폼 간 저수준 IUnknown 수명 지원이 ComWrappers에 의해 제공됩니다. .NET 8 이상에서 GeneratedComInterfaceAttributeGeneratedComClassAttribute는 원본 생성 C# 프로젝션을 제공합니다. .NET 5 이전 버전을 대상으로 하는 경우 기본 제공 COM interop 시스템을 사용해야 하며 이 지원은 Windows로 제한됩니다.

WinRT 플랫폼은 COM 및 IUnknown ABI의 진화를 나타냅니다. 이에 대한 지원은 CsWinRT 도구 키트에서 제공되며 기본 제공됩니다ComWrappers.

추가 링크:

JVM(Java Virtual Machine) 기반 언어

JVM(Java Virtual Machine)은 다른 플랫폼과 상호 운용하기 위해 C에서 외장형 FFI(함수 인터페이스)를 정의합니다. .NET과 Java 간의 상호 운용성은 이 인터페이스를 통해 달성할 수 있습니다.

추가 링크:

재빠르다

Swift 프로그래밍 환경에는 .NET에서 지원되는 잘 정의된 안정적인 ABI가 있습니다. .NET 9 이상에서는 Swift와의 interop을 지원하는 특정 API를 네임스페이 System.Runtime.InteropServices.Swift 스 아래에서 찾을 수 있습니다.

Objective-C

Objective-C 언어는 C 언어의 ABI를 따르며 .NET에서 지원됩니다. .NET 8 이상에서는 Objective-C와의 interop을 지원하는 특정 API를 네임스페이 System.Runtime.InteropServices.ObjectiveC 스 아래에서 찾을 수 있습니다.

추가 링크:

파이썬

Python 런타임 CPython의 참조 구현은 다른 플랫폼과 상호 운용하기 위해 C에서 FFI(Foreign Function Interface)를 정의합니다. .NET과 Python 간의 상호 운용성은 이 인터페이스를 통해 달성할 수 있습니다.

추가 링크:

Go 프로그래밍 언어

Go 프로그래밍 언어는 In-Process 상호 운용성을 위해 지원되지 않습니다. Go 런타임은 다른 런타임 사용하는 프로세스에서 호스트되는 것에 대한 요구 사항을 적용합니다. 특히 이 요구 사항은 신호 처리기를 실행하는 스레드에서 플래그를 사용하는 SA_ONSTACK 것입니다. 이러한 요구 사항은 현재 .NET에서 충족되지 않습니다.

golang과 상호 운용하는 권장 방법은 golang 호스팅 프로세스를 사용하고 프로세스 간 통신 메커니즘을 통해 통신하는 것입니다.

ARM64EC

ARM64EC ABI는 지원되지 않습니다.