Как использовать существующий код C++ в.NET (C#)
Я хотел бы создать проект на C# и реализовать существующий нативный (C++) код. Кто-нибудь знает о каком-либо хорошем учебнике об этом?
Спасибо!
6 ответов
Вы можете использовать P/Invoke и вызывать неуправляемые методы. Я приведу несколько примеров: Это ссылка на официальную документацию MSDN. Это поддерживаемый сообществом веб-сайт с большинством распространенных неуправляемых библиотек Windows, а также сигнатурами методов и примерами.
Я предполагаю, что под реализацией существующего кода вы подразумеваете, что хотите вызвать его из C#, с минимальными изменениями в коде C++.
Я фанат и недавно приобрел книгу C++/CLI in Action, в которой есть несколько полезных примеров глав в Интернете.
Это введение в CodeProject является хорошей отправной точкой.
Автор C++ / CLI в действии имеет ряд статей по CodeProject, прокрутите вниз до раздела C++ / CLI своего индекса.
В статье в Википедии о P/Invoke есть несколько причин, по которым вы можете не захотеть использовать этот подход, с чем я согласен:
- потеря поддержки набора текста компилятором
- возможные проблемы с типом данных или выравниванием, так как вы должны вручную отображать типы
- нужно закрепить мусор
Лучшей отправной точкой на MSDN является краткая статья.
Если ваш код C++ управляется (как вы говорите), то я бы предложил оставить его как 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/Invoke в SetWindowText- не так, как вы бы это хотели на самом деле: это просто простой пример, но вы должны знать, что управляемый компилятор C++ представляет собой странную комбинацию прозрачного выполнения большого количества взаимодействий для вас и ничего не делая для вас в то же время (то есть, это не приведет к неявному марашаллингу).
Почему бы вам не попробовать управляемые оболочки для вашего кода C++.
Вероятно, самый простой способ сделать это - создать проект C++/CLI, который позволит вам смешивать управляемый и неуправляемый C++. Затем вы можете обернуть существующие неуправляемые классы C++ управляемой оболочкой.Net, которую ваш код C# может вызывать напрямую. В журнале MSDN есть хорошая вводная статья по C++/CLI.
Interop действительно будет полезен только для вызова функций в стиле C. Вы не можете использовать его для взаимодействия с чистыми классами C++.