1 / 23

C++/CLI Code hybride : Comment re-utiliser du code existant avec le Framework .NET ?

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

yale
Télécharger la présentation

C++/CLI Code hybride : Comment re-utiliser du code existant avec le Framework .NET ?

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++/CLI Code hybride : Comment re-utiliser du code existant avec le Framework .NET ? Eric Mittelette Eric Vernié

  2. NON, LE C++ N’EST PAS MORT !!!!!

  3. 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

  4. 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

  5. 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++

  6. 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

  7. 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

  8. 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;

  9. C++/CLI : Eléments Syntaxiques * est à ^ ce que & est à %

  10. 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

  11. 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.

  12. 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 { /* … */ };

  13. 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 } };

  14. 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

  15. 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(); }};

  16. 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…

  17. 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

  18. 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.

  19. 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

  20. 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#!

  21. Démonstrations • Création d’une ref class simple • De MFC à .NET • IJW • Des Windows forms dans les MFC • Etude : WPF dans les MFC

  22. Questions

  23. 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

More Related