Можно ли использовать C ++ с .NET Framework?

18

Я прочитал много комментариев о программировании GUI, как на C #, так и на C ++. И я заметил, что платформа Microsoft .NET является мощной для программирования GUI. Так можно ли использовать C ++ и .NET Framework?

Я думаю, что это будет отличная комбинация, поскольку C ++ является мощным языком, а .NET, как я читал, предпочтительнее для программирования GUI в Windows. Можно ли написать графический интерфейс на C # и функциональность на C ++?

ddacot
источник
7
C # также очень мощный язык.
Адам Кроссленд
2
@Ramhound: Это совсем не так, что C ++ / CLI такой же мощный, как C #. Код C ++ / CLI содержит все оптимизации от компилятора C ++ и может выполняться быстрее, и при этом содержит множество методов метапрограммирования и препроцессора, которых нет в C #.
DeadMG
2
Плюс, не должно быть никаких проблем с выбором C #, если кто-то хорош в C ++. Я не говорю, но я говорю.
Буровая установка
4
Учитывая, что вы знаете C ++, у вас будет выбор между изучением C ++ / CLI или C #. Ни один из них не является актуальным C ++. Я бы предложил изучать C #, а не пытаться работать с C ++ / CLI; C ++ / CLI нигде не является родным языком, поэтому вы найдете много книг и поддержку C #.
Дэвид Торнли
6
@ddacot нет, C ++ вообще не предназначен для разработки игр. Он предназначен для разработки программного обеспечения, как и все остальные языки программирования. Игры просто оказываются одним из видов программного обеспечения.
MattDavey

Ответы:

21

Да, раньше он назывался Managed C ++, а теперь C ++ / CLI . У вас есть доступ ко всей .NET Framework (GUI: WinForms, GDI + и т. Д.), Как и у других трех связанных управляемых языков, C #, F # и VB.NET.

Джесси С. Слайсер
источник
+1 к ответу Джесси. Если я не ошибаюсь, C ++ / CLI не поддерживает множественное наследование. Итак, будьте готовы к некоторым неожиданным особенностям. Некоторые из этих функций пришли из ограничений CLI. Я рекомендую вам попытаться найти разницу между C ++ / CLI и «классическим» C ++, прежде чем начать его использовать.
Игорь Солоиденко
Это упоминается более подробно в первой ссылке. Таким образом, сводка такова: «C ++ значительно эволюционировал с течением времени, и большая часть программного обеспечения, написанного на языке, является объектно-ориентированной. заключается в том, что возможности множественного наследования не поддерживаются. Это связано с ограничением CLR. Класс, управляемый в сборщике мусора CLR, не может наследовать более одного класса ».
Джесси С. Слайсер
Ничего страшного. На самом деле, я не очень хорош в C ++. Я просто подумал, что могут быть и другие важные отличия, которые могут создать проблемы.
Игорь Солоиденко
В прошлый раз я написал немного C ++ буквально где-то в прошлом веке :)
Джесси С. Слайсер
1
@keykeeper, типичное использование C ++ / CLI - быть тонким мостом между неуправляемой библиотекой C ++ и управляемым миром. Этого достаточно для такого использования. Конечно, нет смысла кодировать в нем что-то значительное.
SK-logic
6

Не забывайте о наиболее гибком и простом варианте, типичном для Unix-мира, но по какой-то причине не столь распространенном в Windows: разделение графического интерфейса пользователя и логики на разные процессы, обмен данными через любую разумную форму RPC (например, даже канал должен Работа). Желательно с простым, читаемым человеком текстовым протоколом.

Таким образом, вы можете реализовать свой GUI (или различные GUI) с любыми технологиями, которые вам нравятся, и создавать логические компоненты из того, что вам больше подходит - C ++, скрипты и все остальное.

Я не знаю каких-либо разумных преимуществ монолитного подхода к проектированию из мира Windows.

SK-логика
источник
4

Я делал это однажды несколько лет назад, во времена Managed C ++. У нас была некоторая бизнес-логика в неуправляемой DLL, которую мы хотели включить в графический интерфейс в стиле мастера, написанный на C #. Для этого я создал сборку Managed C ++, расположенную между управляемым приложением GUI и неуправляемой DLL, и использовал System :: Runtime :: InteropServices :: Marshal в этой сборке для преобразования значений из управляемых типов (System :: Int32) в неуправляемые типы (int) и наоборот.

Хотя Managed C ++ выглядит устаревшим, тот же принцип может применяться к C ++ / CLI.

Рэймонд Салтрелли
источник
3

На самом деле, нет. Существует гибридный язык C ++ / CLI, но он хорош только для взаимодействия (официальная политика Microsoft). Из-за способа разработки .NET Framework существует много языковых семантик, которые действительно не подходят для работы на CLR, и C ++ демонстрирует многие из них.

DeadMG
источник
7
Я не согласен с этим утверждением. C ++ / CLI идеально подходит для многих реализаций.
Ramhound
3
@Ramhound: сами Microsoft рекомендуют его только для взаимодействия. Это их официальная политика.
DeadMG
2
@DeadMG Можете ли вы предоставить источник для этого?
sq33G
1
@DeadMG, ты не прав. Существует так много вариантов запуска .NET GUI с нативной логикой.
SK-logic
2
@DeadMG - Если вы не предоставите доказательство того, что это официальная политика Microsoft (я не верю ни на минуту), тогда вы просто
разыгрываете
3

До сих пор угол C ++ / CLI охватывался множеством ответов, но другой способ сделать это - использовать PInvoke. Это позволяет программам на C # вызывать функции, содержащиеся в dll, написанных на C ++. Преимущество PInvoke состоит в том, что ваша dll полностью независима от того, что она будет вызываться из .Net. Это означает, что вы можете вызывать библиотеки DLL, для которых у вас нет исходного кода, и даже если вы сделали исходный код, вам не пришлось бы перекомпилировать его с помощью параметра / clr. Это означает, что вы можете использовать эту dll с другими программами на C ++, а также с программами на C #. Есть несколько фантастических библиотек C / C ++: PInvoke позволяет вам воспользоваться ими. Иногда библиотеки Win32 предоставляют функции, которые просто недоступны в .Net: PInvoke позволяет вам их использовать.

Одна из самых сложных частей использования PInvoke - это умение преобразовывать неуправляемую подпись в управляемую подпись. Но есть шпаргалка , чтобы помочь с этим.

Филипп Нган
источник
Но когда P / Invoking C ++ напрямую, помните о искажениях или лучше предоставьте тонкую оболочку C между ними.
SK-logic
0

Вы также можете работать с укропом C # через COM (объектная модель компонентов). Для меня COM лучше, чем использовать Managed C ++, поскольку Visual Studio 2010 не имеет смысла для Managed C ++. В моем случае у нас уже есть большое приложение на C ++, но мы хотели попробовать перейти от MFC к WinForms или WPF.

Travis
источник