Communication between C# and C++ (Or between any managed and unmanaged language) is a pain in the ass and unless you have very very good reasons to use, should be avoided.
For communication, you can use pipes, WCF, COM, P/Invoke and some other custom commercial option. You can search the net for that. In an engine I worked on, we use an anonymous MemoryStream shared by multiple processes.
But what always come back as a problem, is that for any structural change in C++, you need to reflect those in C#. Like if you change the param a method takes, or the definition of a struct. There is some solution to automatically "mold" your C# to always be up to date with the C++, but they are expensive and heavy to implement.
Now, why you shouldn't bother! True, you won't find high-end commercial engine in something else than C++. Unreal? C++. Source? C++. Crysis? C++. Because C++ gives the performance that any managed language cannot offer. It also allow direct control of the memory and micro control of how the objects are created and erased.
So, why you shouldn't care? Because, unless your plan to ship a triple A game the size or range of Assassin's Creed, Half-Life or Skyrim, C# under the XNA Framework will give plenty of space and performance. Far more than you should ever need. If you actually have performance problem, good chance the managed language is not the problem and there should still be plenty of optim in your code left to be done. Chance is that if you have performance problem in C#, you would have them in C++ too.
XNA also give the ability to ship on Windows, Xbox and the different Microsoft portable devices. Beside, taking DirectX limit you to those platform anyway.