230 likes | 422 Views
C++/CLI Code hybride : Comment re-utiliser du code existant avec le Framework .NET ?. Eric Mittelette Eric Vernié. NON, LE C++ N’EST PAS MORT !!!!!. Agenda. Visual Studio 2005 et le C++ Introduction : Pourquoi le C++/CLI ? C++/CLI : Eléments Syntaxiques
E N D
C++/CLI Code hybride : Comment re-utiliser du code existant avec le Framework .NET ? Eric Mittelette Eric Vernié
Agenda • 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
Visual Studio 2005 et C++ • ISO C++ (98% de la norme) • Syntaxe C++ qui cible du code natif • C++/CLI • Syntaxe C++ qui cible le Framework .NET
Introduction : Pourquoi le C++/CLI ? • 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++
C++/CLI : Eléments Syntaxiques • 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
C++/CLI : Eléments Syntaxiques • 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 » class N { /*…*/ }; // nativeref class R { /*…*/ }; // CLR reference typevalue class V { /*…*/ }; // CLR value typeinterface class I { /*…*/ }; // CLR interface typeenum class E { /*…*/ }; // CLR enumeration type ref class A abstract { }; // abstractref class B sealed : A { }; // no further derivationref class C : B { }; // error, B is sealed
C++/CLI : Eléments Syntaxiques • 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;
C++/CLI : Eléments Syntaxiques * est à ^ ce que & est à %
C++/CLI : Eléments Syntaxiques • 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 Notation simplifiée ref class R {public:propertyint Size; // compiler-generated}; // get, set, and backing store
C++/CLI : Eléments Syntaxiques • Delegate et évènement delegatevoid D(int); ref class R {public:event D^ e;// trivial event;// compiler-generatedmembers void f() { e(42); } // invokeit};R^ r = gcnewR();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 évènements.
C++/CLI : Eléments Syntaxiques • 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<typename T>where T : IFooref class GR { /* … */ };
C++/CLI : Eléments Syntaxiques • CLR arrays • Notation [] non supportée en C++/CLI array<int>^ a1 = gcnew array<int>(10); array<int>^ a2 = gcnew array<int> { 1, 2, 3 }; array<int>^ a3 = { 1, 2, 3 }; array<int>^ a4 = gcnew array<int>(10) { 1, 2 }; F(gcnew array<Component> { button1, button2 }); array<int, 2> a5 = gcnew array<int>(10, 20); array<int, 2> a6 = { { 1, 2, 3 }, { 4, 5, 6 } };
C++/CLI: Garbage collection et destruction déterministe ? • Chaque objet .Net est sous contrôle du « GarbageCollector » • La mécanique du « garbagecollector » est un pré requis essentiel à tous développeurs C++/CLI • Génération, Collection, Compactage, • Pattern IDispose et Finalisation • HeapManaged • > 3 privateheap + 1 privateheap pour les « Large Object » • Elément syntaxique • ~MaClasse et !MaClasse
C++/CLI: Garbage collection et destruction déterministe ? • 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 : Code hybride ou comment mixer les codes natifs et managés • 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…
C++/CLI :Code hybride ou comment mixer les codes natifs et managés • 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
C++/CLI : Code hybride ou comment mixer les codes natifs et managés • 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.
C++/CLI : Code hybride ou comment mixer les codes natifs et managés • La boite à outils du développeur hybride • vcclr.h : gcroot<>, auto_gcroot<> • AfxWindowsForms.h (MAKE_DELEGATE, • /CLR • System::Runtime::Interopservices • pin_ptr<>, interior_ptr<> • tblimp, tlbexp • dllimportattributes • Les APIs de hosting • #pragmaunmanaged
Conclusion : C++/CLI « first class langage for .NET » • 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#!
Démonstrations • Création d’une ref class simple • De MFC à .NET • IJW • Des Windows forms dans les MFC • Etude : WPF dans les MFC
Ressources • Retrouvez nos vidéos sur le site MSDN (FR) • http://www.microsoft.com/france/msdn/visualc/default.mspx • Site MSDN US • http://msdn2.microsoft.com/en-us/visualc/default.aspx