이번에 개발하면서 P/Invoke를 사용할 일이 생겨서 이것저것 시도하다 알게된 패키지입니다.
dotnet 계정에서 관리하고 있고 pinvoke.net에 있는 것과 꽤 비슷합니다.
그런데 장점과 단점이 분명히 드러나는 것 같았습니다.
위 패키지는 Win32 API를 닷넷으로 완벽히 옮긴 느낌이 강해 함수를 우리가 알고있는 구조대로 파라미터를 넣으면 돌아가지만, dotnet/pinvoke는 뭔가 자체적인 규칙을 만들어 놓은 것 같았습니다.
대표적으로 enum 계열인데 c++에서 사용하던 enum 이름을 그대로 넣으면 해당 데이터가 나오질 않습니다…
자체적으로 매핑해둔 구조체나 클래스를 찾아야 하는데, 문서가 잘 만들어진 편이 아니라 이쪽에서 시간을 꽤 잡아먹습니다.
또한, 아주 오래된 API들은 자체적으로 정리했는지 찾을 수 없었습니다
(제가 사용한 것 중에서는 SetupApi에서 SetupDiGetDeviceRegistryProperty 함수가 없었습니다).
그런데 이런 단점만 있는 것은 아니고 닷넷에서 사용하기 편하도록 만든 부분도 있습니다.
Kernel32에서 WriteFile과 ReadFile에서 느꼈는데, ArraySegment<T>로 대응시켜 쉽게 사용할 수 있도록 되어 있습니다.
확실히 이 부분은 좋지만… 저 Win32 계열 API의 함수 파라미터가 워낙 많아서 모든 상황에 대응을 못하는 것이 다소 아쉽습니다.
대표적으로 Kernel32의 CreateFile할 때 FILE_FLAG_OVERLAPPED 속성을 주면 파일을 비동기로 만들거나 여는 작업을 하는데 이때는 위의 함수를 사용하면 ERROR_INVALID_PARAMETER가 뜹니다…
그럼에도 사용자의 코드에서 Win32 계열 선언이나 수많은 구조를 만들어내지 않아도 되는 것은 매우 큰 장점으로 생각합니다.