2009-06-19 2 views
8

Я пишу небольшое приложение, которое требует нескольких списков, кнопок, текстовых полей. Он будет связан с Boost, MySQL и т. Д. C++ static libs. Для проекта требуются функции win32. Я считаю, что Winforms будет в порядке (MFC и CodeJock требуют слишком много времени)..NET GUI - C# vs C++/CLI

Так что C++/CLI кажется идеальным для работы. Просто используйте стандартный C++ вместе с графическим интерфейсом. Затем я просматриваю потоки, предлагая вам написать свой графический интерфейс на C#. Затем используйте p/Invoke (медленный) или интерфейс C++/CLI для стандартных DLL на C++.

Пример: http://social.msdn.microsoft.com/Forums/en-US/clr/thread/6ae877ac-07b4-4d26-8582-de475ee9a5cb

Почему? Какое преимущество в использовании C# для вашего winforms GUI вместо C++/CLI (они выглядят одинаково, команды одинаковы). Какой недостаток заключается в использовании исполняемого файла C++/CLI вместо стандартного исполняемого файла C++. Я могу понять, была ли кросс-платформенная совместимость проблемой, но тогда вы могли просто не использовать управляемые функции (кроме графического интерфейса).

Я не понимаю, почему вы использовали бы C#, а затем зайдите так далеко, чтобы разделить его с «DLL-движком». Если, конечно, «DLL-движок» не использовался и для других приложений.

Благодаря

+3

P/Invoke не работает медленно, если он используется правильно. Наше приложение содержит около 30 тыс. Строк C# и 200k + из C++ с P/Invoke и управляет интерактивными фреймами с анимацией/и т. Д. Вам просто нужно убедиться, что ваши интерфейсы между C# и DLL (-ами) являются чистыми и минимальными. –

+0

@RonWarholic Я не так хорошо знаком с P/Invoke, но разве не утомительно полностью переписать объявления функций 200k строк кода? – MasterMastic

+0

Если вы держите свой открытый API чистым и плотным, там не так много переписывания. Есть тысячи функций в библиотеке, но только 80 или около того подвергаются стороне C#. –

ответ

19

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

Приложения C++/CLI отличаются от стандартных C++ со всеми этими символами^и%, которые, по крайней мере, я считаю, что это НЕ C++.

Большинство советов также приходит с точки зрения, что вы хотите создать приложение .NET, а C++/CLI используется в качестве слоя клея. Всякий раз, когда я использовал C++/CLI, это было неохотно и почти всегда, потому что в какой-то сторонней библиотеке было много сложных объектов C/C++, которые они передавали. При использовании C# и P/Invoke вам часто приходится создавать классы для зеркалирования структур и классов, которые находятся в заголовочных файлах C++ программного обеспечения, с которым вы взаимодействуете. Хранение тех, кто синхронизирован, является трудоемким, и сделать ошибки легко. Кроме того, выяснение того, как маршалировать структуру с указателями на структуры массивов структуры, заставит ваш мозг расплавиться!

Мой общий совет - использовать C# (или VB.NET) для создания максимально возможного кода для вашего приложения. Использовать P/Invoke, когда необходимо вызвать Win32 API и/или сторонние SDK, ограничено, а интерфейсы и параметры просты. Используйте C++/CLI в качестве слоя клея, когда это невозможно.

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

+0

Избегайте C++/CLI, если * вообще * возможно - как C++ CLI-кодер, я могу сказать - отличный совет. Игнорируйте это на своих опасных людях! – mackenir

0

Я задавался вопросом об этом, поэтому с Visual Studio 2008 я создал новый проект приложения Windows Forms с использованием C++/CLI в качестве языка. Первое, что он сделал, это вызвать ошибку. Поэтому я воспринял это как признак того, что этот материал не совсем готов к использованию. Возможно, я не даю ему достаточно шанса!

The file 'c:\source\Test\Test\Form1.h' does not 
support code parsing or generation 
because it is not contained within a 
project that supports code. 

Это происходит всякий раз, когда я пытаюсь открыть мастер-созданный Form1.h файл.

+1

Прекрасно работает для меня. Он также запускает собственный C++, если вы положили его на/clr и выключили/clr: pure. Итак, вы начинаете с приятного пользовательского интерфейса Winforms и используете свой обычный код на C++. Конечно, я ставлю 10 долларов, я через несколько дней столкнулся с проблемами с библиотеками и т. Д. и нужно переключиться на интерфейс C# UI или Qt UI. –

4

Лично я люблю C++/CLI, но я бы предпочел написать свой интерфейс в C#.

C++/CLI является отличным для работы непосредственно с Win32 или с устаревшим кодом, но он немного подробный для моей симпатии, когда дело доходит до кода пользовательского интерфейса. WinForms UI-код на C# хорош и прост (по большей части, ха-ха). Написание кода пользовательского интерфейса на C++ почти всегда беспорядочно (просто посмотрите на MFC).

Почему бы просто не создать свой пользовательский интерфейс на одной сборке C# и не поместить весь свой код нижнего уровня в сборку C++/CLI? Хорошая вещь о C++/CLI заключается в том, что вы можете создать управляемый уровень, который может легко вызвать код C#. Затем этот управляемый слой легко переадресует вызовы на собственный слой с прямым кодом C++ или C.

+0

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

+0

Насколько эффективна производительность при использовании C++/CLI для вещей, связанных с, например, структурами данных? Является ли STL значительно быстрее, чем BCL для коллекций? –

2

Какие преимущества есть при использовании C# для GUI WinForms вместо C++/CLI (они выглядят так же, как команды одинаковы)?

Они не выглядят одинаково. C# по-моему чище и имеет некоторые полезные абстракции. Поддержка инструментов значительно лучше для C# или VB.net.

Look here for an example comparison

И не забывайте продуктивные особенности языка, как лямбда-выражения, LINQ, тип вывода и т.д., которые имеют тенденцию попасть в C# первый и просачивания VB.net достаточно скоро, но редко находят свой путь вниз C++/CLI.

0

Я пишу небольшое приложение, которое требует нескольких списков, кнопок, текстовых полей. Он будет связан с Boost, MySQL и т. Д. C++ static libs. Проект требует функций win32 ...

Я, вероятно, получить риск быть downvoted, но, если большая часть кода уже написана на C++ и использовать функциональные возможности C++, woudn't бы проще написать свой графический интерфейс in Родной C++.

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

+0

WTL - еще один хороший выбор для собственного пользовательского интерфейса Windows. –

+0

Я рассмотрел Qt, и в большинстве случаев вы были бы абсолютно правы. Этот конкретный проект немного слишком мал, чтобы начать изучение Qt4. Плюс я бы хотел узнать немного больше о VS-ориентированных вещах. Если я сделаю вторую версию, я, вероятно, переключусь (другая причина, кроме UI, я не использую управляемый код). –

0

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

1 Я уже знаю, C

2 Я знаю, что это намного проще и быстрее код, используя C

Но, как я сказал, если вы уже получил код C++, который вы действительно хотите начать с нуля?

+1

Одна из самых больших проблем компилятора C++/CLI заключается в том, что он НЕ является надмножеством C++. Если вы начнете использовать передовые средства C++ (например, шаблоны или некоторые интересные вещи из boost), C++/CLI просто столкнется с несколькими проблемами. В этом случае вы должны использовать pImpl-Idiom, так что для вашего продвинутого C++ будет вызываться стандартный компилятор C++. Это приводит к большому шаблону кода, что делает C++/CLI гораздо менее полезной, чем я хотел. – Oliver