This is pretty straight forward and works well. It is much simpler than PInvoke.
The big thing you need to pay attention to is the lack of unmanaged members in your managed headers, including private members, method signatures, etc. It is possible that private members, which are pointers to managed types, are declarations for your classes.
Also keep an eye on the lifetime of the object. It is easy to introduce memory leaks, since many .NET programmers are not used to clean up after themselves. Make sure that all wrapper classes that you create are one-time if they contain pointers, and make sure that you delete them in managed code. The IDisposable syntax in managed C ++ is also weird, but it is in the docs.
Also, remember that every time you cross a managed / unmanaged border, you get a small hit, so try planning your interface accordingly. If something is called repeatedly in loops, it's probably best to move that loop across the border so that you only cross once. Don't worry too much about it, though, if you talk millions of calls.
This article goes the other way, but has some useful points.
Use our ManWrap library to get the best from .NET in Native C ++ Code
see also
Managed Code in Visual Studio 2005 and
Removing managed objects, wrapping around a library, and more
Rob prouse
source share