One can even completely ignore the RCW/CCW support in .Net entirely and just hack together some struct types that match the vtable layout.
Also you ignored that .NET was made to fully support C++ via Managed C++, replaced with C++/CLI on version 2.0.
C++/CLI ultimately still uses the same features the runtime uses for p/invoke calls, though it uses slightly different IL to transition to native code since it doesn’t have to worry about an external ABI within a mixed mode assembly. Sure, there’s a whole compiler that supports this weird mixed mode world from a language perspective - but it’s really boring at runtime.
Something that no UNIX does, and we only find similar ideas in Swift/Objective-C++, IBM language environments, and the old OS/2 SOM (Smalltalk/C++).
While everyone else just writes glue code with C like interfaces, as if the world has hardly changed from UNIX V6.
I agree that C as the lowest common denominator sucks.