Подтвердить что ты не робот

С++/CLI: зачем мне его использовать?

Я хорошо знаком с С++, поэтому я рассмотрел возможность изучения .NET и всех его производных (особенно С#).

По пути я столкнулся с С++/CLI, и я хочу знать, есть ли какое-то конкретное использование для этого языка? Предполагается ли это быть промежуточным языком для преобразования из С++ в С#?

Еще один вопрос, который возник у меня в голове, - почему в .NET Framework все еще так много языков программирования? (VB, С++/CLI, С#...)

4b9b3361

Ответ 1

Да, С++/CLI имеет очень специфическое целевое использование, язык (и его компилятор, более всего) позволяет очень легко писать код, который должен взаимодействовать с неуправляемым кодом. Он имеет встроенную поддержку для маршалинга между управляемыми и неуправляемыми типами. Раньше это называлось IJW (It Just Works), которое в настоящее время называется С++ Interop. Другие языки должны использовать маршаллер P/Invoke, который может быть неэффективным и имеет ограниченные возможности по сравнению с тем, что может сделать С++/CLI.

Если вам нужно взаимодействовать с родными С++, классами, которые имеют функции экземпляра и нуждаются в новых и удаленных ключевых словах для создания/уничтожения экземпляра класса, тогда у вас нет выбора, кроме использования С++/CLI. Pinvoke не может этого сделать, только компилятор С++ знает, сколько памяти выделяется и как правильно thunk указатель this для функции экземпляра.

.NET framework содержит код, написанный на С++/CLI, особенно в System.Data и WPF PresentationCore. Если у вас нет неуправляемых потребностей взаимодействия или нет необходимости работать с базой кода устаревшего кода, есть несколько причин для выбора С++/CLI. С# или VB.NET - лучший выбор. Набор функций С++/CLI был заморожен около 2005 года, он не поддерживает более свежие дополнения, такие как синтаксис lambdas или Linq. Кроме того, IDE не поддерживает многие звонки и свистки, доступные в С# и VB.NET IDE. Примечательно, что VS2010 первоначально будет поставляться без поддержки IntelliSense для С++/CLI. Там немного поцелуя смерти.

UPDATE: обновлено в VS2012, поддержка IntelliSense вернулась. Не в последнюю очередь благодаря С++/CX, языковому расширению, упрощающему запись приложений WinRT на С++. Его синтаксис очень похож на С++/CLI. Шаблоны проектов Windows Forms были удалены, однако разработчик все еще работает. Новый механизм отладки в VS2012 не поддерживает С++/CLI, вы должны включить параметр "Управляемая совместимость" в "Инструменты + Параметры", "Отладка", "Общие".

Ответ 2

Первый С# не является "производным".NET..NET не является языком, это платформа приложений и библиотека классов на основе CLR, для которых существует несколько языков.

Тем не менее, наиболее убедительной причиной использования .NET является то, что это хорошо разработанная библиотека классов и гораздо более простой способ для Windows, чем Win32 или MFC. Однако я лично решил, что лучше освоить новый язык, а не изучать расширения до старого, а потому, что С# был разработан с нуля для работы с .NET, я предлагаю, что это язык выбора для .NET.

С++/CLI полезен, вы хотите использовать .NET с некоторым устаревшим кодом, и я использовал его для создания графических интерфейсов Windows Forms и склеивания их с существующим кодом приложения. Его другой raison d'etre состоит в том, что он является единственным языком .NET, который поддерживает смешанный управляемый и собственный код в одном загрузочном модуле, поэтому он хорош как для производительности, так и для повторного использования устаревшего кода.

Что касается количества языков, Microsoft хочет, чтобы каждое приложение Windows основывалось на .NET, потому что оно лучше для безопасности и стабильности их ОС. Единственный способ, который может произойти, - поддерживать несколько языков. Подумайте о .NET как платформе приложений или API OS, а затем вопрос имеет меньшее значение; для .NET будет много языков по той же причине, что и для любой платформы. Этими причинами являются многие, в том числе коммерческое преимущество, применение, политика, поддержка существующих разработчиков, выбор и, несомненно, больше.

Ответ 3

Microsoft немного изменила свою позицию по этому вопросу. Первоначально он был предназначен как полноценный язык, по сути, что-то, что они хотели, чтобы все родные разработчики переместились, отказавшись от родного С++ как можно больше.

Затем несколько лет назад они поняли, что это просто не то, чего хотят их клиенты. Разработчики, которые переходят на .NET в любом случае, обычно переходят на такой язык, как С#, а остальные имеют причины сохранять свой код в родном мире, поэтому они остаются с С++.

Итак, теперь Microsoft намеревается, чтобы С++/CLI был "мостом" между собственным кодом на С++ и управляемым кодом, написанным на некотором языке .NET. Это уже не язык, на котором они рекомендуют переключать всю свою кодовую базу.

Ответ 4

Он действительно в основном предназначен как промежуточный язык для простого связывания кода .net с собственным неуправляемым С++. Сделайте себе одолжение, не используйте его, если вам это не нужно. Синтаксис С++/CLI - беспорядок.

Относительно вашего второго вопроса... Я думаю, что сегодня С# является доминирующим языком в .net, но не всем нравится его стиль и парадигмы..net упрощает добавление новых языков (см. F #, целью которого является функциональное программирование).

Ответ 5

Я использовал С++/CLI для создания .NET API для некоторых неуправляемых библиотек С++. Передача и сортировка параметров требует некоторого привыкания (в зависимости от используемых типов), но как только вы его повесили, это действительно хороший способ преодолеть разрыв между управляемым и неуправляемым миром.

Ответ 6

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

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Ответ 7

для меня, я должен использовать его, когда нет другого способа повторного использования класса С++

Ответ 8

Просто, чтобы вы знали. Если вы не укажете, что код компилируется как неуправляемый, при компиляции с поддержкой CLR он будет скомпилирован как управляемый код.

В то время как CLI С++ хорош. Я нахожу, что мне больно вводить код. В этом есть что-то, что заставляет меня не хотеть программировать. Это даже не "^". Это похоже на сломанный .net. Я потратил 40 минут на кодирование чего-то полностью управляемого в нем, что заняло у меня 10 минут на С#. Я имею в виду, иногда я просто сдаюсь и использую С#, потому что это расстраивает меня при кодировании. Я имею в виду, если вы собираетесь использовать .net, вы также можете использовать С# (над CLI С++).