Я научился этому, сделав это, поэтому у меня нет хорошего учебника, но есть пара вещей, о которых нужно знать: управляемый C ++ и C ++ / CLI объединяются с неуправляемым кодом с очень небольшим количеством уродливых швов. Это не так с C #. В управляемом C ++ вполне возможно сделать что-то вроде этого:
dotNetForm->Text = S"My Project"; // regular managed code
::SetWindowText(dotNetForm->Handle, "Your Project"); // mixed managed/unmanaged
тогда как в C # вам бы пришлось P / Invoke в SetWindowText - не то, что вы бы на самом деле: это простой пример, но вы должны знать, что управляемый компилятор C ++ представляет собой странную комбинацию большого количества взаимодействий для вас прозрачно и в то же время ничего для вас не делать (т. е. это не приведет к неявному марашаллингу).