¿Es posible usar C ++ con .NET Framework?

18

He leído muchos comentarios sobre programación de GUI, tanto en C # como en C ++. Y noté que el marco .NET de Microsoft es poderoso para la programación GUI. Entonces, ¿es posible usar C ++ y .NET framework?

Creo que será una gran combinación ya que C ++ es un lenguaje poderoso, y .NET framework es el preferido para la programación GUI en Windows, como he leído. ¿Es posible escribir la GUI en C # y la funcionalidad en C ++?

ddacot
fuente
77
C # también es un lenguaje muy poderoso.
Adam Crossland
2
@Ramhound: No es cierto en absoluto que C ++ / CLI sea tan poderoso como C #. El código C ++ / CLI contiene todas las optimizaciones del compilador de C ++ y puede ejecutarse más rápido, y aún contiene muchas técnicas de metaprogramación y preprocesador que no están en C #.
DeadMG
2
Además, no debería ser ningún desafío elegir C # si uno es bueno en C ++. No digo pero digo.
Plataforma
44
Dado que conoce C ++, podría elegir entre aprender C ++ / CLI o C #. Tampoco lo es C ++ real. Sugeriría aprender C # en lugar de intentar trabajar con C ++ / CLI; C ++ / CLI no es un idioma nativo en ninguna parte, por lo que encontrará muchos libros y soporte para C #.
David Thornley
66
@ddacot no, C ++ no está diseñado para el desarrollo de juegos en absoluto. Está destinado al desarrollo de software, al igual que todos los demás lenguajes de programación. Los juegos resultan ser un tipo de software.
MattDavey

Respuestas:

21

Sí, anteriormente se conocía como Managed C ++ y ahora C ++ / CLI . Tiene acceso a la totalidad de .NET Framework (GUI: WinForms, GDI +, etc.) como lo haría desde los otros tres lenguajes administrados agrupados, C #, F # y VB.NET.

Jesse C. Slicer
fuente
+1 A la respuesta de Jesse. Si no me equivoco, C ++ / CLI no admite herencia múltiple. Entonces, prepárate para algunas características inesperadas. Algunas de estas características provienen de limitaciones de la CLI. Le recomiendo que trate de encontrar la diferencia entre C ++ / CLI y C ++ 'clásico' antes de comenzar a usarlo.
Igor Soloydenko
Esto se menciona con cierto detalle en el primer enlace. El resumen es así: "C ++ ha evolucionado mucho con el tiempo y la mayoría del software escrito en el lenguaje está orientado a objetos. C ++ administrado y el uso de clases y objetos basados ​​en clases sigue siendo frecuente como en Visual C ++. El único cambio importante a esto en C ++ administrado es que las capacidades de herencia múltiple no son compatibles. Esto se debe a una limitación del CLR. Una clase administrada bajo el recolector de basura del CLR no puede heredar más de una clase ".
Jesse C. Slicer
Está bien. En realidad, no soy bueno en C ++. Solo pensé que puede haber otras diferencias importantes que pueden causar problemas.
Igor Soloydenko
La última vez que escribí algo de C ++ fue literalmente en algún momento del siglo pasado :)
Jesse C. Slicer
1
@keykeeper, un uso típico de C ++ / CLI es ser un puente delgado entre una biblioteca de C ++ no administrada y el mundo administrado. Es suficiente para tal uso. Por supuesto, no tiene sentido codificar algo considerable.
SK-logic
6

No se olvide de la opción más flexible y simple, típica del mundo Unix pero, por alguna razón, no es tan común en Windows: dividir la GUI y la lógica en diferentes procesos, comunicarse a través de cualquier forma razonable de RPC (por ejemplo, incluso una tubería debería trabajo). Preferiblemente con un protocolo de texto simple, legible por humanos.

De esta manera, puede implementar su GUI (o varias GUI) con cualquier tecnología que desee, y construir componentes lógicos a partir de lo que mejor se adapte a sus necesidades: C ++, scripts, cualquier otra cosa.

No conozco ninguna ventaja razonable de un enfoque de diseño monolítico del mundo de Windows.

SK-logic
fuente
4

Lo hice una vez hace unos años, en los días de Managed C ++. Teníamos algo de lógica de negocios en una DLL administrada que queríamos incorporar a una GUI de estilo asistente escrita en C #. Para hacer esto, creé un ensamblado Managed C ++ para ubicarlo entre la aplicación GUI administrada y la DLL no administrada y usé System :: Runtime :: InteropServices :: Marshal dentro de ese ensamblaje para convertir valores de tipos administrados (System :: Int32) a no administrados tipos (int) y viceversa.

Si bien Managed C ++ parece estar en desuso, el mismo principal podría aplicarse a C ++ / CLI.

Raymond Saltrelli
fuente
3

Realmente no. Existe un lenguaje híbrido C ++ / CLI, pero solo es bueno para la interoperación (política oficial de Microsoft). Debido a la forma en que está diseñado .NET Framework, hay muchas semánticas de lenguaje que realmente no se ajustan a la ejecución en el CLR, y C ++ exhibe muchas de ellas.

DeadMG
fuente
77
No estoy de acuerdo con esta declaración. C ++ / CLI es perfectamente adecuado para muchas implementaciones.
Ramhound
3
@Ramhound: los propios Microsoft solo lo recomiendan para la interoperación. Esa es su política oficial.
DeadMG
2
@DeadMG, ¿puede proporcionar una fuente para eso?
sq33G
1
@DeadMG, te equivocas. Hay muchas opciones para ejecutar .NET GUI con una lógica nativa.
SK-logic
2
@DeadMG: a menos que proporciones pruebas de que esa es la política oficial de Microsoft (no lo creo por un minuto), entonces solo estás pasando FUD
Ramhound
3

El ángulo C ++ / CLI ha sido cubierto por muchas respuestas hasta ahora, pero otra forma de hacerlo es usar PInvoke. Esto permite que los programas de C # invoquen funciones contenidas en dlls que se escribieron en C ++. La ventaja de PInvoke es que su dll es totalmente independiente del hecho de que se llamará desde .Net. Esto significa que puede llamar a dll para los que no tiene código fuente, e incluso si le hiciera el código fuente, no tendría que volver a compilarlo usando la opción / clr. Esto significa que puede usar este dll con otros programas de C ++, así como con programas de C #. Existen algunas bibliotecas fantásticas de C / C ++: PInvoke le permite aprovecharlas. A veces, las bibliotecas Win32 proporcionan funciones que simplemente no están disponibles en .Net: PInvoke le permite usarlas.

Una de las partes más difíciles de usar PInvoke es saber cómo convertir la firma no administrada en una firma administrada. Pero hay una hoja de trucos para ayudar con eso.

Phillip Ngan
fuente
Pero cuando P / Invoque C ++ directamente, tenga en cuenta la destrucción, o mejor proporcione un envoltorio C delgado en el medio.
SK-logic
0

También puede trabajar con un eneldo C # a través de COM (Modelo de objetos componentes). Para mí, COM era mejor que usar Managed C ++ ya que Visual Studio 2010 no tiene intellisense para Managed C ++. En mi caso, ya tenemos una gran aplicación C ++, pero queríamos tratar de alejarnos de MFC a WinForms o WPF.

Travis
fuente