Est-il possible d'utiliser C ++ avec le framework .NET?

18

J'ai lu de nombreux commentaires sur la programmation GUI, en C # et C ++. Et j'ai remarqué que le framework .NET de Microsoft est puissant pour la programmation GUI. Est-il donc possible d'utiliser le framework C ++ et .NET?

Je pense que ce sera une excellente combinaison car C ++ est un langage puissant, et le framework .NET est préféré pour la programmation GUI sous Windows, comme je l'ai lu. Est-il possible d'écrire l'interface graphique en C # et la fonctionnalité en C ++?

ddacot
la source
7
C # est également un langage très puissant.
Adam Crossland
2
@Ramhound: Ce n'est pas vrai du tout que C ++ / CLI soit aussi puissant que C #. Le code C ++ / CLI contient toutes les optimisations du compilateur C ++ et peut s'exécuter plus rapidement, et contient toujours de nombreuses techniques de métaprogrammation et de préprocesseur qui ne sont pas en C #.
DeadMG
2
De plus, il ne devrait pas être difficile de choisir C # si l'on est bon en C ++. Je ne dis pas mais je dis.
Rig
4
Étant donné que vous connaissez le C ++, vous aurez le choix entre l'apprentissage du C ++ / CLI ou du C #. Le C ++ n'est pas non plus réel. Je suggère d'apprendre C # plutôt que d'essayer de travailler avec C ++ / CLI; C ++ / CLI n'est pas une langue native nulle part, vous trouverez donc beaucoup de livres et de support pour C #.
David Thornley
6
@ddacot non, C ++ n'est pas du tout destiné au développement de jeux. Il est destiné au développement de logiciels, comme tous les autres langages de programmation. Les jeux sont simplement un type de logiciel.
MattDavey

Réponses:

21

Oui, il était auparavant appelé Managed C ++ et maintenant C ++ / CLI . Vous avez accès à l'intégralité du .NET Framework (GUI: WinForms, GDI +, etc.) comme vous le feriez à partir des trois autres langages gérés groupés, C #, F # et VB.NET.

Jesse C. Slicer
la source
+1 À la réponse de Jesse. Si je ne me trompe pas, C ++ / CLI ne prend pas en charge l'héritage multiple. Alors, soyez prêt à certaines fonctionnalités inattendues. Certaines de ces fonctionnalités provenaient des limitations de la CLI. Je vous recommande d'essayer de trouver la différence entre C ++ / CLI et C ++ «classique» avant de commencer à l'utiliser.
Igor Soloydenko
Ceci est mentionné en détail dans le premier lien. Le résumé est ainsi: "C ++ a beaucoup évolué au fil du temps et la plupart des logiciels écrits dans le langage sont orientés objet. C ++ géré et l'utilisation de classes et d'objets basés sur les classes reste répandue comme dans Visual C ++. Le seul changement majeur à cela dans Managed C ++ est que les capacités d'héritage multiple ne sont pas prises en charge. Cela est dû à une limitation du CLR. Une classe gérée sous le garbage collector du CLR ne peut pas hériter de plus d'une classe. "
Jesse C. Slicer
C'est bon. En fait, je ne suis pas bon en C ++. Je pensais juste qu'il peut y avoir d'autres différences importantes qui peuvent poser des problèmes.
Igor Soloydenko
La dernière fois que j'ai écrit du C ++, c'était littéralement au cours du siècle dernier :)
Jesse C. Slicer
1
@keykeeper, une utilisation typique de C ++ / CLI est d'être un pont mince entre une bibliothèque C ++ non managée et le monde managé. Il suffit pour une telle utilisation. Bien sûr, cela n'a pas de sens de coder quelque chose d'important.
SK-logic
6

N'oubliez pas l'option la plus flexible et la plus simple, typique du monde Unix mais, pour une raison quelconque, pas si courante dans Windows: diviser l'interface graphique et la logique en différents processus, communiquer via toute forme raisonnable de RPC (par exemple, même un tube devrait travail). De préférence avec un protocole de texte simple et lisible par l'homme.

De cette façon, vous pouvez implémenter votre interface graphique (ou diverses interfaces graphiques) avec toutes les technologies que vous préférez, et créer des composants logiques à partir de tout ce qui convient le mieux - C ++, des scripts, etc.

Je ne connais aucun avantage raisonnable d'une approche de conception monolithique du monde Windows.

SK-logic
la source
4

Je l'ai fait il y a quelques années, à l'époque du Managed C ++. Nous avions une logique métier dans une DLL gérée que nous voulions intégrer dans une interface graphique de type assistant écrite en C #. Pour ce faire, j'ai créé un assembly C ++ managé à placer entre l'application GUI managée et la DLL non managée et utilisé System :: Runtime :: InteropServices :: Marshal au sein de cet assembly pour convertir les valeurs des types gérés (System :: Int32) en non managés types (int) et vice versa.

Bien que C ++ géré semble être obsolète, le même principal peut s'appliquer à C ++ / CLI.

Raymond Saltrelli
la source
3

Pas vraiment. Il existe un langage hybride C ++ / CLI, mais il n'est bon que pour l'interopérabilité (politique officielle de Microsoft). En raison de la façon dont le framework .NET est conçu, il existe de nombreuses sémantiques de langage qui ne correspondent vraiment pas à l'exécution sur le CLR, et C ++ en présente un grand nombre.

DeadMG
la source
7
Je ne suis pas d'accord avec cette affirmation. C ++ / CLI est parfaitement adapté à de nombreuses implémentations.
Ramhound
3
@Ramhound: Microsoft lui-même ne le recommande que pour l'interopérabilité. C'est leur politique officielle.
DeadMG
2
@DeadMG pouvez-vous fournir une source pour cela?
sq33G
1
@DeadMG, vous vous trompez. Il y a tellement d'options pour exécuter l'interface graphique .NET avec une logique native.
SK-logic
2
@DeadMG - À moins que vous ne fournissiez la preuve que c'est la politique officielle de Microsoft (je ne le crois pas une minute), alors vous venez de contourner le FUD
Ramhound
3

L'angle C ++ / CLI a été couvert par de nombreuses réponses jusqu'à présent, mais une autre façon de le faire est d'utiliser PInvoke. Cela permet aux programmes C # d'appeler des fonctions contenues dans des DLL écrites en C ++. L'avantage de PInvoke est que votre dll est totalement agnostique quant au fait qu'elle sera appelée depuis .Net. Cela signifie que vous pouvez appeler des DLL pour lesquelles vous n'avez pas de code source, et même si vous l'avez fait, vous n'auriez pas à le recompiler en utilisant l'option / clr. Cela signifie que vous pouvez utiliser cette DLL avec d'autres programmes C ++, ainsi que des programmes C #. Il existe de fantastiques bibliothèques C / C ++: PInvoke vous permet d'en profiter. Parfois, les bibliothèques Win32 fournissent des fonctions qui ne sont tout simplement pas disponibles dans .Net: PInvoke vous permet de les utiliser.

L'une des parties les plus délicates de l'utilisation de PInvoke est de savoir comment convertir la signature non managée en une signature gérée. Mais il y a un cheatsheet pour vous aider.

Phillip Ngan
la source
Mais lorsque P / Invocation C ++ directement, soyez conscient de la mutilation, ou mieux fournissez un wrapper C mince entre les deux.
SK-logic
0

Vous pouvez également travailler avec une aneth C # via COM (Component Object Model). Pour moi, COM était mieux que d'utiliser Managed C ++, car Visual Studio 2010 n'a pas Intellisense pour Managed C ++. Dans mon cas, nous avons déjà une grande application C ++, mais nous voulions essayer de passer de MFC à WinForms ou WPF.

Travis
la source