Думайте о P / Invoke как о вызове платформы. Вы вызываете что-то вроде Win32 API, который очень удобен для P / Invoke, или вам нужно предоставить привязки .NET для неуправляемой библиотеки?
Поскольку оболочка, как правило, очень тонкая, оболочка C ++ / CLI не обязательно должна знать C ++ / CLI. То, что вам нужно знать, можно найти в спецификации языка , это обширная документация с множеством примеров. P / Invoke более приятен в том, чтобы иметь функцию для небольших хорошо существующих существующих библиотек, но если интерфейс для вызова этой библиотеки изменится, вы столкнетесь с проблемой. С C ++ / CLI у вас все еще может быть общедоступный управляемый интерфейс в вашем проекте C ++ / CLI, который доступен для управляемого кода и таким образом легче обрабатывает изменения в C API.
Если вы хотите избавиться от лишней DLL, вы всегда можете попробовать ILMerge, но я не уверен, что она способна обрабатывать смешанные сборки ( явно не ), но похоже, что это возможно связать как управляемые, так и неуправляемые файлы * .obj с помощью компоновщика PlatformSDK следующим образом:
cl.exe /MD /c /clr Unmanaged.cpp
csc.exe /target:module /addmodule:*.obj Managed.cs
link.exe /DLL /LTCG /NOENTRY /CLRIMAGETYPE:IJW *.obj Managed.netmodule