Какие преимущества дает разработка приложения Win32 на C++ по сравнению с приложением.NET на C#?
Я изучил программирование Windows с использованием Visual C++ и Win32 API. В настоящее время кажется, что большинство приложений разрабатываются в.NET с использованием C#. Я понимаю, что в большинстве случаев разница между производительностью и управляемым кодом невелика. Поэтому мне интересно, если бы я начал писать новое настольное приложение сегодня, есть ли какая-либо причина (кроме факта, что я больше знаком с C++), что я мог бы вместо этого написать его в неуправляемом C++.NET? Есть ли еще преимущества использования C++ и нативного кода? Или этот метод был более или менее заменен.NET на платформе Windows?
Конечно, я знаю, что люди, которые пишут низкоуровневые драйверы устройств и подобные программы, не будут делать это в.NET. Я спрашиваю со ссылкой на типичные клиентские приложения, которые не выполняют прямые аппаратные вызовы.
9 ответов
- Производительность (определенные ситуации, например графика)
- След памяти (как сказал Манкузо)
- Использование существующих библиотек
- Нет необходимости во время выполнения
- Более тонкий контроль
Чтобы перечислить несколько.
Тем не менее, вы также можете посмотреть на вопрос с противоположной стороны, чтобы оценить, какой язык использовать.
Кроме того, вы можете использовать C++/CLI для включения как собственного, так и.net кода.
IMO, наиболее важный для небольших загружаемых приложений, состоит в том, что нативный код не нуждается в среде выполнения.NET. В то время как широкополосная связь становится все более и более распространенной, далеко не у всех она есть.
Некоторые люди могут быть разочарованы, увидев, что вашему 2-мегабайтному приложению на самом деле требуется еще 20 МБ загрузки фреймворка и трудоемкий процесс установки для запуска. Если они не уверены, действительно ли им действительно нужно ваше приложение, они могут просто удалить его, прежде чем даже попробовать и обратиться к конкурирующему продукту.
Если ваше приложение должно работать без установки (то есть, если вы не можете или не должны делать что-то вроде установки.NET Framework), вы не можете рассчитывать на то, что.NET находится на компьютере с Windows (до Vista).). Многие полезные приложения могут попасть в эту категорию.
Я бы порекомендовал написать каждое настольное приложение в управляемом коде. .NET/C# - отличная платформа для этого.
Мои причины:
- Производительность штрафа незначительна. Google для тестов, если вы не поверите мне на слово. Что важнее, так это сам код. Вы можете написать O(n^m) алгоритмов на C++ или.NET/C#. В наши дни двигатели JIT очень развиты
- Неуправляемый C++ имеет серьезные недостатки, когда речь идет о модульном тестировании, макете и рефакторинге. Это очень громоздко и негибко. Reflection позволяет управляемому коду сделать такие вещи очень удобными.
- Развертывание - это небольшая проблема. Тем не менее, создание установки, которая проверяет необходимые предварительные условия.NET и автоматически устанавливает их, не представляет никакой сложности.
- Компиляция быстрее, без компоновщика! Это даже происходит в фоновом режиме, когда вы редактируете код.
- Поддержка библиотек.NET намного лучше и чище, чем STL, MFC и boost.
- Нет заголовочных файлов и макросов. Они просто подвержены ошибкам.
- Безопасность! До свидания переполнения буфера, плохие указатели, неинициализированные переменные...
- Исключения Очистить иерархию исключений в.NET. C++ исключения перепутаны.
Если вы можете позволить себе зависимость от стека, выберите.NET Современный, элегантный, мощный и, как следствие, гораздо более быстрый способ разработки.
Но поймите, что вы привязываете свое приложение к нему - к языку и структуре, если вы предвидите будущее, в котором вы можете избежать этого, тогда лучше подумайте дважды.
Win32 старый и неуклюжий, но он работает практически на любой версии Windows без дополнительных зависимостей, и ваш код может быть простым, переносимым, C/C++.
+1 за то, что не требуется пакет / установка.NET на целевых машинах. Это все еще большая проблема.
Когда все машины имеют моно или NET, это не будет таким большим делом.
След памяти. Но если вы разрабатываете для машин с ограниченными возможностями памяти, это не должно быть проблемой для большинства приложений.
Программы.Net также имеют срок службы поддержки, где родной нет. Native будет работать в течение многих лет в разных ОС без необходимости обновлений.
Программы.Net могут скрываться из-за плохой конфигурации.Net, родная просто продолжает работать и практически не зависит от обновлений ОС.
.Net программы запускаются медленно и чувствуют себя вялыми, родные запускаются быстро и быстро.
.Net должен быть закодирован для наименьшего общего знаменателя (наиболее распространенная версия фреймворка), Native компилирует весь код в приложение - так что используйте то, что вы хотите.
Используйте Delphi для Native, а не C++. .Net частично основан на бэкэнде Delphi RAD и Java.
Две вещи, о которых я могу думать.
Защита интеллектуальной собственности. Для кого-то бесконечно труднее перепроектировать приложение Unmanaged C++. Управляемые приложения.Net или Java могут быть легко декомпилированы, это не относится к Unmanaged C++.
Скорость. C++ ближе к аппаратному обеспечению и занимает меньше места в памяти, как упоминалось в другом комментарии. Вот почему большинство видеоигр по-прежнему пишутся на C++ и встроенной сборке.