2009-12-11 3 views
9

Есть ли какое-либо важное преимущество управляемого C++/CLI над C#. Определенно не синтаксис, я полагаю, как следующий код в C++/CLI реально некрасиво,C++/CLI: Преимущества по сравнению с C#

C++/CLI код:

[Out]List<SomeObject^>^% someVariable 

Сравнить выше C# Код:

out List<SomeObject> someVariable 

Просто из любопытство, есть еще более уродливый синтаксис в C++/CLI по сравнению с вышеизложенным.

ответ

13

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

Хотя это является можно писать полноценные приложения исключительно в C++/CLI, и это даже дает некоторый язык возможности, которые недоступны в чистом C++ (например, сбор мусора), я сомневаюсь, что есть много людей, которые были бы на самом деле сделай это. Если вы уже отходите от чистого C++ и не имеете цели взаимодействовать с .Net, возможно, есть более естественный выбор (например, D или Scala, например - в зависимости от того, в каком направлении вы хотите войти).

Аналогичным образом, переход от чистого C# к C++/CLI может привести к преимуществам шаблонов C++, но редко бывает, что эта необходимость приведет вас к этому шагу.

+1

Я могу добавить, чтобы поддержать это. В предыдущем проекте мне пришлось написать интерфейс между веб-сервисом CMS asmx и промежуточным программным обеспечением IBM, в котором была только библиотека C++ api (а не dll, но статическая библиотека). C++/CLI был единственным выбором для создания этого моста. – softveda

+1

Реализация D .Net находится в работе. Возможно, в ближайшем будущем D может взаимодействовать с .Net. – dsimcha

+0

@dsimcha - это было бы очень круто – philsquared

2

Преимущество управляемого C++ заключается в том, что легко перемещать управляемый и неуправляемый код. Но если все (или почти все) вашего кода будут управляться, то C# обязательно следует использовать (и вы все равно можете использовать invoking unmanaged code from C#, используя DllImport attribute).

12

Простое взаимодействие с собственным кодом на C++ является единственным преимуществом.

Является ли это основным преимуществом, является субъективным.

Если вы не хотите общаться с существующим исходным кодом на C++, вам, вероятно, намного лучше с C#.

+0

Хороший ответ. Но это не очень субъективно - это главное преимущество, если (и только если) у вас нет выбора, кроме как иметь дело с существующим собственным кодом. – OregonGhost

+3

Это все еще субъективно. Если вам нужно использовать существующую DLL, вы можете выбрать взаимодействие с существующим кодом с помощью C# и использование P/Invoke. Независимо от того, является ли это «основным» преимуществом или «второстепенным» преимуществом для вас, чтобы упростить взаимодействие с «основным» преимуществом или «второстепенным» преимуществом, чтобы C# полностью соответствовал человеку, задающему вопрос. – 2009-12-11 09:45:21

+2

P/Invoke с существующими библиотеками C++ близок к невозможности ... – Milan

3

Использование C++/CLI оно очень легко взаимодействовать с родной C++ код

0

просто обратиться к C++ \ CLI, когда у вас есть, если вы можете встретить вас требование с помощью C#, зачем идти с ++ \ кли

0

Как правило, я думаю, что основное преимущество C++/CLI - это просто знакомство с разработчиками на C++. Если вы не приехали с фона C++, переходите к C#.

+0

Я думаю, что это не так. Я исхожу из фона C++ (смешанного с Java и Delphi), а C# так просто понять. Нет необходимости в C++/CLI только для ознакомления. Мне посчастливилось уйти от синтаксиса C++ :) – OregonGhost

+0

Интересно, прошло какое-то время с тех пор, как я сделал C++, но предположил, что синтаксис C++/CLI будет более знаком, чем C#, но я думаю, что нет! –

6

я могу думать о 3-х основных причин для использования C++/CLI:

  1. У вас уже есть большой проект C++ и хотите использовать .NET в нем (хотите ли вы перенести его полностью в будущем или not)
  2. Вы хотите использовать библиотеку, написанную на C или C++. Для простых библиотек вы можете использовать C#/PInvoke, но, например, если библиотека имеет сложную систему типов, вам может быть лучше создавать обертки C++/CLI вместо воссоздания системы типов в C#
  3. Части вашего проекта лучше всего написаны на C++. Например. если вы выполняете распознавание речи или обработку изображений, C++ может быть просто лучше подходит для задачи.
+0

Не могли бы вы рассказать о точке 3 в отношении распознавания речи или обработки изображений? – Lopper

+0

Обработка изображений в C++ => http://www.boost.org/doc/libs/1_41_0/libs/gil/doc/index.html – Oliver

0

неуправляемые приложения на C++ не нуждаются в фреймворке для запуска, C# будет работать только на машинах с dotnet framework 1, 2, 3 или 4. это удивительно, сколько машин все еще работает без этих фреймворков.

1

Будучи главным программистом на C#, я обнаружил, что мне нужно немного использовать C++/CLI. Однако, как язык взаимодействия, FAR перевешивает C# для работы с собственным кодом. В C++/CLI IDE в Visual Studio не хватает многих функций в стиле C#.

В целом, он имеет свое место и будет оставаться жизнеспособным до тех пор, пока существует собственный код. Я бы не захотел создавать приложения WinForm с нуля с помощью C++/CLI IDE, если мне это не нужно.

5

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

Стеклянные семантики настолько лучше, чем все, что C# может предложить для управления IDisposable. C++/CLI имеет один единообразный синтаксис для правильного управления переменными, которые являются IDisposable, и те, которые не являются как локальными переменными, так и полями-членами. Сравнение:

ref class MyClass 
{ 
    FileStream fs; 
} 

против

class MyClass : IDisposable 
{ 
    FileStream fs; 

    void IDisposable.Dispose() { Dispose(true); } 
    ~MyClass() { Dispose(false); } 

    public virtual void Dispose(bool disposing) { if (disposing) fs.Dispose(); } 
} 

Теперь, какой язык смотрит некрасиво?

Тогда есть шаблоны, interior_ptr, #define, родной экспорт DLL, указатель на член и, возможно, несколько других вещей, которые я забыл.

+0

Согласен, кроме #define. С моей точки зрения, его огромное и безразличное использование во многих проектах - это PITA. – Alex

2

CLI/C++ имеет много преимуществ перед C#.

  1. STD библиотека
  2. Native C++/C не может быть просмотрена дизассемблером (как отражатель), потому что они не являются на самом деле CLI (нет необходимости запутывать (хотя хороший хакер может уже получить от этого)).
  3. Mingling C/C++ проекты как обертка для использования с .Net-языками. C++/CLI - это не язык, а просто добавляет поддержку .Net с C/C++.
  4. Некоторые бит управления памятью с помощью указателя C/C++, указывающего на объекты C/C++ в куче.

Ненавижу к тому, чтобы доверять GC, чтобы добраться до объекта, застрявшего в гене 2. Господь знает, когда это будет выпущено из управляемой кучи.

Смежные вопросы