2012-01-26 18 views
14

He trabajado extensamente con C#, sin embargo, estoy comenzando un proyecto en el que nuestro cliente desea que todo el código se escriba en C++ en lugar de C#. Este proyecto será una combinación entre managed (.NET 4.0) y C++ nativo. Siendo que siempre he preferido C# a C++ para mis necesidades de .NET, me pregunto si hay alguna diferencia importante que pueda no tener en cuenta entre el uso de C# y el C++ administrado.Managed C++ (C++/CLI) vs C#/VB.NET

Cualquier apreciación de esto es muy apreciada.

EDIT Al mirar Wikipedia para el código de C++ administrado se muestra que la nueva especificación es C++/CLI, y que "C++ administrado" está en desuso. Actualizado el título para reflejar esto.

+0

... Estoy al tanto de esto. Estoy más buscando cosas como rarezas o extras que el uso de C++/CLI pueda tener para .NET Framework en lugar de utilizar C# y VB.NET. Como ejemplo, hay algunas pequeñas diferencias entre C# y VB.NET aunque ambos usan el CLR. –

+2

La única buena razón para administrar C++ es la interoperabilidad. Y el hecho de que puede tener 'thunks' nativos (por velocidad, que puede ser mucho más rápido que el código administrado, ejemplo de encriptación). IMO usando el modo puro C++/CLI es inútil. – leppie

Respuesta

9

C++/CLI es un lenguaje .NET completo, y al igual que otros lenguajes .NET funciona muy bien en un contexto administrado. Del mismo modo que trabajar con llamadas nativas en C# puede ser un doloroso entrelazado C++ nativo y C++ administrado puede ocasionar algunos problemas. Dicho esto, si trabajas con mucho código C++ nativo, preferiría usar C++/CLI sobre C#. Hay bastantes errores que la mayoría podrían cubrirse al no escribir C++/CLI como si estuvieras escribiendo C# ni escribirlo como si estuvieras escribiendo C++ nativo. Es lo suyo.

He trabajado en varios proyectos de C++/CLI y el enfoque que tomaría realmente depende de la exposición de diferentes niveles de la aplicación al código nativo de C++. Si la mayoría del núcleo de la aplicación es nativa y el punto de integración entre el código nativo y el código administrado es un poco confuso, entonces usaría C++/CLI en todo momento. El beneficio del control en C++/CLI superará sus problemas. Si tiene puntos de interacción claros que podrían adaptarse o abstraerse, le sugiero encarecidamente la creación de una capa puente C++/CLI con C# arriba y C++ debajo. La razón principal de esto es que las herramientas para C# son más maduras y más ubicuas que las herramientas correspondientes para C++/CLI. Dicho esto, el proyecto en el que he estado trabajando ha sido exitoso y no fue la pesadilla que el otro señaló.

También me aseguraría de que comprenda por qué el cliente va en esta dirección. Si la idea es que tengan un grupo de desarrolladores de C++ y quieran simplificar el proceso de escribir código administrado, yo postularía al cliente que aprender C# puede ser menos desafiante que aprender C++/CLI.

Si el cliente cree que C++/CLI es más rápido, simplemente es incorrecto ya que todos compilan hasta IL. Sin embargo, si el cliente tiene una gran cantidad de desarrollo de C++ nativo existente o en curso, la ruta actual puede ser la mejor.

+0

Esto podría ser mi ignorancia, pero mi experiencia haciendo llamadas nativas desde C# ha sido agradable, si, de hecho, olvidable porque no tienes que hacer mucho la mayor parte del tiempo. Sí, pasar objetos administrados puede ser una molestia, pero si solo usas tipos y estructuras primitivos, es bastante sencillo. Sigo viendo en este hilo que las llamadas nativas son más fáciles en C++. ¿Puedes iluminarme? – siride

+0

En primer lugar, las llamadas nativas que realiza son a una c api que no tiene ningún concepto de objetos.Utilizar C++ apis desde C# sería casi imposible a medida que se presenta el nombre de manipulación y otros problemas. También en C++ usted tiene control directo sobre el diseño de la estrategia de asignación de asignación de memoria, .... La mayoría de estas cosas se pueden lograr en C# pero sin la amplia gama de funciones para respaldarlas que tiene en C++. – rerun

+0

sí, se olvidó de la manipulación de nombres. Eso es un dolor. La API C es fácil de asegurar, pero nunca tuve que usar una API C++. Ya lo pillo. – siride

3

He hecho un proyecto con C++/CLI y tengo que decir que era una abominación. Básicamente era una aplicación WinForms para administrar empleados, juegos de hockey, intercambios entre equipos, calendarios, etc. ...

Así que puedes imaginar el número de controles administrados que tenía en mis formularios: calendarios/selectores de fecha y hora, combo cajas, cuadrículas, etc.

Lo peor fue usar solo tipos C++ para mi back-end, y usar los tipos administrados para el front-end. En primer lugar, no puede asignar una cadena estándar a una cadena administrada. Necesitarás convertir todo. Obviamente tendrá que convertirlo de nuevo ...

Cada vez que necesitaba llenar una grilla, serialicé mis colecciones C++ a algo así como un vector<std::string>, lo recupere en mi biblioteca de IU y luego lo bifurqué y lo hice nuevo DataGridRow para agregarlos a la grilla. Lo que obviamente se puede hacer en 3 minutos con C# y algunos Linq a SQL.

Terminé con A + para esa aplicación, pero seamos honestos absolutamente apestado. No puedo imaginar lo patética que fue la aplicación de los demás para mí.

Creo que hubiera sido más fácil si hubiera usado List<Customer>^ (Lista administrada de algún objeto) en mi C++ en lugar de convertir siempre todo entre vectores de cadenas. Pero necesitaba mantener el C++ limpio de cosas administradas.

/pissedof

+0

La forma en que visualizo este proyecto avanzando, C++ administrado se usará para la mayoría del proyecto, sin embargo, podría convertirse fácilmente en el escenario de front-end/back-end exacto que acaba de describir –

+0

. Hablo en serio. Fue absolutamente horrible. No puedo imaginar usar/vender esta aplicación o algo así. – Dave

2

Desde el uso de las tres áreas (.NET, C++/CLI y C++), puedo decir que en todos los sentidos Yo prefiero usar .NET (a través de C# o VB.NET). Para las aplicaciones puede usar WinForms o WPF (el último de los cuales me parece mucho mejor, especialmente para aplicaciones que se ven mucho más fáciles de usar).

Un problema importante con C++/CLI es que no tiene todas las características agradables del lenguaje que obtiene en .NET. Por ejemplo, la palabra clave yield en C# y el uso de lambda (no creo que sea compatible con C++/CLI - no me detengo en eso).

Sin embargo, hay una gran ventaja de C++/CLI. Es decir que puede crear un puente para permitir que C# y C++ se comuniquen. Actualmente estoy trabajando en un proyecto en el que muchos cálculos matemáticos y algoritmos ya se han escrito (durante muchos años) en C++, pero la compañía quiere pasar a una interfaz de usuario basada en .NET. Después de investigar en varias soluciones, llegué a la conclusión de que C++/CLI era mucho mejor para esto. Un beneficio es que me permitió construir una API que, para un desarrollador .NET, se veía y funcionaba como un tipo .NET.

Para desarrollar la interfaz de una aplicación, sin embargo, realmente no recomendaría C++/CLI. Desde el punto de vista de la usabilidad (en términos de tiempo de desarrollo cuando se usa) simplemente no vale la pena.Un gran problema es que VS2010 dropped support for IntelliSense for C++/CLI para "mejorar IntelliSense general" (creo específicamente para C++). Si aún no lo ha probado, definitivamente le aconsejo que consulte las aplicaciones de WPF.

+0

Sí, ningún soporte de C++/CLI para IntelliSense en 2010 es un problema que conozco. Sin embargo, IntelliSense no es un requisito, lo que apesta porque confío en él diariamente como parte de mi flujo de trabajo. –

+0

Y el uso de WPF "no es factible" porque, como se señala en otro comentario, se le solicitará al cliente que lo aprenda. Pero ¿por qué no podría simplemente utilizar el Diseñador para crear una interfaz rápida como si estuviera usando C# o VB.NET? ¿Está roto para C++/CLI o algo así? –

+0

@BasedAsFunk El diseñador de WinForms parece ser el mismo que si se utiliza en un proyecto .NET, por lo que no veo que exista un problema al usarlo para crear un prototipo de interfaz. –