Как использовать существующий код C ++ в .NET (C #)
-
22-07-2019 - |
Вопрос
Я хотел бы создать проект на C # и реализовать существующий собственный код (C ++).Кто-нибудь знает о каком-нибудь хорошем учебнике по этому поводу?
Спасибо!
Решение
Другие советы
Если ваш код на C ++ является управляемым (как вы говорите), то я бы посоветовал вам оставить его как C ++ если не у вас есть очень веская причина для - будущие сборки C # (и т.д.) Должны иметь возможность просто ссылаться на него "как есть".
Я предполагаю, что по внедрить существующий код вы имеете в виду, что хотите вызвать его с C #, с минимальными изменениями в коде C ++.
Я фанат и недавний покупатель этой книги C ++ / CLI в действии в котором есть пара полезных примеров глав в Интернете.
Это введение в CodeProject это хорошая отправная точка.
У автора C ++ / CLI in Action есть несколько статей о CodeProject, прокрутите вниз до раздела C ++ / CLI о его индекс.
В Статья в Википедии о P / Invoke есть ряд причин, по которым вы, возможно, не захотите использовать такой подход, с которыми я согласен:
- потеря поддержки набора текста компилятором
- возможные проблемы с типом данных или выравниванием, поскольку вам приходится сопоставлять типы вручную
- нужно закрепить объекты, собранные из мусора
Лучшей отправной точкой в MSDN является краткая статья.
Почему бы вам не попробовать управляемые оболочки для вашего кода на C ++.
Вероятно, самый простой способ сделать это - создать проект C ++ / CLI, который позволит вам смешивать управляемый и неуправляемый C ++.Затем вы можете обернуть существующие неуправляемые классы C ++ управляемой .Сетевая оболочка, которую ваш код C # может вызывать напрямую.В журнале MSDN есть хорошая вводная Статья на C ++ / CLI.
Взаимодействие действительно будет полезно только для вызова функций в стиле C.На самом деле вы не можете использовать его для взаимодействия с чистыми классами C ++.
Я научился этому, выполняя это, поэтому у меня нет хорошего руководства, но есть пара вещей, о которых вам нужно знать - управляемый C ++ и C ++ / CLI оба интегрируются с неуправляемым кодом с очень небольшим количеством некрасивых швов.Это не относится к C #.В управляемом C ++ вполне возможно сделать что-то подобное:
dotNetForm->Text = S"My Project"; // regular managed code
::SetWindowText(dotNetForm->Handle, "Your Project"); // mixed managed/unmanaged
принимая во внимание, что в C # вам пришлось бы P / Вызывать в SetWindowText - не то чтобы вы действительно хотели:это всего лишь простой пример, но вы должны знать, что управляемый компилятор C ++ представляет собой странную комбинацию прозрачного взаимодействия для вас и в то же время ничего не делающего для вас (т. Е. он не будет выполнять неявный марашаллинг).