web-dev-qa-db-fra.com

Que sont C ++ / CX et C ++ / CLI, et comment sont-ils liés à C ++ et WinRT?

J'envisageais de relever le défi d'apprendre le C++ pour concevoir des applications Metro et c'est à ce moment que j'ai rencontré C++/CX.

Les applications Metro peuvent-elles être codées en C++ 11? Ont-ils besoin de C++/CX pour fonctionner? Et qu'est-ce que C++/CX exactement? Est-il possible de créer une application Metro en utilisant uniquement C++, ou est-ce que C++/CX est requis? En outre, comment C++/CLI est-il lié à cette image?

32
Ein Doofus

Microsoft fabriquait simplement un système C++ qui vous permettait d'accéder à son API Windows (appelée win32), puis un jour, ils ont inventé .NET et ont pensé que tout devait changer.

Ils ont donc créé des "extensions gérées pour C++" qui étaient essentiellement du C++ mais avec une charge d'extensions non standard, en ajoutant des mots clés comme __gc pour prendre en charge les fonctionnalités .NET (comme l'allocation sur le tas GC plutôt que natif)

Mais les gens n'aimaient pas cela car il n'était pas vraiment; t C++, ayant tous ces mots clés supplémentaires, donc Microsoft l'a repensé et l'a appelé C++/CLI, qui avait un ensemble beaucoup plus petit de mots clés supplémentaires mais a introduit des changements de syntaxe comme le ^ (qui est un "pointeur" de référence vers un objet .NET sur le tas GC).

Quelques années plus tard, Microsoft a réalisé que .NET n'était pas la solution miracle qu'ils l'avaient dit, et ils ont également fusionné leurs équipes Windows et Developer. Une partie de cette réévaluation a conduit à la création d'une toute nouvelle API Windows, appelée WinRT, qui est entièrement en code natif et cela signifiait que les anciennes extensions n'étaient plus utiles, alors Microsoft a développé leurs extensions C++ pour en faire une qui rendait le travail avec le nouveau API WinRT plus facile - en conservant quelques extensions de C++/CLI (comme le ^).

Donc - voilà, 3 versions différentes d'un C++ étendu qui est superficiellement C++. Au moins, la dernière version est à nouveau du code natif, vous n'avez donc pas besoin d'utiliser les extensions si vous ne le souhaitez pas car vous pouvez accéder directement à l'API (elle s'appelle WRL et ressemble beaucoup aux anciennes classes de modèles ATL)

Si vous pensez que vous codez du code multiplateforme, vous ne le voudrez pas - vous pouvez modifier les appels d'API, mais vous ne pouvez pas utiliser le ^ sur tout compilateur autre que Visual C++. Je recommanderais d'utiliser l'API WRL et de garder votre code aussi standard que possible étant donné que le `` code supplémentaire '' que vous auriez besoin d'écrire par rapport à C++/CX n'est pas si bon.

29
gbjbaanb

Citation http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx :

. . . Alors que C++/CX est syntaxiquement similaire à C++/CLI et semble donc presque le même à bien des égards, il est sémantiquement très différent. Le code C++/CX est un code natif, aucun CLR n'est requis. La programmation en C++/CLI peut être très difficile, car il faut jongler habilement avec deux modèles d'objets très différents en même temps: le modèle d'objet C++ avec ses durées de vie déterministes et le modèle d'objet CLI récupéré. C++/CX est beaucoup plus simple à utiliser, car Windows Runtime, qui est basé sur COM, correspond très bien au langage de programmation C++.

Windows Runtime définit une interface binaire d'application (ABI) relativement simple et de bas niveau, et oblige les composants à définir leurs types à l'aide d'un format de métadonnées commun. C++/CX n'est pas strictement requis pour écrire un composant Windows Runtime natif: il est tout à fait possible d'écrire des composants Windows Runtime à l'aide de C++ sans utiliser les extensions de langage C++/CX, et Visual C++ 2012 comprend une bibliothèque, la bibliothèque de modèles Windows Runtime C++ ( WRL), pour vous faciliter la tâche. De nombreux composants Windows Runtime fournis avec Windows (dans l'espace de noms Windows) sont écrits à l'aide de WRL. Il n'y a pas de magie dans C++/CX: cela rend l'écriture des composants Windows Runtime en C++ beaucoup, beaucoup plus simple et aide à réduire la quantité de code répétitif et verbeux que vous auriez à écrire lors de l'utilisation d'une solution basée sur une bibliothèque comme WRL.

11
Matt