2009-06-20 6 views
21

Je travaille sur un projet C++ que je n'ai pas l'intention de développer ou de déployer à l'aide de bibliothèques ou d'outils .NET, ce qui signifie qu'il me semble logique de le créer en utilisant un Visual Application Studio Win32 Console. Cependant, j'ai entendu dire que les capacités de débogage lors de l'utilisation d'une application CLR sous Visual Studio sont beaucoup plus puissantes. J'ai donc quelques questions:Application Win32 Console vs application CLR Console

  1. Est-il vrai que d'avoir une application CLR par rapport à une application Win32 ajoute des fonctionnalités à votre processus de développement, même si vous n'utilisez des bibliothèques .NET ou d'autres ressources? Si oui, serais-je encore capable de développer/compiler le projet en tant que projet CLR pour en tirer parti, même si je développerais un projet C++ pur en utilisant STL, etc. Fonctionnalité .NET? Ou un tel projet nécessiterait-il des différences fondamentales qui le rendraient non-trivial pour revenir en arrière, ce qui signifie que je devrais m'en tenir à une application de console Win32?

Répondre

25

réponse Bottom line, si vous n'êtes jamais l'intention d'utiliser le CLR ou des objets .Net dans votre application, il suffit d'utiliser une bibliothèque normale Win32 C++. Faire quoi que ce soit d'autre vous fera mal sur la route. Maintenant, pour répondre à la question initiale sur le débogage, oui déboguer avec le CLR présente certains avantages par rapport au débogage d'une application C++ normale. À partir de Visual Studio 2005, C# et VB.Net ont commencé à mettre l'accent sur l'affichage des variables dans la fenêtre locale/autos/watch beaucoup plus précieux. Cela a été principalement fait par l'introduction d'attributs .Net tels que DebuggerDisplay, DebuggerTypeProxy et le framework de visualiseur. Si vous n'utilisez aucun type de réseau .Net, vous n'obtiendrez aucun de ces avantages.

L'évaluateur d'expression C++ n'en tire aucun avantage. Il a ses propres méthodes de personnalisation de l'affichage de type. Mais ce n'est pas aussi caractéristique (ou potentiellement dangereux) que le style d'attribut, car il ne permet pas au code de s'exécuter dans le processus Debugee. Cela ne veut pas dire que le débogage C++ offre une expérience médiocre. Il est simplement différent et il existe de meilleurs affichages pour de nombreux types de conteneurs STL.

Le débogage d'une application CLR présente également certains inconvénients. Par exemple, le débogage du code optimisé est presque impossible à certains moments parce que le JITer va cacher les variables locales, les paramètres et souvent "ceci". Le débogage d'une application C++ construite de la même manière peut également être frustrant, mais vous pouvez toujours saisir les registres et dissemblablement pour voir ce qui se passe. Faire la même chose pour une application CLR est difficile au mieux.

+0

Un grand merci pour votre réponse détaillée! Je me demandais si vous pouviez élaborer un peu sur votre première déclaration et expliquer quels types de problèmes une telle installation pourrait faire face à long terme? Est-ce que cela viendrait le plus souvent d'utiliser par inadvertance des objets/fonctionnalités .NET, de les compiler correctement, et de devoir ensuite modifier ces parties de votre code profondément intégrées dans l'application plus tard? – bsofman

+0

@bsofman, essentiellement oui. Afin de profiter à la fois du CLR et du déploiement sans le CLR, vous aurez besoin de 2 configurations de construction (une pour chaque). Les différences entre les langues apparaîtraient dans les erreurs de construction dans une config mais pas dans l'autre et finiront par être plutôt ennuyeuses. – JaredPar

2

Je pense que la compilation de code C++ natif dans CLR ouvre une boîte de Pandas entière. Sauf si vous avez un gros investissement sur le code C++ existant et une certaine nécessité d'exécuter le code avec des types gérés, c'est quelque chose que vous voulez éviter. Par exemple, C++/CLI est un moyen de regrouper le code C++ natif dans un assemblage CLR, mais C++/CLI ajoute une syntaxe non standard au langage C++, et l'utilisation de types C++ natifs mélangés avec des types gérés semble très question délicate pour le moins. Donc, en conclusion, je voudrais juste le garder comme une application native. Si vous envisagez de le porter sur CLR et que vous venez de commencer à travailler sur ce projet, je penserais sérieusement à commencer à écrire dans un langage natif de CLR comme C#.

+0

C++ CLI est effrayant! – toto

1

Cette réponse copiée d'ici - http://social.msdn.microsoft.com/Forums/vstudio/en-US/895ecb47-8b34-4a1a-a20b-fda1e5e576eb/whats-the-difference-between-clr-console-application-and-win32-console-application

Quelle est la différence entre l'application de la console CLR et de l'application de la console win32? - Le premier utilise Common Language Runtime (en d'autres termes, framework .NET); ce dernier ne le fait pas.

et je ne peux pas utiliser l'espace de noms Système sous le modèle d'application console win32. - L'espace de noms système fait partie du framework .NET.

Que dois-je faire lorsque je souhaite utiliser l'espace de noms? - Vous devez écrire une application .NET.

et n'a-t-il pas d'indice d'entrée comme dans le modèle C#? - Il n'y a en effet pas d'IntelliSense pour C++/CLI dans les versions existantes de Visual Studio. Si vous voulez une application .NET, C# pourrait être un meilleur choix de langue.

Questions connexes