79 votes

Comment décider si je dois utiliser ATL, MFC, Win32 ou CLR pour un nouveau projet C++ ?

Je viens de commencer mon premier projet C++. J'utilise Visual Studio 2008 . Il s'agit d'une application Windows à forme unique qui accède à quelques bases de données et lance une transaction WebSphere MQ. Je comprends en gros les différences entre ATL, MFC, Win32 (je suis un peu perdu sur ce point en fait) et CLR, mais je ne sais pas comment choisir.

Est-ce qu'un ou plusieurs d'entre eux ne sont là que pour la rétrocompatibilité ?

Est-ce que CLR une mauvaise idée ?

Toute suggestion est la bienvenue.

Editar: J'ai choisi le C++ pour ce projet pour des raisons que je n'ai pas détaillées dans l'article et qui ne sont pas entièrement techniques. Donc, en supposant que C++ est la seule/meilleure option, laquelle dois-je choisir ?

73voto

Reed Copsey Points 315315

Cela dépend de vos besoins.

L'utilisation du CLR vous fournira l'ensemble de bibliothèques le plus expressif (l'ensemble du cadre .NET), au prix d'une restriction de votre exécutable qui nécessitera l'installation du cadre .NET au moment de l'exécution, ainsi qu'une limitation à la plate-forme Windows (cependant, les 4 technologies listées sont toutes sous Windows uniquement, la limitation de la plate-forme est donc probablement la moins gênante).

Cependant, le CLR exige que vous utilisiez les extensions C++/CLI du langage C++, ce qui signifie que vous devrez apprendre des fonctionnalités supplémentaires du langage pour pouvoir l'utiliser. En procédant ainsi, vous obtenez de nombreux "extras", tels que l'accès aux bibliothèques .net, un ramassage complet des déchets, etc.

ATL et MFC sont un peu plus difficiles à départager. Je vous renvoie à La page de MSDN pour choisir afin de les départager. L'avantage d'ATL/MFC est qu'il n'est pas nécessaire d'installer le framework .NET, mais seulement les runtimes VC/MFC pour le déploiement.

L'utilisation directe de Win32 permet d'obtenir les plus petits exécutables, avec le moins de dépendances possible, mais elle demande plus de travail d'écriture. Vous avez le moins de bibliothèques d'aide, vous devez donc écrire une plus grande partie du code.

28voto

arke Points 971

Win32 est le moyen brut, à nu, de le faire. C'est fastidieux, difficile à utiliser et il y a beaucoup de petits détails dont vous devez vous souvenir, sinon les choses échoueront de manière relativement mystérieuse.

MFC s'appuie sur Win32 pour vous fournir une manière orientée objet de construire votre application. Il ne s'agit pas d'un remplacement de Win32, mais plutôt d'une amélioration - il fait une grande partie du travail difficile pour vous.

System.Windows.Forms (qui est ce que je suppose que vous vouliez dire par CLR) est complètement différent mais a de grandes similarités avec MFC depuis sa structure de base. C'est de loin le plus facile à utiliser mais il nécessite le framework .NET, ce qui peut ou non être un obstacle dans votre cas.

Ma recommandation : Si vous devez éviter .NET, alors utilisez MFC, sinon utilisez .NET (en fait, dans ce cas, j'utiliserais C# car il est beaucoup plus facile de travailler avec).

1 votes

Ce commentaire est-il toujours d'actualité ?

1 votes

Pour Visual Studio 2008, probablement - mais cela date d'une dizaine d'années maintenant. De nos jours, pour Windows, il est préférable d'utiliser WPF.

15voto

Rob Points 22239

En ce qui concerne le C++, j'utiliserais WTL. Il est léger et vous aurez peu de dépendances (voire aucune), ce qui le rend facile à expédier et à installer. Je suis très satisfait lorsque mon application consiste en un seul EXE qui fonctionne sur la plupart des versions de Windows, mais ce n'est peut-être pas un problème pour vous.

Si vous optez plutôt pour .NET, C# est presque certainement la solution à retenir.

Plus d'informations dans WTL ici :

http://www.codeproject.com/KB/wtl/wtl4mfc1.aspx

2 votes

Utiliseriez-vous encore WTL ? Il n'y a pas encore de commits pour 2016. Source : SVN

1 votes

@JanusTroelsen Je le ferais ! Dernière version le 18 mars 2020 - version 10.1077 ! sourceforge.net/projets/wtl/files/WTL%2010/WTL%2010.0.10077

8voto

Clyde Points 3881

Je serais très curieux de savoir pourquoi vous faites cela en C++. D'après votre brève description, le C# semble être un choix beaucoup plus approprié.

Pour approfondir un peu, regardez le lien que vous avez donné et qui décrit le CLR C++. La réponse la mieux notée indique (avec précision, à mon avis) que C++ est approprié pour "les applications de noyau, de jeux, de haute performance et de serveur" - ce qui ne semble pas décrire ce que vous faites.

MFC, ATL, etc. seront supportés dans le sens où, oui, vous pourrez compiler vos applications sur les futures versions de Visual Studio et les exécuter sur les futures versions de Windows. Mais ils ne sont pas pris en charge dans le sens où il n'y a pas beaucoup de nouveaux développements dans l'API ou le langage, comme c'est le cas pour le CLR et C#.

0 votes

Bonne question. Il fait partie d'un projet plus vaste qui comprend d'autres éléments qui doivent être en C++ pour des raisons d'héritage et de fournisseur. Cette partie n'est pas tienen pour être en C++ mais comme il y a d'autres parties qui le font, et comme cette partie est relativement petite, j'avais prévu de tout faire dans le même langage.

0 votes

C++/CLI (/clr) peut être très proche de C#, si vous aimez travailler en C#, mais souhaitez/doit utiliser C++. La principale différence réside dans quelques éléments mineurs de syntaxe, et dans le fait d'essayer d'éviter d'utiliser le C++ standard au lieu des appels CLI. Il n'y a vraiment aucune raison de l'éviter.

0 votes

Et ce n'est pas nécessairement une mauvaise façon de penser. Cependant, je pense toujours que votre meilleure chance est d'opter pour C# et d'intégrer P/Invoke dans vos bibliothèques existantes. Si vous étiez déjà un gourou du MFC, et qu'il ne s'agissait que d'un petit ajout à votre projet, alors oui, il serait probablement judicieux de continuer en C++. Mais même dans ce cas, cela pourrait être une bonne occasion de s'entraîner avec le framework .NET.

4voto

Patrick Points 3893

Il n'y a pas de problème avec le CLR. Comme d'autres ici, je suggérerais C#, mais comme vous avez des raisons de rester sur C++, l'utilisation du cadre .NET est plusieurs milliers de fois plus facile que de s'embêter avec ATL/MFC si vous n'êtes pas déjà familier avec eux (IMO).

Il est peut-être utile de mentionner que si vous utilisez C++/CLR, vous n'utilisez pas vraiment C++. C++/CLR se compile en CIL tout comme C#. Je ne l'ai jamais utilisé moi-même, mais je crois que son but est de vous permettre de compiler du code hérité et de le rendre facilement disponible pour le nouveau code .NET plutôt que de permettre au nouveau code de fonctionner avec les anciens exécutables C++. Il existe d'autres méthodes d'appel du code natif à partir de .NET que vous devriez peut-être explorer.

0 votes

Si je dois utiliser la bibliothèque .NET, je préfère écrire en C#.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X