.net native로 만든 DLL도 P/Invoke로 호출해야 하나요?

C# Class Library(.net core)를 .net native(.net 7.0)로 컴파일할 수 있다고 들었는데
관리되는 환경 내에서 돌아가는 dll이니 c++로 만든 dll과 뭔가 차별점이 있지 않을까 해서 질문합니다…

1개의 좋아요

'닷넷 네이티브’라고 말씀하시는 부분을 AOT로 컴파일된 DLL이고,
‘관리되는 환경 내’ 라고 말씀 하시는 부분은 일반적인 JIT 컴파일 방식으로 이해 하고 답변을 드리자면

아마 제가 알기로는
AOT로 컴파일된 DLL은 일반적으로 JIT 컴파일과는 다른 구조이기에 바로 참조해서 사용은 불가능 한것으로 알고 있습니다.

JIT 컴파일 환경에서 사용 하려면 P/Invoke 방식이 아닌 중간에 .NET Standard 라이브러리로 변경해서 참조하여 사용 할 수 있는것으로 알고 있습니다.

2개의 좋아요

그렇군요. 저는 .NET AOT로 컴파일된 DLL은 C++ DLL에 비해 P/Invoke 호출비용을 줄일 수 있지 않을까 생각했는데 아닌가보군요. 답변이 너무 빨리 달려서 놀랐습니다. 답변 감사합니다!!

2개의 좋아요

좀더 확인해 보니

다음과 같이도 사용 가능 한 것 같습니다.

UnmanagedCallersOnly

어트리뷰트 설정으로 EndPoint 메서드를 노출시킬 수 있나 봅니다.

UnmanagedCallersOnlyAttribute Class (System.Runtime.InteropServices) | Microsoft Learn

이렇게 하면 WinAPI LoadLibrary 함수를 P/Invoke 사용으로 로드해서 호출 가능 한 것 같습니다.

  • C/C++ 에서 LoadLibraryA함수 이용
2개의 좋아요

클래스 라이브러리를 AOT 로 컴파일하는 주목적은 비 닷넷 계열 언어에서 사용하기 위함이라고 하네요.

2개의 좋아요