2012-01-26 2 views
14

Я много работал с C#, однако я начинаю проект, где наш клиент хочет, чтобы весь код был написан на C++, а не на C#. Этот проект будет сочетанием между управляемым (.NET 4.0) и родным C++. Будучи тем, что я всегда предпочитал C# для C++ для своих потребностей .NET, мне интересно, есть ли какие-то важные различия, которые я могу не знать о том, как использовать C# и управляемый C++?Managed C++ (C++/CLI) vs C#/VB.NET

Любое понимание этого очень ценится.

EDIT Глядя на Википедию для управляемого кода на C++, показано, что новая спецификация - это C++/CLI, и что «управляемый C++» устарел. Обновлено название, чтобы отразить это.

+0

... Я знаю об этом. Я больше ищу такие вещи, как причуды или дополнительные лакомства, которые могут иметь использование C++/CLI для платформы .NET, а не для использования C# и VB.NET. Например, существует несколько небольших различий между C# и VB.NET, хотя оба они используют CLR. –

+2

Единственная веская причина для управляемого C++ - interop. И тот факт, что вы можете иметь собственные «thunks» (для скорости, которая может быть намного быстрее, чем управляемый код, пример шифрования). ИМО, использующий чистый режим C++/CLI, бесполезен. – leppie

ответ

9

C++/CLI - это полноценный язык .NET, и, как и другие языки .NET, он отлично работает в управляемом контексте. Подобно тому, как работа с родными вызовами в C# может быть чередованием боли, C++ и Managed C++ могут привести к некоторым проблемам. С учетом сказанного, если вы работаете с большим родным кодом на C++, я бы предпочел использовать C++/CLI над C#. Есть немало проблем, большинство из которых можно было бы покрыть, не пишите C++/CLI, как если бы вы писали C# и не записывали его так, как если бы вы писали родной C++. Это его собственная вещь.

Я работал над несколькими проектами C++/CLI, и подход, который я бы взял, действительно зависит от воздействия различных уровней приложения на собственный C++-код. Если основная часть приложения является родной, а точка интеграции между нативным и управляемым кодами немного нечеткая, я бы использовал C++/CLI. Преимущество управления в C++/CLI перевешивает его проблемы. Если у вас есть четкие точки взаимодействия, которые могут быть адаптированы или абстрагированы, я бы настоятельно предложил создать слой моста C++/CLI с C# выше и C++ ниже. Основная причина этого в том, что инструменты для C# являются более зрелыми и более повсеместными, чем соответствующие инструменты для C++/CLI. С учетом сказанного, проект, над которым я работал, был успешным и не был кошмаром, на который указывал другой.

Я также хотел бы убедиться, что вы понимаете, почему клиент направляется в этом направлении. Если идея состоит в том, что у них есть куча разработчиков на C++, и они хотят упростить для них переход к написанию управляемого кода, я бы поставил клиенту, что изучение C# может быть менее сложным, чем изучение C++/CLI.

Если клиент считает, что C++/CLI быстрее, это просто некорректно, поскольку все они скомпилированы до IL. Однако, если у клиента много существующей или текущей родной разработки на С ++, тогда текущий путь может быть лучшим.

+0

Это может быть мое невежество, но мой опыт работы с абонентскими вызовами с C# был приятным, если, на самом деле, забывать, потому что вам не нужно делать большую часть времени. Да, передача управляемых объектов может быть болью, но если вы просто используете примитивные типы и структуры, это довольно просто. Я продолжаю видеть в этом потоке, что родные вызовы проще в C++. Можете ли вы просветить меня? – siride

+0

Прежде всего, нативные вызовы, которые вы делаете, относятся к c api, который не имеет понятия объектов.Использование C++ apis из C# было бы почти невозможным, так как название отображалось и другие проблемы. Кроме того, в C++ у вас есть прямой контроль над распределением стратегии распределения памяти, .... Большинство из этих вещей достижимы в C#, но с огромным набором функций для поддержки их, которые вы имеете на C++. – rerun

+0

yep, забыл про название mangling. Это боль. C API - это просто, но мне никогда не приходилось использовать C++ API. Получил это сейчас. – siride

3

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

Итак, вы можете себе представить количество управляемых элементов управления, которые у меня были в моих формах: календари/сборщики времени, комбо коробки, сетки и т. д.

Худшая часть заключалась в том, чтобы использовать только типы C++ для моего внутреннего блока и использовать управляемые типы для интерфейсного. Во-первых, вы не можете назначить строку std управляемой строке. Вам нужно будет все конвертировать. Очевидно, вам придется преобразовать его обратно ...

Каждый раз, когда мне нужно было заполнить сетку, я сериализовал свои C++-коллекции на что-то вроде vector<std::string>, извлеките это в своей библиотеке пользовательского интерфейса, а затем зациклируйте его и сделайте новый DataGridRow, чтобы добавить их в сетку. Который, очевидно, может быть сделан за 3 минуты с C# и некоторым Linq to SQL.

Я закончил с A + для этого приложения, но, честно говоря, это абсолютно сосало. Я просто не могу представить, насколько жалко было приложение для меня, чтобы получить это.

Я думаю, было бы проще, если бы я использовал List<Customer>^ (управляемый список какого-либо объекта) в моем C++ вместо того, чтобы всегда преобразовывать все между векторами строк. Но мне нужно было держать C++ в чистоте от управляемых материалов.

/pissedof

+0

То, как я предполагаю, что этот проект продвигается вперед, управляемый C++ будет использоваться для большинства проектов, однако он может легко превратиться в точный внешний интерфейс/back-end сценарий, который вы только что описали. –

+0

Я серьезно. Это было абсолютно ужасно. Я не могу себе представить, как использовать/продавать это приложение или что-то в этом роде. – Dave

2

С использованием всех трех областей (.NET, C++/CLI и C++), я могу сказать, что во всех отношениях я предпочитаю использовать .NET (через C# или VB.NET). Для приложений вы можете использовать WinForms или WPF (последний из которых я нахожу намного лучше - особенно для приложений, которые выглядят гораздо более удобными для пользователя).

Основная проблема с C++/CLI заключается в том, что у вас нет всех хороших функций языка, которые вы получаете в .NET. Например, ключевое слово yield в C# и использование лямбда (я не думаю, что это поддерживается в C++/CLI - не держите меня за это).

Существует, однако, одно большое преимущество C++/CLI. Это значит, что вы можете создать мост, позволяющий связывать C# и C++. В настоящее время я работаю над проектом, в котором многие математические вычисления и алгоритмы уже написаны (на протяжении многих лет) на C++, но компания хочет перейти к пользовательскому интерфейсу на основе .NET. После изучения различных решений я пришел к выводу, что C++/CLI был намного лучше для этого. Одно из преимуществ заключается в том, что это позволило мне создать API, который для .NET-разработчика выглядел и работал так же, как и тип .NET.

Однако для разработки внешнего интерфейса приложения я бы не рекомендовал C++/CLI. С точки зрения удобства использования (с точки зрения времени разработки при ее использовании) это просто не стоит.Одна большая проблема заключается в том, что VS2010 dropped support for IntelliSense for C++/CLI для «улучшения общего IntelliSense» (я думаю, специально для C++). Если вы еще не пробовали, я бы определенно посоветовал проверить WPF для приложений.

+0

Да, поддержка C++/CLI для IntelliSense в 2010 году - одна из проблем, о которых я знаю. IntelliSense не является требованием, хотя, что отстой, потому что я полагаюсь на него ежедневно как часть моего рабочего процесса. –

+0

И использование WPF «нецелесообразно», потому что, как отмечено в другом комментарии, клиент должен будет изучить его. Но почему бы мне просто не использовать конструктор, чтобы скомбинировать быстрый интерфейс, как если бы я использовал C# или VB.NET? Разве это для C++/CLI или что-то еще? –

+0

@BasedAsFunk Дизайнер WinForms, похоже, такой же, как если бы он использовался в .NET-проекте, поэтому я не вижу проблемы с его использованием, чтобы собрать прототип интерфейса. –

Смежные вопросы