Что может быть сделано в VC ++ (собственный компонент), который не может быть сделан с VC#?

Вы можете сохранить свой массив в объекте, который можно назначить для сценариев. Более подробная информация здесь

9
задан rjzii 16 April 2009 в 19:56
поделиться

14 ответов

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

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

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

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

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

7
ответ дан 4 December 2019 в 06:03
поделиться
  • встроенный ассемблер
  • Вы не можете использовать C ++ - библиотеки с классами (P / Invoke можно использовать только для функций AFAIK )
  • Вы не можете использовать обратные вызовы с P / Invoke.
2
ответ дан 4 December 2019 в 06:03
поделиться

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

3
ответ дан 4 December 2019 в 06:03
поделиться

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

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

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

На самом деле, большинство настольных приложений: веб-браузеры, текстовые процессоры,

4
ответ дан 4 December 2019 в 06:03
поделиться

Является ли C # в частности и .NET в целом самокомпилирующимся (это не тролль, я искренне не знаю)? Если нет, вы можете использовать VC ++ для написания C # и .NET, но вы не можете использовать C # для той же работы.

1
ответ дан 4 December 2019 в 06:03
поделиться

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

6
ответ дан 4 December 2019 в 06:03
поделиться

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

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

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

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

8
ответ дан 4 December 2019 в 06:03
поделиться

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

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

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

3
ответ дан 4 December 2019 в 06:03
поделиться

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

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

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

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

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

13
ответ дан 4 December 2019 в 06:03
поделиться

Использование инструкций SSE является одним из таких случаев. Некоторые среды выполнения .NET будут использовать некоторые инструкции SSE, в зависимости от вашего кода. Но в VC ++ вы можете использовать встроенные функции SSE напрямую. Так что, если вы пишете мультимедийный код, вы, вероятно, захотите C ++. (C ++ / CLI может также работать, предположительно)

0
ответ дан 4 December 2019 в 06:03
поделиться

The Main difference is:

  • C++ is a core language with which you can build stand-alone programs. These Programs communicate directly with the the operating system and nothing else. C++ compilers exist for more or less all platforms (operating systems).

  • C# is a language that conforms to the CLS. A program written in C# can not start without a CLI engine (.NET Framework, Mono, etc.). A Program written in C# communicates with the .NET framework AND with the operating system. You have a man in the middle. Like all servicing personal, this man can help but it will cause additional trouble. If you want to port, you have a different man in the middle etc. CLI Implementations do not exist for all platforms.

By my opinion every additional framework is a additional source of problems.

0
ответ дан 4 December 2019 в 06:03
поделиться

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

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

1
ответ дан 4 December 2019 в 06:03
поделиться

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

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

1
ответ дан 4 December 2019 в 06:03
поделиться

Например, имеет смысл использовать C ++, если переводить заголовочные файлы для существующих библиотек сложнее, чем для отказаться от существующих управляемых библиотек.

0
ответ дан 4 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: