Что можно сделать в VC ++ (нативном), что нельзя сделать с помощью VC #? - PullRequest
9 голосов
/ 16 апреля 2009

Что можно сделать в VC ++ (нативном), что нельзя сделать с помощью VC #?

Из того, что я могу сказать, единственное, для чего стоит использовать нативный VC ++, - это когда вам нужно управлять памятью самостоятельно, а не сборщиком мусора CLR, чего я и не видел в этом (но это другой вопрос спросил позже).

Ответы [ 14 ]

13 голосов
/ 16 апреля 2009

Кроссплатформенная разработка. Да, Mono существует, и Java несколько более предсказуемый, чтобы он функционировал точно так же на большем количестве платформ, вы можете найти компилятор C / C ++ практически для любой платформы, где вы не можете с C #.

Также ссылки на сторонние библиотеки, хотя я уверен, что есть способ использовать их в C #, вы сможете использовать их без взаимодействия (Marshaling и т. Д.) В C ++.

Редактировать: еще одна вещь: НАДЕЖНОЕ управление памятью. Да, вы можете использовать dispose() и try-finally, но нет ничего лучше, чем ЗНАТЬ, что память исчезает, когда она извлекается из стека. С помощью таких методов, как RAII, когда вы используете хорошо сконструированные классы, вы будете ЗНАТЬ, когда ваши классы высвобождают ресурсы, и не будут ждать, пока произойдет GC.

8 голосов
/ 16 апреля 2009

С P / Invoke очень мало, что невозможно в .NET (наиболее очевидно, драйверы устройств).

Есть также вещи, где совет не использовать .NET (например, расширения оболочки, которые загружаются в любой процесс, открывающий диалог с файлами 1 ).

Наконец, есть вещи, которые будут намного сложнее в .NET, если это вообще возможно (например, создание COM-компонента, который объединяет FTM).

1 Это может создать проблему, если этот процесс уже использует другую версию .NET. Это должно быть облегчено в будущем, так как .NET 4 будет иметь возможность поддерживать параллельные экземпляры среды выполнения.

7 голосов
/ 16 апреля 2009

Я не уверен, говорите ли вы о языковых функциях или приложениях. Мой ответ, однако, для приложений / компонентов.

На самом деле есть только 2 вещи, которые вы не можете сделать в C #, которые вы можете делать в C ++.

  • Вы не можете использовать C # или любой другой язык .Net, чтобы написать компонент для системы, которая принимает только собственные компоненты
  • Вы не можете использовать C # или любой другой язык .Net, чтобы изменить некоторые свойства CCW, для которых CLR не разрешает настройку

Самым заметным элементом здесь являются драйверы устройств. Это платформа, которая принимает только собственные компоненты, и нет никакого способа подключить управляемый компонент.

Для всего остального можно сделать то же самое в C #, как и в C ++. Есть просто много случаев, когда вы просто не хотите, и нативное решение лучше. Например, можно управлять и манипулировать памятью в C # через небезопасный код или IntPtr. Это просто не так просто и, как правило, нет причин.

6 голосов
/ 16 апреля 2009

Вы не можете написать драйверы устройства для одного.

4 голосов
/ 16 апреля 2009

Я думаю, что есть несколько важных моментов:

Вы можете делать все что угодно на C # / C ++ / Java / Python / Lisp или почти на любом другом языке, наконец, все они завершены по Тьюрингу ;) ... Вопрос в том, удовлетворяет ли это вашим потребностям?

  1. Существует одно большое и чрезвычайно важное ограничение C # ... Он запускает только одну единственную платформу Windows ... (Mono все еще не достаточно зрелый ).
  2. Есть много приложений, в которых GC - просто пустая трата ресурсов, приложения, которые не могут позволить себе тратить половину памяти до следующего цикла gc: игры, базы данных, обработка видео auido и многие другие критически важные приложения.
  3. Приложения реального времени (снова игры, обработка видео и т. Д.). Недетерминированный GC усложняет им жизнь.

Фактически, большинство настольных приложений: веб-браузеры, текстовые процессоры, сама среда рабочего стола (например, Windows Explorer, KDE или Gnome) написаны на скомпилированных языках с тщательным осмыслением ресурсов ... В противном случае они просто ужасно раздуты приложения.

3 голосов
/ 16 апреля 2009

Есть два очевидных ответа:

  • VC # никогда не сможет работать без .NET фреймворк. Родной C ++ может. Это может быть необходимым в некоторых областях (другие упомянули драйверы устройств, но более распространенные примеры могут быть просто клиенты с платформой .NET не установлено. Возможно ты распространяя приложение, и вы знаю, что не все ваши клиенты готовы установить .NET, так что ваш продажи выросли бы, если бы вы сделали приложение это просто работало без зависимость от .NET. Или, возможно, вы работая на каком-то мобильном устройстве, где пара мегабайт занята .NET CF не может быть оправдано. Или расширения оболочки, где использование .NET может вызвать неприятные проблемы для пользователя.
  • И VC # никогда не может использовать язык C ++ функции. Родной C ++ может. (Удалось C ++ тоже может, конечно, но это другая проблема). Верьте или нет, есть вещи, которые можно сделать более удобно или элегантно в C ++. И они доступны только если вы программируете на C ++.

Системные вызовы не проблема, однако. p / invoke позволяет вам делать это из C # почти так же легко, как из C ++.

3 голосов
/ 16 апреля 2009

В то время как написание расширений оболочки в Windows XP было возможно в C #, почти невозможно писать расширения оболочки для Vista и Windows 7. Расширения оболочки и расширения пространства имен (и все, что использует новую систему свойств) (kindof) должны сделано в C ++, если вы не в боль .

2 голосов
/ 16 апреля 2009
  • встроенный ассемблер
  • Нельзя использовать C ++ - библиотеки с классами (P / Invoke можно использовать только для функций AFAIK)
  • Вы не можете использовать обратные вызовы с P / Invoke.
1 голос
/ 16 апреля 2009

Есть также жесткие приложения в реальном времени. Любой язык с GC не может быть использован, на тот случай, если он решит собирать его во время части кода, ограниченной по времени. Java была печально известна тем, что даже не позволяла вам попробовать (следовательно, лицензионное соглашение не использовало его для программного обеспечения, «предназначенного для использования при проектировании, строительстве, эксплуатации или обслуживании любого ядерного объекта»

(да, я знаю, что с тех пор они создали модифицированную версию Java для систем реального времени).

1 голос
/ 16 апреля 2009

Это язык в щеках, но это также ответ на ваш вопрос ... вы можете испортить ситуацию в VC ++ гораздо сильнее, чем в VC #. Не то, чтобы вам не удавалось серьезно что-то испортить в VC #, но в целом, вы можете все испортить проще и тщательнее в VC ++.

Опять же, язык в щеке, но также и ответ на ваш вопрос. Возможно, не то, на что вы надеялись, но ...: -)

...