Как использовать существующий код C ++ в .NET (C #) - PullRequest
3 голосов
/ 15 января 2009

Я хотел бы создать проект на C # и реализовать существующий нативный (C ++) код. Кто-нибудь знает о каком-нибудь хорошем учебнике об этом?

Спасибо!

Ответы [ 6 ]

4 голосов
/ 15 января 2009

Вы можете использовать P / Invoke и вызывать неуправляемые методы. Я выложу вам несколько примеров: Это является ссылкой на официальную документацию MSDN. - это поддерживаемый сообществом веб-сайт с большинством распространенных неуправляемых библиотек Windows, а также сигнатурами методов и примерами

3 голосов
/ 18 января 2009

Я предполагаю, что реализует существующий код Вы имеете в виду, что хотите вызвать его из C #, с минимальными изменениями в коде C ++.

Я фанат и недавно приобрел книгу C ++ / CLI в действии , в которой есть несколько полезных примеров глав в Интернете.

Это введение в CodeProject является хорошей отправной точкой.

Автор C ++ / CLI в действии имеет ряд статей по CodeProject, прокрутите вниз до раздела C ++ / CLI по его индекс .

В статье Википедии о P / Invoke есть ряд причин, по которым вы можете не захотеть использовать этот подход, с чем я согласен:

  • потеря поддержки набора текста компилятором
  • возможные проблемы с типом данных или выравниванием, так как вам нужно сопоставлять типы вручную
  • нужно закрепить мусор

Лучшей отправной точкой в ​​MSDN является краткая статья .

3 голосов
/ 15 января 2009

Если ваш код C ++ управляется (как вы говорите), то я бы рекомендовал оставить его как C ++ , если у вас нет очень веской причины - будущие сборки C # (и т. Д.) Должны быть в состоянии просто ссылаться на него «как есть».

0 голосов
/ 15 января 2009

Я научился этому, сделав это, поэтому у меня нет хорошего учебника, но есть пара вещей, о которых нужно знать: управляемый 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 ++ представляет собой странную комбинацию большого количества взаимодействий для вас прозрачно и в то же время ничего для вас не делать (т. е. это не приведет к неявному марашаллингу).

0 голосов
/ 15 января 2009

Вероятно, самый простой способ сделать это - создать проект C ++ / CLI, который позволит вам смешивать управляемый и неуправляемый C ++. Затем вы можете обернуть существующие неуправляемые классы C ++ управляемой оболочкой .Net, которую ваш код C # может вызывать напрямую. В журнале MSDN есть хорошая вводная статья на C ++ / CLI.

Interop действительно будет полезен только для вызова функций в стиле C. Вы не можете использовать его для взаимодействия с чистыми классами C ++.

0 голосов
/ 15 января 2009

Почему бы вам не попробовать управляемые оболочки для вашего кода C ++.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmxspec/html/vcmg_accessingcodefromframeworkobjects.asp

...