Если это вариант, возможно, вы захотите изучить использование COM.Определите классы .NET, которые являются видимыми COM и имеют интерфейс InterfaceType ComInterfaceType.InterfaceIsDual, и украсьте каждый параметр атрибутом MarshalAs (UnmanagedType), тогда приложение C ++ может маршалировать объекты, которые можно передавать между управляемым и неуправляемым кодом.
«Симметричное определение» обрабатывается, потому что интерфейс определен в COM, плюс COM дает вам немного больше обработки ошибок и видимости происходящего, чем прямой P / Invoke.