NON, LE C++ N’EST PAS MORT !!!!!
Visual Studio 2005 et le C++ Introduction : Pourquoi le C++/CLI ? C++/CLI : Eléments Syntaxiques C++/CLI : Garbage collection et destruction déterministe ? C++/CLI : Code hybride ou comment mixer les codes natifs et managés Conclusion : C++/CLI « first class langage for.NET » Le future
1998 Visual C ATL3/MFC42 (6.0) 2002 Visual Studio.NET Visual C Unified Visual Studio IDE & Debugger MFC7/ATL7, attributed programming, ATL Server Whole Program Optimization C++ Managed Extensions Fixed STL concurrency and DLL issues /GS Runtime Security Check 2003 Visual Studio 2003 Visual C ISO Standard C++ Conformance /Arch:SSE/SSE2 – floating point code generation Windows Forms Designer for Managed Extensions 2005 Visual Studio 2005 Visual C C++/CLI Language Integrated 64-bit Compiler and Tools Profile Guided Optimization Safe Extension for CRT Project Property Manager, Source Navigation/Browsing MFC/Windows Forms Integration
ISO C++ (98% de la norme) Syntaxe C++ qui cible du code natif C++/CLI Syntaxe C++ qui cible le Framework.NET
Ré utiliser les compétences « fines/pointues » des développeurs C++ On ne va pas ré écrire des millions de lignes de code pour une nouvelle plateforme :.NET « We love your C++ Code » Syntaxe déposée à l’ECMA et ISO Travail initié en 2002 avec les MC++ (Managed Extension for C++) Intégration de C++/CLI avec ISO-C++ « LE » language de l’interopérabilité Utiliser le Framework.NET de façon naturelle en C++
Une option de compilation « primordiale » /CLR : émettre du code MSIL Support de la syntaxe CLI « activée » Option pour le projet ou pour un fichier individuellement Différentes sous option à /CLR /CLR : Pure /CLR : Safe
Notion d’ “adjective class” Types C++ et CLR cohérents Attention : pas d ’héritage multiple de « ref class » Attention : implémentation multiple d’ « interface class » ref class A abstract { };// abstract ref class B sealed : A { };// no further derivation ref class C : B { };// error, B is sealed class N { /*…*/ };// native ref class R { /*…*/ };// CLR reference type value class V { /*…*/ };// CLR value type interface class I { /*…*/ };// CLR interface type enum class E { /*…*/ };// CLR enumeration type
Pointers et Handles Sur le tas natif Comme d’hab pointeurs (*) stables indépendant du GC Comme d’hab, attention aux fuites mémoire si pas de delete Sur le tas managé Handles (^) sont des références d’ objets Pas d’opérations arithmétiques dessus (cf. interior_ptr) delete devient optionnel Sur la pile (vraiment ?) Permet des destructions déterministes TNatif* t1 = new TNatif; TNet^ t2 = gcnew TNet; T t3;
* est à ^ ce que & est à %
Propriété ref class R { int mySize; public: property int Size { int get() { return mySize; } void set(int val) { mySize = val; } } }; R r; r.Size = 42; // use like a field ref class R { int mySize; public: property int Size { int get() { return mySize; } void set(int val) { mySize = val; } } }; R r; r.Size = 42; // use like a field ref class R { public: property int Size; // compiler-generated }; // get, set, and backing store Notation simplifiée
Delegate et évènement delegate void D(int); ref class R { public: event D^ e; // trivial event; // compiler-generated members void f() { e(42); }// invoke it }; R^ r = gcnew R(); r->e += gcnew D(this, &SomeMethod); r->e += gcnew D(SomeFreeFunction); r->f(); delegate void D(int); ref class R { public: event D^ e; // trivial event; // compiler-generated members void f() { e(42); }// invoke it }; R^ r = gcnew R(); r->e += gcnew D(this, &SomeMethod); r->e += gcnew D(SomeFreeFunction); r->f(); Vous pouvez écrire, ajouter, enlever et déclencher vous même les. Vous pouvez écrire, ajouter, enlever et déclencher vous même les évènements.
Generic Syntaxe des Generics ~comme celle des templates Admettent des contraintes et l’héritage Instancié à l’exécution Template Disponible pour le C++/CLI Généré au moment de la compilation Les generics et les templates peuvent se combiner… Attention casse tête chinois et rigueur demandée ! generic where T : IFoo ref class GR { /* … */ };
CLR arrays Notation [] non supportée en C++/CLI array ^ a1 = gcnew array (10); array ^ a2 = gcnew array { 1, 2, 3 }; array ^ a3 = { 1, 2, 3 }; array ^ a4 = gcnew array (10) { 1, 2 }; F(gcnew array { button1, button2 }); array a5 = gcnew array (10, 20); array a6 = { { 1, 2, 3 }, { 4, 5, 6 } };
Chaque objet.Net est sous contrôle du « Garbage Collector » La mécanique du « garbage collector » est un pré requis essentiel à tous développeurs C++/CLI Génération, Collection, Compactage, Pattern IDispose et Finalisation Heap Managed > 3 private heap + 1 private heap pour les « Large Object » Elément syntaxique ~MaClasse et !MaClasse
Une classe qui implémente un Finalizer doit avoir un destructeur Evitons la duplication de code : appelons le finalizer dans le destructeur ref class R { /* MORE CODE */ !R() { /* Clean-up value type resources */ } ~R() { /* Do early clean-up, clean-up ref classes */ this->!R(); } };
C++/CLI : le roi de l’interopérabilité COM Interop PInvoke Pour tous les languages.NET C++ Interop It Just Works ! Tous les scenarii possible…et imaginable Hosting de la CLR Contrôle fin de l’exécution du code.NET Par exemple dans votre code MFC…
Ré utiliser votre existant Migration code VC6 Breaking changes (conformité à la norme ISO98) Un seul environnement de développement (VS2005) Compilateur 64 bits, Optimisation du code (WPO PGO), support de l’OpenMP …. Et bien plus encore Utilisation des.lib ou dll depuis VS2005 Et inversement ! Gestion du code mixte Passer des données, des pointeurs de fonctions, faire des appels « croisés » entre le monde managé et le monde natif
Scenarii de code hybride Apps VC6 utilisent vos.lib VS2005 Apps VS2005 utilise vos.lib VC6 Code Hybride (mixed code) Utiliser une classe native dans du code CLI Utiliser une classe CLI dans du code natif Utiliser de l’assembleur dans du code CLI Utiliser la BCL dans du code natif Utiliser les « Windows Forms » dans les MFC.NETmodule et.Obj + cl.exe ! Hosting de la CLR.
La boite à outils du développeur hybride vcclr.h : gcroot<>, auto_gcroot<> AfxWindowsForms.h (MAKE_DELEGATE, /CLRSystem::Runtime::Interopservices pin_ptr<>, interior_ptr<> tblimp, tlbexp dllimport attributes Les APIs de hosting #pragma unmanaged
Productivité du développeur accru par la BCL Confort du développeur via l’IDE VS2005 Performance au rendez vous-même dans le code managé pur et le code mixte Ecrire moins de code en C++/CLI qu’en C#!
Création d’une ref class simple De MFC à.NET IJW Des Windows forms dans les MFC Etude : WPF dans les MFC
Retrouvez nos vidéos sur le site MSDN (FR) fault.mspx fault.mspx Site MSDN US us/visualc/default.aspx