NativeCode를 써야만 하는 이유 중에는 Managed언어(C#, JAVA 등)에서 없는 API를 제공한다고 하네요.
대표적으로 뭐가 있을까요? MSDN에서는 다음 3가지 이유가 있다고합니다.
ㆍ하드웨어 또는 운영체제 관리 기능 → 예를들면 뭐가있을까요? DirectX도 GPU 제어니까 포함될까요?
ㆍABI를 생성 → ABI가 뭘까요? 버전호환 같은 걸까요?
ㆍCOM 구성요소 등록 가능 → COM(Component Object Model)은 아무리 봐도 어렵습니다. 다룬적이 없어서…
a. 닷넷의 내장 API들이 윈도우나 리눅스의 모든 제어 기능을 다 래핑하는 것은 아니어서 네이티브 호출이 분명히 필요한 상황이 있습니다. 일단 윈도우의 경우 생각나는 것은 지금 사용자 화면에 떠 있는 창들을 열거하는 부분이나, Microsoft Detours 같은 도구를 이용해서 Win32 API 호출을 가로채는 것과 같은 기능은 닷넷이 제공하는 기능이 아니지요.
b. ABI는 Application Binary Interface입니다. 바이너리 수준에서 호환성을 보장한다는 것을 ABI 호환성이라고 이야기하는데, C 언어로 동적 모듈을 만들면 대체로 Java나 C#을 포함해 Golang, Rust, Python 등 다른 모든 언어들이 C 언어로 만든 모듈을 부를 수 있습니다. 최근에 닷넷은 NativeAOT 프로젝트를 통해서 C 언어처럼 동적 모듈을 만들어주는 기능을 개발하고 있습니다. (즉, 닷넷 런타임 없이 MSIL을 곧바로 대상 CPU 기계어로 뽑는 기능입니다.)
c. COM은 닷넷보다 앞서서 도입된 프로그래밍 패러다임입니다. C 언어 함수 형태만으로는 개체 지향 형태의 프로그래밍 패러다임을 프로세스 경계를 넘어서 전달하기 어려운 한계가 있었고, 이를 극복하기 위해 VTable이나 Type Library 같은 컨셉을 사용합니다. 닷넷에서는 이것을 리플렉션과 어셈블리라는 개념에서 비슷하게 연상할 수 있고요. 그 후로 나온 COM+나 DCOM은 요즈음 우리가 보고 있는 gRPC나 닷넷 프레임워크 초창기의 닷넷 리모팅을 연상할 수도 있습니다.
일단 생각나는 것만 적어보면 이런 정도인데, 혹시 더 궁금하신 내용이 있다면 적어주시면 감사하겠습니다. (+ 저도 이 주제를 다룬지 오래되어서 잘못 알고 있는 내용이 혹 있을지 모르겠습니다. 친절하게 알려주시면 감사하겠습니다.)
감사합니다.
정말 어려운 내용을 잘 정리해주셨네요.
제 내공이 쌓이면 그때 질문도 떠오를 것 같아요 ㅎㅎ
그런데 사실 이 질문을 올렸던 이유는 C++/WinRT 를 써야될 이유에 의문을 가졌기 때문입니다. WinRT는 UWP의 기반이 되는 라이브러리로 Win32 API를 모던 C++로 구현했답니다. 그래서 관리언어인 C#에서 곧바로 WinRT를 통해 Win32 API를 사용할 수 있다고 합니다. (제가 알기로는…)
그래서 NativeCode의 빠른 속도 외에 특정 영역의 API를 독점적으로 가지는지 궁금했었어요.
어쨋든 큰 도움 되었습니다 !