tour de france c++ 2005 eric mittelette : [email protected] eric vernié : [email protected]...
TRANSCRIPT
Tour de France C++ 2005Tour de France C++ 2005
http://www.microsoft.com/france/visualc/http://www.microsoft.com/france/visualc/
Eric Mittelette : Eric Mittelette : [email protected]@microsoft.com
Eric Vernié : Eric Vernié : [email protected]@microsoft.com
Relation Technique DéveloppeursRelation Technique Développeurs
HP Partenaire Mondial de HP Partenaire Mondial de MicrosoftMicrosoft
Intégrateur des technologies Microsoft :Intégrateur des technologies Microsoft :Plus de 10M de postes Windows 2000/XP déployés Plus de 10M de postes Windows 2000/XP déployés
Plus de 13M de postes MS Exchange 2000/2003 déployésPlus de 13M de postes MS Exchange 2000/2003 déployés
Services de support MicrosoftServices de support Microsoft
Développement conjoint de solutions verticales :Développement conjoint de solutions verticales :HP OpenBank – BanqueHP OpenBank – Banque
HP CBI.NET – Industrie HP CBI.NET – Industrie
HP ISM.NET – TelecomHP ISM.NET – Telecom
Centre d’expertise et de benchmarks dédiés MicrosoftCentre d’expertise et de benchmarks dédiés Microsoft
Un portfolio de solutions pour une infrastructure Un portfolio de solutions pour une infrastructure Microsoft étendueMicrosoft étendue
Serveurs 32 et 64 bitsServeurs 32 et 64 bits
Stockage NAS, SANStockage NAS, SAN
Postes de travail…Postes de travail… Windows Mobile Phone EditionWindows XP Edition Tablette PC
AgendaAgendaIntroduction : État de l’art du C++Introduction : État de l’art du C++
C++ NatifC++ NatifCompilateurCompilateur
BibliothèquesBibliothèques
C++ et le monde .NETC++ et le monde .NETRappel sur la CLRRappel sur la CLR
Extension Managed C++Extension Managed C++
C++ / CLIC++ / CLI
Évolution du Visual C++Évolution du Visual C++19981998 Visual C++ 6.0Visual C++ 6.0 ATL3/MFC42 (6.0)ATL3/MFC42 (6.0)
20022002 Visual Studio .NETVisual Studio .NET
Visual C++ 7.0Visual C++ 7.0
Unified Visual Studio IDE & DebuggerUnified Visual Studio IDE & Debugger
MFC7/ATL7, attributed programming, ATL ServerMFC7/ATL7, attributed programming, ATL Server
Whole Program OptimizationWhole Program Optimization
C++ Managed ExtensionsC++ Managed Extensions
Fixed STL concurrency and DLL issuesFixed STL concurrency and DLL issues
/GS Runtime Security Check/GS Runtime Security Check
20032003 Visual Studio 2003Visual Studio 2003
Visual C++ 7.1Visual C++ 7.1
ISO Standard C++ Conformance ISO Standard C++ Conformance
/Arch:SSE/SSE2 – floating point code generation/Arch:SSE/SSE2 – floating point code generation
Windows Forms Designer for Managed ExtensionsWindows Forms Designer for Managed Extensions
20052005 Visual Studio 2005Visual Studio 2005
Visual C++ 8.0Visual C++ 8.0
C++/CLI LanguageC++/CLI Language
Integrated 64-bit Compiler and ToolsIntegrated 64-bit Compiler and Tools
Profile Guided OptimizationProfile Guided Optimization
Safe Extension for CRTSafe Extension for CRT
Project Property Manager, Source Navigation/BrowsingProject Property Manager, Source Navigation/Browsing
MFC/Windows Forms IntegrationMFC/Windows Forms Integration
État de l’art du C++État de l’art du C++Non le C++ n’est pas mort Non le C++ n’est pas mort Très proche de la Norme ISO 98 (98%)Très proche de la Norme ISO 98 (98%)Évolutions Évolutions
Support du standard ISO 98Support du standard ISO 98PerformancePerformanceSécuritéSécuritéS’ouvrir au monde .NETS’ouvrir au monde .NET
« First class tool and language »« First class tool and language »Plusieurs voies pour le futurePlusieurs voies pour le future
Code Natif (SDKs MFC ATL STL…)Code Natif (SDKs MFC ATL STL…)Code Managed (Extensions et CLI)Code Managed (Extensions et CLI)DDKs : reste l’outil indispensable pour les driversDDKs : reste l’outil indispensable pour les driversEmbedded : code natif pour CEEmbedded : code natif pour CELonghorn : nouveau jeux APIs dans WinFX …longue vie au C++ !Longhorn : nouveau jeux APIs dans WinFX …longue vie au C++ !Jeux et DirectX : performances et framework au rendez vous (XNA)Jeux et DirectX : performances et framework au rendez vous (XNA)
Compilateur C++ et norme Compilateur C++ et norme ISOISODepuis le début Microsoft fait évoluer son compilateurDepuis le début Microsoft fait évoluer son compilateur
Norme 1998, presque atteinte, aujourd’hui:Norme 1998, presque atteinte, aujourd’hui:98% de la norme98% de la norme
Support des STL renforcéSupport des STL renforcé
Points non conforment à la norme Points non conforment à la norme
Portage de codePortage de codeBreaking changes (impact de la norme ANSI)Breaking changes (impact de la norme ANSI)
Spécialisation explicite (plus de redéfinition)Spécialisation explicite (plus de redéfinition)Opérateur new lève désormais des Exceptions Opérateur new lève désormais des Exceptions ( std::nothrow pour revenir comme avant)( std::nothrow pour revenir comme avant)Chaînes littéral (const char[n])Chaînes littéral (const char[n])Surcharge des Template de fonctions changentSurcharge des Template de fonctions changentKoening lookupKoening lookupInitialisation de base à 0Initialisation de base à 0Typename devient obligatoire dans les Template…Typename devient obligatoire dans les Template…Friend a changer de comportement sur les classesFriend a changer de comportement sur les classesPointeurs sur Membres requièrent un & Pointeurs sur Membres requièrent un & Using, implicit const int ont changéUsing, implicit const int ont changéPortée des déclarations de for a changé (Zc)Portée des déclarations de for a changé (Zc)I/O stream changement (#include <iostream>)I/O stream changement (#include <iostream>)……
DémosDémos
Impact de la norme ISO 98Impact de la norme ISO 98Koening lookupKoening lookup
Spécialisation partielle des TemplatesSpécialisation partielle des Templates
Initialisation Initialisation
FriendFriend
Membre et pointeurMembre et pointeur
ScopeScope
……
C++ Natif : PerformancesC++ Natif : PerformancesOptions de compilationOptions de compilation
/Gy : Empaquetage des fonctions/Gy : Empaquetage des fonctions
/G7 : Pentium 4/G7 : Pentium 4
/arch:SSE[2] : (Utilisation des instructions et /arch:SSE[2] : (Utilisation des instructions et registres SSE)registres SSE)
WPO /GL et /LTCG au link (Optimisation du code)WPO /GL et /LTCG au link (Optimisation du code)
PGO (Optimisation par instrumentation du code) PGO (Optimisation par instrumentation du code)
Floating point Model /fpFloating point Model /fp
Intrinsec /Oi Intrinsec /Oi
OpenMP : pragma pour le code multi processeurOpenMP : pragma pour le code multi processeur
PGO en détail…PGO en détail…La création d'une application PGO s'effectue en trois La création d'une application PGO s'effectue en trois grandes phases : grandes phases : Compilation en code instrumenté. Compilation en code instrumenté. Formation du code instrumenté ; Formation du code instrumenté ; Recompilation en code optimisé. Recompilation en code optimisé.
C++ Natif : SécuritéC++ Natif : SécuritéOptions de compilationOptions de compilation
SécuritéSécurité/GS : prévention des débordements de tampon…./GS : prévention des débordements de tampon….
/RTC : aide au débogage du code/RTC : aide au débogage du code
Analyse de codeAnalyse de code/prefast : identifie les leak, débordement de tampon…./prefast : identifie les leak, débordement de tampon….
CRT SécuriséeCRT SécuriséeCRT sécurisé : ~ 400 modificationsCRT sécurisé : ~ 400 modifications
Par exemple : strcpy devient strcpy_sPar exemple : strcpy devient strcpy_s
Fonction « non sure » dépréciées par défautFonction « non sure » dépréciées par défaut#define _CRT_SECURE_NO_DEPRECATE#define _CRT_SECURE_NO_DEPRECATE
STL SécuriséeSTL SécuriséeItérateurs STL détectent les débordements de tamponItérateurs STL détectent les débordements de tampon
Linker...Linker...Options du Linker ajoutées :Options du Linker ajoutées :
/ASSEMBLYDEBUG /ASSEMBLYDEBUG
génère l’attribut Debuggable et désactive les génère l’attribut Debuggable et désactive les optimisations JIT.optimisations JIT.
/ASSEMBLYLINKRESOURCE /ASSEMBLYLINKRESOURCE
Créé un lien vers une ressource dans le fichier de sortieCréé un lien vers une ressource dans le fichier de sortie/DELAYSIGN/DELAYSIGN
Place uniquement la public key dans assembly Place uniquement la public key dans assembly /KEYFILE/KEYFILE
Fichier contenant la clé Fichier contenant la clé /KEYCONTAINER/KEYCONTAINER
Container de la clé Container de la clé /SAFESEH /SAFESEH
Avec /SAFESEH le linker produit uniquement une image si on peut Avec /SAFESEH le linker produit uniquement une image si on peut générer une table des “safe exception handlers”. Cette table générer une table des “safe exception handlers”. Cette table spécifie quels handlers seront utilisés pour l’image.spécifie quels handlers seront utilisés pour l’image.
Compilateur, Linker...Compilateur, Linker...#Import#Import
De nouvelles options pour #import : De nouvelles options pour #import : auto_searchauto_search
Si la librairie importée contient des #import Si la librairie importée contient des #import (importation en cascade). (importation en cascade).
auto_renameauto_rename
Quand le mot clé de la librairie est un mot clé Quand le mot clé de la librairie est un mot clé réservé du C++, __ est ajouté devant le nom. réservé du C++, __ est ajouté devant le nom.
no_search_namespace, rename_search_namespace, tlbidno_search_namespace, rename_search_namespace, tlbid
Gestion plus fine des imports et nom de Gestion plus fine des imports et nom de namespaces. namespaces.
DémosDémos
Options de compilationOptions de compilationSécuritéSécurité
Buffer OverrunBuffer Overrun
Analyse statique de codeAnalyse statique de code
str_safestr_safe
RTC checkRTC check
PerformancesPerformancesWPOWPO
PGOPGO
PausePause
Retour dans 20 minutesRetour dans 20 minutes
Les speakers sont dans l’escalier !Les speakers sont dans l’escalier !
BibliothèquesBibliothèques
Microsoft propose depuis ~20 ans des Microsoft propose depuis ~20 ans des librairies:librairies:
Les MFC évoluent et se maintiennent comme Les MFC évoluent et se maintiennent comme classe librairies générant du code natif classe librairies générant du code natif
version non managée uniquementversion non managée uniquement
ATL, continue son évolution vers STLATL, continue son évolution vers STLApparaît comme Serveur WEB avec ATL ServerApparaît comme Serveur WEB avec ATL Server
MFCMFC
MFC V7.0MFC V7.0
•Crées dés les premières versions de Visual C++Crées dés les premières versions de Visual C++•Objectifs :Objectifs :
•Encapsuler les API Windows dans des Encapsuler les API Windows dans des classes C++classes C++•Propose une architecture Vue/ContrôleurPropose une architecture Vue/Contrôleur
Document <> (n) VuesDocument <> (n) Vues
MFCMFCChangements MFC 7 et 7.1:Changements MFC 7 et 7.1:
Connection mapsConnection maps ne sont plus compactées lors de la ne sont plus compactées lors de la suppression d’un suppression d’un connection pointconnection point . Ainsi le connection point . Ainsi le connection point supprimé est placé à NULL. On doit donc tester NULL quand on supprimé est placé à NULL. On doit donc tester NULL quand on utilise :utilise :
CConnectionPoint::GetConnections CConnectionPoint::GetConnections ConnectionPoint::GetNextConnection. ConnectionPoint::GetNextConnection.
Les fonctions suivantes Les fonctions suivantes lèventlèvent maintenant des exceptions: maintenant des exceptions: CSimpleString::FreeExtraCSimpleString::FreeExtraCSimpleString::GetAtCSimpleString::GetAtCSimpleString::operator []CSimpleString::operator []CSimpleString::ReleaseBufferCSimpleString::ReleaseBufferCSimpleString::ReleaseBufferSetLengthCSimpleString::ReleaseBufferSetLengthCStrBuf::SetLengthCStrBuf::SetLengthCTime::CTime constructors. CTime::CTime constructors.
MFCMFC
CAsyncSocket supporte IPv6-via les membres:CAsyncSocket supporte IPv6-via les membres: GetPeerNameEx, GetSockNameEx, ReceiveFromEx, et GetPeerNameEx, GetSockNameEx, ReceiveFromEx, et SendToEx.SendToEx.
La classe CImage check le nombres d’objets créés. La classe CImage check le nombres d’objets créés. Quand le décompte vaut 0, La fonction GdiplusShutdown est Quand le décompte vaut 0, La fonction GdiplusShutdown est automatiquement appelée pour libérer les ressources GDI+automatiquement appelée pour libérer les ressources GDI+
(« pil poil » pour les objets créés dans une DLL :-)(« pil poil » pour les objets créés dans une DLL :-)
La classe CString a été réécrite sous forme de Template: La classe CString a été réécrite sous forme de Template: CStringTCStringT
On peut donc l’utiliser dans des projets ATL sans un lien “trop On peut donc l’utiliser dans des projets ATL sans un lien “trop lourd” aux MFC. lourd” aux MFC.
MFC / ATL : Partage de MFC / ATL : Partage de classesclasses
Futur des MFCFutur des MFC
Reste « The » bibliothèque native C++ de la Reste « The » bibliothèque native C++ de la plate forme Windowsplate forme Windows
Continue d’évoluer en MFC 8.0 (détails à venir)Continue d’évoluer en MFC 8.0 (détails à venir)
Travail d’optimisation sur l’intégration Travail d’optimisation sur l’intégration MFC/NETMFC/NET
Intégration des contrôles WindowsForm dans les Intégration des contrôles WindowsForm dans les dialogues MFCdialogues MFC
Intégrer aux mécanismes DDX, DDX_ManagedControlIntégrer aux mécanismes DDX, DDX_ManagedControl
Intégration des WindowsForm dans les CViewsIntégration des WindowsForm dans les CViews
Un namespace : Un namespace : Microsoft::VisualC::MFC Microsoft::VisualC::MFC
Futur des MFCFutur des MFC
Win32/MFC Windows hosting AvalonWin32/MFC Windows hosting AvalonXAML as Dialog, Wizards, Task Panes, etc.XAML as Dialog, Wizards, Task Panes, etc.
XAML as MFC ViewsXAML as MFC Views
Visuals for RenderingVisuals for Rendering
Animations and MultimediaAnimations and Multimedia
Avalon Hosting Win32/MFC WindowsAvalon Hosting Win32/MFC WindowsXAML as top level windowXAML as top level window
Win32/MFC Windows as Avalon controlWin32/MFC Windows as Avalon control
Avalon Hosting ActiveX ControlsAvalon Hosting ActiveX Controls
Futur MFC et XAMLFutur MFC et XAML
MFC hosting XAML Page in CControlBar as Task PaneCMDIChild hosting XAML Page as Child WindowXAML Page hosting MFC CView as Element
ATLATLVersion 7.1/8 dans Visual Studio 2003/2005Version 7.1/8 dans Visual Studio 2003/2005
A l’origine pour créer des objets ActiveXA l’origine pour créer des objets ActiveXFaciliter la création d’objet COM par des Templates de code C++Faciliter la création d’objet COM par des Templates de code C++
ATLATLS’ouvre au WEBS’ouvre au WEB
ATL Web ServiceATL Web Service
S’ouvre aux librairies graphiquesS’ouvre aux librairies graphiquesATL Windowing et WTLATL Windowing et WTL
Exploite la programmation par attributsExploite la programmation par attributsExiste depuis l’origine de l’IDL (coclass)Existe depuis l’origine de l’IDL (coclass)
Ajout de nouveaux attributs :Ajout de nouveaux attributs :event_source, event_receiver pour les connection pointsevent_source, event_receiver pour les connection points
[ soap_method ] Pour les services Web[ soap_method ] Pour les services Web
……
Un premier pas vers AOPUn premier pas vers AOPTraitement des Attributs ~ Code produit par TisseursTraitement des Attributs ~ Code produit par Tisseurs
… … A suivre !A suivre !
ATLATLNouveautés des versions 7 et 7.1Nouveautés des versions 7 et 7.1SécuritéSécurité
ATL7 propose des wrappers pour les win32API de ATL7 propose des wrappers pour les win32API de sécurité.sécurité.
FichiersFichiersCAtlFile CAtlTemporaryFile CAtlFileMappingBase/CAtlFileMappingCAtlFile CAtlTemporaryFile CAtlFileMappingBase/CAtlFileMapping
ThreadingThreadingCWorkerThread<Win32ThreadTraits|CRTThreadTraits>:CWorkerThread<Win32ThreadTraits|CRTThreadTraits>:
De nouvelles collectionsDe nouvelles collectionsCAtlArray/CAtlList, CAtlArray/CAtlList, CRBTree/CRBMap CAtlArray/CAtlList, CAtlArray/CAtlList, CRBTree/CRBMap /CRBMultiMap/CRBMultiMap
CStringCStringCStringT version TemplateCStringT version Template
ATLATLVersion 8.0 (VS2005)Version 8.0 (VS2005)
Détails des classes ajoutées et modifiées dans Détails des classes ajoutées et modifiées dans les mois qui viennent (post Beta2)les mois qui viennent (post Beta2)
STLSTLSTL = Ensemble de headers définit par la norme STL = Ensemble de headers définit par la norme
50 headers requis (+2 optionnels)50 headers requis (+2 optionnels)
+ 18 headers du C standard+ 18 headers du C standard
STLSTL
Mise à jour de l’implémentation de la STL: Mise à jour de l’implémentation de la STL: hash_map Class hash_map Class hash_set Class hash_set Class Optional exception handling support. Optional exception handling support. Amélioration code formatting (readability). Amélioration code formatting (readability). Amélioration du support des DLL Amélioration du support des DLL
(passage d’objet entre process). (passage d’objet entre process).
Amélioration du support multithreading. Amélioration du support multithreading. Amélioration de la conformité aux standards. Amélioration de la conformité aux standards.
Using namespace std;Using namespace std;Iostream.h dépréciéeIostream.h dépréciée
STLSTL
Migration depuis VC++ 6.0 Migration depuis VC++ 6.0 Problèmes potentiels: Problèmes potentiels:
Changements des reverse_iteratorChangements des reverse_iterator
Changement des MIN/MAX #defineChangement des MIN/MAX #define
Certains Itérateurs ne sont plus des pointeurs…Certains Itérateurs ne sont plus des pointeurs…
Futur des STLFutur des STL
Version 8.0 (VS2005)Version 8.0 (VS2005)Détails des classes ajoutées et modifiées dans Détails des classes ajoutées et modifiées dans les mois qui viennent (post Beta2)les mois qui viennent (post Beta2)
Apparition des CLI-STLApparition des CLI-STLPermettra a vos codes actuels basés sur STL d’être Permettra a vos codes actuels basés sur STL d’être full managedfull managed
Challenge de performance vs Collections actuelles Challenge de performance vs Collections actuelles du Frameworkdu Framework
A suivre plus tard (Post RTM ?)A suivre plus tard (Post RTM ?)
API Win32 : DPAPIAPI Win32 : DPAPIData Protection API Data Protection API
Renforcée sur 2003, lancé depuis 2000Renforcée sur 2003, lancé depuis 2000Encapsulation C# dispo sur MSDNEncapsulation C# dispo sur MSDNhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/secmod/htmlhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/secmod/html/secmod21.asp/secmod21.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/strsafe.asphttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/strsafe.asp
WTL…WTL…Windows Template LibraryWindows Template Library
Né de l’ATL WindowingNé de l’ATL WindowingUne forme plus légère que les MFCUne forme plus légère que les MFCHybride ATL/MFC/WTL possibleHybride ATL/MFC/WTL possiblePas d’architecture Doc/Vue (mais exemple sur le Web)Pas d’architecture Doc/Vue (mais exemple sur le Web)Pas de support « officiel » de MicrosoftPas de support « officiel » de Microsoft
““You need to know MFC, and know it well enough that you understand You need to know MFC, and know it well enough that you understand what's behind the message map macros, and can edit the code marked "DO what's behind the message map macros, and can edit the code marked "DO NOT EDIT" with no problems. You need to know Win32 API programming, NOT EDIT" with no problems. You need to know Win32 API programming, and know it well” – M Dunn (Code Project)and know it well” – M Dunn (Code Project)
Lien pour le download : version 7.0Lien pour le download : version 7.0http://www.microsoft.com/downloads/details.aspx?familyid=128e26ee-2112-4cf7-b28e-7727dhttp://www.microsoft.com/downloads/details.aspx?familyid=128e26ee-2112-4cf7-b28e-7727d9a1f288&languageid=f49e8428-7071-4979-8a67-3cffcb0c2524&displaylang=en9a1f288&languageid=f49e8428-7071-4979-8a67-3cffcb0c2524&displaylang=en
Lien pour le Wizard 7.1Lien pour le Wizard 7.1http://www.codeproject.com/useritems/wtl_71_wizard.asphttp://www.codeproject.com/useritems/wtl_71_wizard.asp
Pour en savoir plus :Pour en savoir plus :http://groups.yahoo.com/group/wtl/http://groups.yahoo.com/group/wtl/
DémosDémos
BibliothèquesBibliothèquesMFCMFC
STLSTL
WTLWTL
ATL Service Web ATL Service Web qui connaît les services Web ?qui connaît les services Web ?
Un petit rappel ?Un petit rappel ?
C++ et le monde .NETC++ et le monde .NET.NET sur tous nos Systèmes.NET sur tous nos Systèmes
.NET expose une énorme Bibliothèque de .NET expose une énorme Bibliothèque de classesclasses
Plus de 8000 classes extensiblesPlus de 8000 classes extensibles
VS2003 cible le Fx 1.1VS2003 cible le Fx 1.1
VS2005 cible le Fx 2.0 (en 32 et 64 bits)VS2005 cible le Fx 2.0 (en 32 et 64 bits)
Rappel sur la CLRRappel sur la CLR
CLR : Virtual Execution System (VES)CLR : Virtual Execution System (VES)Exécute du code managéExécute du code managé
Fournis une couche entre code Managé et les Fournis une couche entre code Managé et les API natives de l’OSAPI natives de l’OS
Responsable du chargement et de l’exécution Responsable du chargement et de l’exécution des programmes…des programmes…
Fournis un ensemble de services …Fournis un ensemble de services …Garbage CollectorGarbage Collector
SécuritéSécurité
Compilation à la voléeCompilation à la volée
……
C’est quoi .NET par rapport à la CLR ?C’est quoi .NET par rapport à la CLR ?
.NET est la combinaison :.NET est la combinaison :Runtime : CLR (Common Langage Runtime)Runtime : CLR (Common Langage Runtime)
Librairies : Framework Class LibraryLibrairies : Framework Class Library
Permet de connecter des applications via les Permet de connecter des applications via les services Web XMLservices Web XML
The big pictureThe big pictureApplication .NET
Memory
DLL
ManagedCode : Assembly
CLR
UnmanagedCode
Win32
COMCOM+ 1.0
Services•JIT Compilation•Sécurité•Base Classes
Process WIN32 Application .NETApplication .NETManaged MemoryManaged Memory
Managed ExécutionManaged Exécution
Notion d’ AssemblyNotion d’ Assembly
Managed Memory
GC
Heap
Chargement de la CLRChargement de la CLR
Espace d’adressageProcess WIN32
En-tête PEEn-tête PEEn-tête PEEn-tête PE
Section .textSection .textSection .textSection .text
Section .idataSection .idataSection .idataSection .idata
En-tête CLREn-tête CLREn-tête CLREn-tête CLR
ILILILIL
MétadonnéeMétadonnéeMétadonnéeMétadonnée
DLL : DLL : MSCorEE.dllMSCorEE.dllFonction: _CorExemainFonction: _CorExemainDLL : DLL : MSCorEE.dllMSCorEE.dllFonction: _CorExemainFonction: _CorExemain
JMP _CorExeMainJMP _CorExeMainJMP _CorExeMainJMP _CorExeMain
Le thread principalLe thread principaldu processus démarredu processus démarre
Le thread principalLe thread principaldu processus démarredu processus démarre
EXE .NETEXE .NETEXE .NETEXE .NET
MSCorEE.dllMSCorEE.dllMSCorEE.dllMSCorEE.dll
_CorExemain_CorExemain_CorExemain_CorExemain
Void Main (string args[])Void Main (string args[])Void Main (string args[])Void Main (string args[])
CLR : Vue d’ensemble CLR : Vue d’ensemble
Class Loader
IL to NativeCompilers
CodeManager
GarbageCollector
Security Engine Debug Engine
Type Checker Exception Manager
Thread Support COM Marshaler
Base Class Library Support
.NET Framework.NET Framework
System
Globalization
Diagnostics
Configuration
Collections
Resources
Reflection
Net
IO
Threading
Text
ServiceProcess
Security Runtime
InteropServices
Remoting
Serialization
System.Data
Design
ADO
SQLTypes
SQL
System.Xml
XPath
XSLT Serialization
System.WinForms
Design ComponentModel
System.Drawing
Imaging
Drawing2D
Text
Printing
System.Web
Configuration SessionState
Caching Security
Services
Description
Discovery
Protocols
UI
HtmlControls
WebControls
JIT CompilationJIT CompilationEspace d’adressage
ConsoleConsoleConsoleConsole
Code IL
Static void WriteLine(string)
Allocation mémoireAllocation mémoireAllocation mémoireAllocation mémoire
Instructions natives du processus
MOV AX , BXMOV AX , BX……
MOV AX , BXMOV AX , BX……
Compilation du code ILCompilation du code ILCompilation du code ILCompilation du code IL
Espace d’adressageConsoleConsoleConsoleConsole
Code Natif
Static void WriteLine(string)
MOV AX , BXMOV AX , BX……
MOV AX , BXMOV AX , BX……
CompilerCompiler AssemblyAssemblyAssemblyAssembly
DEVELOPMENTDEVELOPMENT
MC++MC++C#C#J#J#VBVB
CobolCobol……
MSILMSILMetadataMetadata
ResourcesResources
public static void Main(String[] args ){ String usr; FileStream f; StreamWriter w; try { usr=Environment.GetEnvironmentVariable("USERNAME"); f=new FileStream(“C:\\test.txt",FileMode.Create); w=new StreamWriter(f); w.WriteLine(usr); w.Close(); } catch (Exception e){ Console.WriteLine("Exception:"+e.ToString()); }}
public static void Main(String[] args ){ String usr; FileStream f; StreamWriter w; try { usr=Environment.GetEnvironmentVariable("USERNAME"); f=new FileStream(“C:\\test.txt",FileMode.Create); w=new StreamWriter(f); w.WriteLine(usr); w.Close(); } catch (Exception e){ Console.WriteLine("Exception:"+e.ToString()); }}
Source codeSource code
ApplicationApplicationDirectoryDirectory
ApplicationApplicationDirectoryDirectory
GlobalGlobalAssemblyAssembly
Cache (GAC)Cache (GAC)
GlobalGlobalAssemblyAssembly
Cache (GAC)Cache (GAC)
DéploiementDéploiement
AssemblyAssemblyAssemblyAssembly
DEVELOPMENTDEVELOPMENT DEPLOYMENTDEPLOYMENT
SetupSetupCopyCopy
BrowserBrowser
Download Download CacheCache
Download Download CacheCache
InstallInstall
Debug EngineDebug Engine
IL to NativeIL to NativeCompilerCompiler
ApplicationApplicationDirectoryDirectory
ApplicationApplicationDirectoryDirectory
SetupSetupCopyCopy
BrowserBrowser
Download Download CacheCache
Download Download CacheCache
GlobalGlobalAssemblyAssembly
Cache (GAC)Cache (GAC)
GlobalGlobalAssemblyAssembly
Cache (GAC)Cache (GAC)
AssemblyAssemblyon Target on Target MachineMachine
AssemblyAssemblyon Target on Target MachineMachine
ExécutionExécution
AssemblyAssemblyAssemblyAssembly
DEVELOPMENTDEVELOPMENT DEPLOYMENTDEPLOYMENT
InstallInstall
EXECUTIONEXECUTION
AssemblyAssemblyLoaderLoaderSecuritySecurityClass Class
LoaderLoader
Native .exe Native .exe + GC table + GC table Native .exe Native .exe + GC table + GC table
Code Code ManagerManager
Garbage CollectionGarbage Collection
Exception ManagerException Manager
Thread SupportThread Support
COM InteropCOM Interop
Policy<?xml version="1.0" encoding="utf-8" ?><configuration> <mscorlib> <security> <policy> <PolicyLevel version="1"> <CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="Nothing" Name="All_Code" Description="Code group grants no permissions and forms the root of the code group tree."> <IMembershipCondition class="AllMembershipCondition" version="1"/> <CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="FullTrust"
DémosDémos
Code MSILCode MSIL
Rotor et le fonctionnement du VESRotor et le fonctionnement du VESDisponible sur le site MSDNDisponible sur le site MSDNhttp://msdn.microsoft.com/msdnmag/issues/02/07/SharedSourceCLI/http://msdn.microsoft.com/msdnmag/issues/02/07/SharedSourceCLI/
VS2003:VS2003:Extension Managed C++Extension Managed C++
Extension managée pour le C++ Extension managée pour le C++ /CLR : émettre de l’IL plutôt que du binaire/CLR : émettre de l’IL plutôt que du binaire
15 nouveaux mot clés15 nouveaux mot clés
Va nous permettre de réutiliser du code Va nous permettre de réutiliser du code CPP existant…CPP existant…
Unique sur la plate forme .NET !Unique sur la plate forme .NET !
Extension Managed C++Extension Managed C++__abstract__abstract Déclaration d'une classe abstraite, qui ne saurait être Déclaration d'une classe abstraite, qui ne saurait être
instanciée directementinstanciée directement
__box__box"Boxing" automatique, comme en C# et VB.NET, c'est-"Boxing" automatique, comme en C# et VB.NET, c'est-
à-dire création d'une copie sur le tas (heap) d'une à-dire création d'une copie sur le tas (heap) d'une classe __value (cf. ci-dessous).classe __value (cf. ci-dessous).
__delegate__delegate Définition d'un type délégué (une sorte de pointeur de Définition d'un type délégué (une sorte de pointeur de méthode)méthode)
__event__event
Même nuance qu'en VB.NET et C# : un événement est Même nuance qu'en VB.NET et C# : un événement est une sorte de __delegate sur lequel les instances une sorte de __delegate sur lequel les instances d'autres classes n'ont qu'un pouvoir d'autres classes n'ont qu'un pouvoir d'abonnement / désabonnement. Ils ne peuvent en d'abonnement / désabonnement. Ils ne peuvent en aucun cas être la source de cet événement, ni en aucun cas être la source de cet événement, ni en écraser la liste des abonnés.écraser la liste des abonnés.
__finally__finally Comble une lacune de C++, qui ne dispose pas de bloc Comble une lacune de C++, qui ne dispose pas de bloc "finally""finally"
__gc__gcC'est le mot clé tant attendu : les instances de classes C'est le mot clé tant attendu : les instances de classes
__gc sont libérées automatiquement de la __gc sont libérées automatiquement de la mémoire par le Garbage Collectormémoire par le Garbage Collector
__identifier__identifierTechnique obscure qui permet d'employer un mot Technique obscure qui permet d'employer un mot
réservé du C++ comme identificateur (de réservé du C++ comme identificateur (de méthode, de variable...)méthode, de variable...)
Extension Managed C++Extension Managed C++
__interface__interface
C++ permet de déclarer des classes, qui ne C++ permet de déclarer des classes, qui ne contiennent éventuellement que des méthodes contiennent éventuellement que des méthodes virtuelles pures. Ce mot clé va un peu plus loin et virtuelles pures. Ce mot clé va un peu plus loin et ajoute la compréhension des interfaces au C++.ajoute la compréhension des interfaces au C++.
__nogc__nogc
Déclaration d'une classe C++ native, dont les Déclaration d'une classe C++ native, dont les instances ne seront pas libérées instances ne seront pas libérées automatiquement par le Garbage Collector. Notez automatiquement par le Garbage Collector. Notez que ce choix est celui par défaut : que ce choix est celui par défaut :
__pin__pin Le "Pinning" est une astuce qui permet d'empêcher le Le "Pinning" est une astuce qui permet d'empêcher le Garbage Collector de libérer un objet __gcGarbage Collector de libérer un objet __gc
__property__propertyDéfinit une propriété sur une classe __gc (qui peut Définit une propriété sur une classe __gc (qui peut
être, comme d'habitude, en lecture seule ou en être, comme d'habitude, en lecture seule ou en lecture-écriture)lecture-écriture)
__sealed__sealedInterdit de sous classer une classe __gc ou de redéfinir Interdit de sous classer une classe __gc ou de redéfinir
une méthode d'une classe __gc. Les développeurs une méthode d'une classe __gc. Les développeurs Java comprendront "static".Java comprendront "static".
__try_cast__try_cast Tentative de cast. Si elle échoue, cette expression Tentative de cast. Si elle échoue, cette expression lance une exception.lance une exception.
__typeof__typeof
Renvoie le type (System::Type) d'un objet donné. C'est Renvoie le type (System::Type) d'un objet donné. C'est un peu ce que l'on appelait RTTI (RunTime Type un peu ce que l'on appelait RTTI (RunTime Type Information) en C++ standard, à ceci près que la Information) en C++ standard, à ceci près que la Réflexion .NET est beaucoup plus riche.Réflexion .NET est beaucoup plus riche.
Classes managéesClasses managées
Classes et InterfacesClasses et Interfaces__gc __gc __nogc (par défaut)__nogc (par défaut)__interface__interface
Remplace les classes Remplace les classes virtuelles abstraites puresvirtuelles abstraites pures
Gestion des PropriétésGestion des Propriétés__property__property
get_XXX et set_XXXget_XXX et set_XXX
Compilation du MC++Compilation du MC++/CLR en option du compilateur/CLR en option du compilateur
Switches incompatibles avecSwitches incompatibles avec /clr/clr/GL/GL - Link Time Code Generation. - Link Time Code Generation. /Zd/Zd - Generate COFF debug information. - Generate COFF debug information. /ZI/ZI - Support "Edit and Continue&1uot; in debug information. - Support "Edit and Continue&1uot; in debug information. /ML - (/MLd)/ML - (/MLd) - Link statically to the CRT (debug). - Link statically to the CRT (debug). /Gm -/Gm - Enable Minimal rebuild. Enable Minimal rebuild. /YX/YX - Automatic use of precompiled headers. - Automatic use of precompiled headers. /RTCc/RTCc - Runtime error check for possible data loss in conversion. - Runtime error check for possible data loss in conversion. /RTCs/RTCs - Stack Frame runtime error checking. - Stack Frame runtime error checking. /RTCu/RTCu - Runtime error check for use of unintialized variable. - Runtime error check for use of unintialized variable. /RTC1/RTC1 - Equivalent to /RTCsu. - Equivalent to /RTCsu.
DémosDémos
B.A.BA du Managed C++B.A.BA du Managed C++
Point-cerclePoint-cercle
Utilisation des classes du Framework.NETUtilisation des classes du Framework.NET
Rappel CLRRappel CLR
Gestion de la mémoire .NetGestion de la mémoire .NetGarbage CollectorGarbage Collector
Managed Heap : Heap privé géré par la CLRManaged Heap : Heap privé géré par la CLR
Basé sur des générationsBasé sur des générationsLes objets survivants a une collecte sont promus dans la Les objets survivants a une collecte sont promus dans la génération suivante (gen0, gen1 et gen2)génération suivante (gen0, gen1 et gen2)
Un Heap pour les « large object » (>80 000 octets)Un Heap pour les « large object » (>80 000 octets)
Destruction vs Finalizer et Dispose patternDestruction vs Finalizer et Dispose pattern
CLR et C++CLR et C++
Destruction des objetsDestruction des objets : :
Rien dans la classeRien dans la classeImpossible de libérer les ressources OS (fichier…) !Impossible de libérer les ressources OS (fichier…) !
La mémoire elle, sera libérée…La mémoire elle, sera libérée…
~MaClasse ~MaClasse Pas un vrai destructeur (MC++) : pas de libération Pas un vrai destructeur (MC++) : pas de libération mémoiremémoire
Appelé si : delete p;Appelé si : delete p;
Appelé a la fin du process !Appelé a la fin du process !
Créé en fait un Finalizer… (évolution CLI/C++ 2005)Créé en fait un Finalizer… (évolution CLI/C++ 2005)
CLR et C++CLR et C++Destruction des objetsDestruction des objets
FinalizerFinalizerCrée automatiquement si un destructeur existeCrée automatiquement si un destructeur existe
Mis dans une queue : FinalizeQueue (Résurrection Mis dans une queue : FinalizeQueue (Résurrection possible)possible)
Impact sur les performances…si beaucoup d’objets…Impact sur les performances…si beaucoup d’objets…
Invoqué par un appel à : Invoqué par un appel à : delete p;delete p;
Collection du GCCollection du GC
Unload d’un appdomainUnload d’un appdomain
Implémenter IDisposeImplémenter IDisposep.Dispose();p.Dispose();
Évite/Complément à la mécanique des FinalizerÉvite/Complément à la mécanique des Finalizer
MC++ et pointeursMC++ et pointeursPointeurs managésPointeurs managés
Déclarer avec __gcDéclarer avec __gc
Pas d’arithmétique de pointeursPas d’arithmétique de pointeurs
DémosDémos
Destructions des objets .NETDestructions des objets .NET
SOSSOS
Interopérabilité Managed/UnmanagedInteropérabilité Managed/Unmanaged
It Just Work (IJW) It Just Work (IJW) Réutilise votre code sans modificationRéutilise votre code sans modification
Mixte au niveau du source:Mixte au niveau du source:pin pointerpin pointer#pragma unmanaged#pragma unmanagedClasses de serviceClasses de service
GC,MarshalGC,Marshal
PInvokePInvokeAppel des API de la plateforme ou de vos librairiesAppel des API de la plateforme ou de vos librairies
COM InteropCOM InteropBâtit sur PInvokeBâtit sur PInvoke
Hosting de la CLRHosting de la CLRLa CLR vu comme un objet COM..La CLR vu comme un objet COM..Utilisation dans des scénarii particuliersUtilisation dans des scénarii particuliers
Interop : It Just Work (IJW)Interop : It Just Work (IJW)
Permet une migration rapide des codes Permet une migration rapide des codes unmanaged vers du managedunmanaged vers du managed
Va générer les fonctions de wrapping automatiquementVa générer les fonctions de wrapping automatiquement
Ré utilisation des codes « as is »Ré utilisation des codes « as is »
/CLR étant établis, possibilité d’ajout de fonctionnalités /CLR étant établis, possibilité d’ajout de fonctionnalités managéesmanagées
Interop : It Just Work (IJW)Interop : It Just Work (IJW) Performance ?Performance ?
Un cas intéressant le portage de Quake II par Un cas intéressant le portage de Quake II par vertigo softwarevertigo software
http://www.vertigosoftware.com/Quake2.htmhttp://www.vertigosoftware.com/Quake2.htmPortage en Managed (it just work)Portage en Managed (it just work)Ajout de code Managed (Radar)Ajout de code Managed (Radar)
DémosDémos
IJW et du code MFCIJW et du code MFC
IJW et Quake IIIJW et Quake II
Interop : __pin PointerInterop : __pin Pointer
Pointeurs __pin :Pointeurs __pin :ManagedClass __pin* ppMC = new ManagedClass();ManagedClass __pin* ppMC = new ManagedClass();
Permet de garantir que le pointeur reste valable même si le Permet de garantir que le pointeur reste valable même si le garbage collector est actifgarbage collector est actif
Fige la zone mémoire : Fige la zone mémoire : impact sur la fragmentation mémoire et les performances…impact sur la fragmentation mémoire et les performances…
’’Unpin’ explicit : Unpin’ explicit : Par simple remise à zéro du pinPointeur Par simple remise à zéro du pinPointeur
ppMC = 0;ppMC = 0;
Implicit également, en sortant du bloc de codeImplicit également, en sortant du bloc de codeY compris en cas d’erreurY compris en cas d’erreur
Interop : __pin Pointer Interop : __pin Pointer Permet des passages Managed/UnManagedPermet des passages Managed/UnManaged
Data membre ou instance d’objet Managed passé Data membre ou instance d’objet Managed passé à du code unmanagedà du code unmanaged
Interop : PragmaInterop : Pragma
#pragma unmanaged#pragma unmanaged
#pragma managed#pragma managedPermet d’avoir simultanément du MSIL et du Permet d’avoir simultanément du MSIL et du binaire dans la même assemblybinaire dans la même assembly
Réutilisation du code C ++ existant par simple Réutilisation du code C ++ existant par simple copier/collercopier/coller
Permet la création de « bridge et wrapper » Permet la création de « bridge et wrapper » entre monde managed et unmanagedentre monde managed et unmanaged
InteropServices::Marshal InteropServices::Marshal classclass
Ensemble de méthodes statiques, utilisées pour le Ensemble de méthodes statiques, utilisées pour le marshalling « custom » et complexe.marshalling « custom » et complexe.
Utilisées dans l’interopérabilité COMUtilisées dans l’interopérabilité COMCas des structures contenant des pointeurs, Cas des pointeurs Cas des structures contenant des pointeurs, Cas des pointeurs de fonctions…de fonctions…
Équivalence des chaînes de caractères :Équivalence des chaînes de caractères :
wtypes.hwtypes.h C++C++ MC++MC++
CHARCHAR charchar CharChar
LPSTRLPSTR char*char* String* [in]String* [in]
LPCSTRLPCSTR const char*const char* String*String*
LPWSTRLPWSTR wchar_t*wchar_t* String* [in]String* [in]
StringBuilder* [in,out]StringBuilder* [in,out]
LPCWSTRLPCWSTR const wchar_t*const wchar_t* String*String*
Interop : PInvokeInterop : PInvoke
PInvoke:PInvoke:Les dlls Windows déclarent des fonctions Les dlls Windows déclarent des fonctions « exportées »« exportées »
__declspec ou dans le fichier .def__declspec ou dans le fichier .def
Le linker détecte ces informations et génère une table dans la Le linker détecte ces informations et génère une table dans la lib correspondante (avec les symboles et adresses relatives).lib correspondante (avec les symboles et adresses relatives).
On peut appeler les dll de 2 manières (au chargement ou On peut appeler les dll de 2 manières (au chargement ou dynamiquement). dynamiquement).
Dynamiquement on passe par LoadLibrary() et Dynamiquement on passe par LoadLibrary() et GetProcAdress() qui retourne un pointeur de fonction.GetProcAdress() qui retourne un pointeur de fonction.
PInvoke fait ce travail de LoadLibrary(), PInvoke fait ce travail de LoadLibrary(), GetProcAdress en utilisant le mécanisme de GetProcAdress en utilisant le mécanisme de « delay loading » « delay loading »
On attend un appel explicite à la fonction pour charger la dll en On attend un appel explicite à la fonction pour charger la dll en mémoire.mémoire.
Interop : PInvokeInterop : PInvoke
System::Runtime::InteropServices::DllImport permet de System::Runtime::InteropServices::DllImport permet de marquer une fonction comme existant dans le namespace marquer une fonction comme existant dans le namespace courant mais possédant son implémentation dans une dll courant mais possédant son implémentation dans une dll externe.externe.
DllimportDllimport
Voir EntryPoint pour renommer les fonctions importéesVoir EntryPoint pour renommer les fonctions importées
Interop : PInvokeInterop : PInvokeOn peut recevoir des call back via PInvokeOn peut recevoir des call back via PInvoke
On travail avec des delegatesOn travail avec des delegates
Gestion des structures :Gestion des structures :
Blittable types : Blittable types :
même représentation mémoire dans les 2 mondesmême représentation mémoire dans les 2 mondes
Marshalling automatique , Idem pour les structures, tableaux Marshalling automatique , Idem pour les structures, tableaux de « bittable type » …de « bittable type » …
Non Blittable typesNon Blittable types
On utilise l’attribut MarshalAs(UnmanagedType::) sur On utilise l’attribut MarshalAs(UnmanagedType::) sur les paramètres des fonctions importées.les paramètres des fonctions importées.
Interop : PInvokeInterop : PInvoke
PInvoke a un coût :PInvoke a un coût :10 à 30 x86 instructions par appel…10 à 30 x86 instructions par appel…
La performance est également liée à la quantité de La performance est également liée à la quantité de donnée à Marshallerdonnée à Marshaller
Préférer peu d’appel avec plus de données que plus Préférer peu d’appel avec plus de données que plus d’appel avec moins de données d’appel avec moins de données
PInvoke plus performant que COM Interop car COM PInvoke plus performant que COM Interop car COM Interop s’appuie sur PInvoke avec une couche Interop s’appuie sur PInvoke avec une couche supplémentairesupplémentaire
Interop : COM InteropInterop : COM Interop
RCW et CCWRCW et CCW.NET vers COM.NET vers COM
COM vers .NETCOM vers .NET
Interop : CLR HostingInterop : CLR Hosting
Qui host la CLR ?Qui host la CLR ?Le shell Windows Le shell Windows IE 6.0 et des brouzoufsIE 6.0 et des brouzoufs
ASP.NETASP.NET
Biztalk 2004Biztalk 2004
Pour la CLR2.0Pour la CLR2.0SQL Server 2005SQL Server 2005
Interop : CLR HostingInterop : CLR Hosting
Comment héberger la CLR ?Comment héberger la CLR ?Appel natif vers code managé seulementAppel natif vers code managé seulement
Une API clé :Une API clé :ICLRRuntimeHostICLRRuntimeHost
Scénarios très particuliers…Scénarios très particuliers…
DémosDémos
__pin pointer__pin pointer
#pragma#pragma
PInvokePInvoke
COM InteropCOM Interop
Hosting CLRHosting CLR
PausePause
Reprise dans 15 minutesReprise dans 15 minutes
VS2005 : C++ / CLIVS2005 : C++ / CLI
Normalisation des Extensions Managées Normalisation des Extensions Managées pour C++pour C++
En cours à l’ECMA et l’ISOEn cours à l’ECMA et l’ISO
Spécification disponible sur les sitesSpécification disponible sur les sites
VS2005 et C++VS2005 et C++Évolution du compilateurÉvolution du compilateur
Code ClsCompliantCode ClsCompliantRef class et ref valueRef class et ref valueClaire séparation entre new et gcnewClaire séparation entre new et gcnew
Heap et ManagedHeapHeap et ManagedHeap
Code IL produitCode IL produitSafe – Pure - VerifiableSafe – Pure - Verifiable
Nouvelle version de la CLR : 2.0Nouvelle version de la CLR : 2.01500 nouvelles classes1500 nouvelles classesGenerics …Generics …
Inclus eVC++Inclus eVC++Évolution des MFC for CE (multi doc…)Évolution des MFC for CE (multi doc…)
Déclarations basiquesDéclarations basiques
Notion d’ “adjective class”Notion d’ “adjective class”
Types C++ et CLR cohérentTypes C++ et CLR cohérent
ref class A abstract { }; // abstractref class B sealed : A { }; // no further derivation ref class C : B { }; // error, B is sealed
ref class A abstract { }; // abstractref class B sealed : A { }; // no further derivation ref class C : B { }; // error, B is sealed
class N { /*…*/ }; // nativeref class R { /*…*/ }; // CLR reference type
value class V { /*…*/ }; // CLR value typeinterface class I { /*…*/ }; // CLR interface type
enum class E { /*…*/ }; // CLR enumeration type
class N { /*…*/ }; // nativeref class R { /*…*/ }; // CLR reference type
value class V { /*…*/ }; // CLR value typeinterface class I { /*…*/ }; // CLR interface type
enum class E { /*…*/ }; // CLR enumeration type
Pointers et HandlesPointers et Handles
Création d’objet sur la pile le tas et le tas managéCréation d’objet sur la pile le tas et le tas managé
Sur le tas natifSur le tas natif
Comme d’hab pointeurs (*) stablent indépendant du GCComme d’hab pointeurs (*) stablent indépendant du GC
Comme d’hab, attention aux fuites mémoire si pas de deleteComme d’hab, attention aux fuites mémoire si pas de delete
Sur le tas managéSur le tas managé
Handles (^) sont des références d’ objetsHandles (^) sont des références d’ objets
Pas d’opérations arithmétiques dessus (cf. interior_ptr)Pas d’opérations arithmétiques dessus (cf. interior_ptr)
delete devient optionnelledelete devient optionnelle
Sur la pileSur la pile
Permet des destructions déterministesPermet des destructions déterministes
T* t1 = new T;T* t1 = new T;
T^ t2 = gcnew T;T^ t2 = gcnew T;
T t3;T t3;
PropertiesPropertiesSyntaxeSyntaxe
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
ref class R {public: property int Size; // compiler-generated}; // get, set, and backing store
Notation simplifiéeNotation simplifiée
Delegates et EventsDelegates et Events
SyntaxeSyntaxe
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 events.Vous pouvez écrire, ajouter, enlever et déclencher vous même les events.
GenericsGenericsSyntaxe des Generics ~comme celle des Syntaxe des Generics ~comme celle des templatestemplates
Admettent des contraintes et l’héritageAdmettent des contraintes et l’héritage
Les generics et les templates peuvent se Les generics et les templates peuvent se combiner…combiner…
generic<typename T>where T : IFooref class GR { /* … */ };
generic<typename T>where T : IFooref class GR { /* … */ };
MFC IntégrationMFC Intégration
Hosting WinForms Controls in MFCHosting WinForms Controls in MFC Les contrôles WinForms ne sont pas supportés tel quels:Les contrôles WinForms ne sont pas supportés tel quels:
Hébergé en tant qu’ActiveX Controls via regasmHébergé en tant qu’ActiveX Controls via regasm
Hébergé en tant que HWNDHébergé en tant que HWND
MFC héberge les contrôles WinForms via les interfaces MFC héberge les contrôles WinForms via les interfaces OLEOLE
Hébergé en tant qu’objets .NET Hébergé en tant qu’objets .NET
Accès complet aux WinForms .NET properties, methodes et eventsAccès complet aux WinForms .NET properties, methodes et events
« MFC80 addresses many accelerator related issues »« MFC80 addresses many accelerator related issues »
MFC Windows Forms MFC Windows Forms IntegrationIntegration
#include <afxWinForms.h>#include <afxWinForms.h>
MFCM80.DLL MFCM80.DLL Implemente “the underlying functionality”Implemente “the underlying functionality”Part des assemblies MFCPart des assemblies MFC
MFCMIFC80.DLLMFCMIFC80.DLLAssembly CLS compliant – MFC interfacesAssembly CLS compliant – MFC interfacesUtilisable par tous les langages .NETUtilisable par tous les langages .NETAjoute l’intégration des MFC aux Windows Forms Ajoute l’intégration des MFC aux Windows Forms ControlsControlsNamespace: Microsoft::VisualC::MFCNamespace: Microsoft::VisualC::MFC
Windows Forms Control as CViewWindows Forms Control as CView
Derivée de CWinFormsViewDerivée de CWinFormsViewclass MyView : public CWinFormsViewclass MyView : public CWinFormsView
Specifier le type de contrôle dans le constructeurSpecifier le type de contrôle dans le constructeurMyView::MyView() : CWinFormsView( MyControl::typeid ) { … }MyView::MyView() : CWinFormsView( MyControl::typeid ) { … }
Recevoir les Update Notification des views dans le Recevoir les Update Notification des views dans le ContrôleContrôle
Utiliser Microsoft::VisualC::MFC::IViewUtiliser Microsoft::VisualC::MFC::IView
Travailler avec les MFC Command RoutingTravailler avec les MFC Command RoutingUtiliser Microsoft::VisualC::MFC::ICommandTargetUtiliser Microsoft::VisualC::MFC::ICommandTarget
C++/CLI conclusionC++/CLI conclusion
* est à ^ ce que & est à %* est à ^ ce que & est à %
DémosDémos
C++/CLI classe et syntaxeC++/CLI classe et syntaxe
Destruction pattern Destruction pattern
C# Killer C# Killer GenericsGenerics
__clrcall__clrcall
Recap - Visual C++ EvolutionRecap - Visual C++ EvolutionVisual C++ 6.0Visual C++ 6.0 ATL3/MFC42 (6.0)ATL3/MFC42 (6.0)
Visual Studio .NETVisual Studio .NET
Visual C++ 7.0Visual C++ 7.0
Unified Visual Studio IDE & DebuggerUnified Visual Studio IDE & Debugger
MFC7/ATL7, attributed programming, ATL ServerMFC7/ATL7, attributed programming, ATL Server
Whole Program OptimizationWhole Program Optimization
C++ Managed ExtensionsC++ Managed Extensions
Fixed STL concurrency and DLL issuesFixed STL concurrency and DLL issues
/GS Runtime Security Check/GS Runtime Security Check
Visual Studio .NET Visual Studio .NET 20032003
Visual C++ 7.1Visual C++ 7.1
ISO Standard C++ Conformance ISO Standard C++ Conformance
/Arch:SSE/SSE2 – floating point code generation/Arch:SSE/SSE2 – floating point code generation
Windows Forms Designer for Managed ExtensionsWindows Forms Designer for Managed Extensions
Visual Studio 2005Visual Studio 2005
Visual C++ 8.0Visual C++ 8.0
C++/CLI LanguageC++/CLI Language
Integrated 64-bit Compiler and ToolsIntegrated 64-bit Compiler and Tools
Profile Guided OptimizationProfile Guided Optimization
Safe Extension for CRTSafe Extension for CRT
Project Property Manager, Source Navigation/BrowsingProject Property Manager, Source Navigation/Browsing
MFC/Windows Forms IntegrationMFC/Windows Forms Integration
RessourcesRessourcesLe centre de développement C++ Le centre de développement C++ en françaisen français
http://www.microsoft.com/france/http://www.microsoft.com/france/VisualC VisualC
RessourcesRessourcesC++ Tour FranceC++ Tour France
http://www.microsoft.com/france/VisualC http://www.microsoft.com/france/VisualC
VS 2003 What’s New Info:VS 2003 What’s New Info:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcedit/html/vcoriCCompilerLinkerCLanguage.asp?frame=true vcedit/html/vcoriCCompilerLinkerCLanguage.asp?frame=true
VS 2003 Compiler Changes InfoVS 2003 Compiler Changes Infohttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrfStandardComplianceIssuesInVisualC.asp?vclang/html/vclrfStandardComplianceIssuesInVisualC.asp?frame=trueframe=true
http://www.gotdotnet.com/team/vcplusplus/ http://www.gotdotnet.com/team/vcplusplus/
http://msdn.microsoft.com/visualc/ http://msdn.microsoft.com/visualc/ http://msdn.microsoft.com/newsgroups/ http://msdn.microsoft.com/newsgroups/ Dans des newsgroupsDans des newsgroupsmicrosoft.public.dotnet.languages.vc microsoft.public.dotnet.languages.vc microsoft.public.dotnet.languages.vc.libraries microsoft.public.dotnet.languages.vc.libraries
RessourcesRessources
http://msdn.microsoft.com/visualc/http://msdn.microsoft.com/visualc/Blogs:Blogs:
Brandon Bray http://blogs.msdn.com/branbrayBrandon Bray http://blogs.msdn.com/branbrayHerb Sutter http://blogs.msdn.com/hsutterHerb Sutter http://blogs.msdn.com/hsutterStan Lippman http://weblogs.asp.net/slippmanStan Lippman http://weblogs.asp.net/slippmanJonathan Caves http://joncaves.blogspot.comJonathan Caves http://joncaves.blogspot.comMartyn Lovell Martyn Lovell http://blogs.gotdotnet.com/martynlhttp://blogs.gotdotnet.com/martynl
C++/CLI Draft SpecificationC++/CLI Draft Specificationhttp://msdn.microsoft.com/visualc/http://msdn.microsoft.com/visualc/homepageheadlines/ecma/default.aspxhomepageheadlines/ecma/default.aspx
QUESTIONSQUESTIONS