네이티브에서 .NET 함수를 호출하는 방법..?

언어간에 호출을 자유롭게 할 수 있도록 하는 프레임워크를 개발하고 있습니다

  1. C++로 작성된 라이브러리를 LLVM/Clang을 이용해 분석하고 진입점과 타입등을 분석한 파일을 생성
  2. 분석된 파일 기반으로 C# 바인딩 생성
  3. C#으로 작성된 프로젝트는 생성된 C# 바인딩 사용

위 처럼 모든 언어에 대해 네이티브와 호환되는 레이어를 자동으로 생성하고, 생성된 레이어를 기반으로 목적 언어의 바인딩을 생성함으로서, 한 프로세스 내에서 Python, C#, C++등의 언어들끼리의 호출이 자유로워질 수 있도록 하고자 합니다

C#에서 C++을 어느정도 자유롭게 호출할 수 있도록은 구현하였습니다만,
문제는 C++에서 C#을 호출할 때 제가 시도해본 방법들에 전부 하나씩 문제점이 존재한다는 것 입니다:

  • NativeAOT로 진입점을 직접 노출시키는 경우입니다. 이 경우 한 프로세스 내의 여러 곳에서 .NET 어셈블리를 로드해도, 같은 도메인을 공유하게 되어 관리의 용이점이 있으나, 대상으로 하는 .NET 어셈블리가 AOT로 컴파일 되지 못하는 (Reflection등의 사용으로 인해) 경우 사용하지 못합니다
  • UnmanagedCallersOnly와 P/Invoke를 이용해 먼저 C#에서 네이티브 콜백을 호출하고 이 과정에서 필요한 함수 포인터들을 넘겨주는 방식입니다. 이 경우 C++은 C#보다 먼저 로드되지 못합니다
  • Native Hosting을 이용해 .NET 어셈블리를 네이티브에서 로드하는 방식입니다. 이 경우, .NET 어셈블리가 네이티브보다 먼저 로드되었을때, 네이티브에서 로드한 .NET 어셈블리와 네이티브에서 로드한 .NET 어셈블리의 도메인이 달라지게 되는 문제가 생깁니다

혹시 이런 문제에 대해 잘 알고 계신 분 계신가요…?

(혹시나 소스코드가 필요하신 분들을 위해: GitHub - Sharp0802/lilac: LILAC is a Language to language Interoperability LAyer Compiler - with a goal that producing bindings across languages. )

2 Likes

직접적인 도움이 되는건 아니지만, C#에서 C/Rust 함수를 이용할 수 있게 해주는 라이브러리를 소개드립니다. 반대의 경우는 확실히 저도 보질 못한 것 같네요…

1 Like