| Csharp, dotnet... |
System.Diagnostics simple ou pour les nuls, exemple Pour l'exemple, on ne s'intéresse qu'à la classe Trace.. Debug est sur le même principe // Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.AutoFlush = true; Trace.Indent(); Trace.WriteLine("Entering Console.WriteLine("Hello World."); Trace.WriteLine("Exiting Trace.Unindent(); Par défaut, on retrouve ces messages dans la fenêtre sortie de Visual Studio. En Ajoutant le listener (mis en commentaire ici), les messages vont sur la console. On peut ajouter un listener dans le fichier app.config, au lieu de faire un add dans le code. Ici, on ajoute un listener de type texte <configuration> <system.diagnostics> <trace autoflush="true" indentsize="4"> <listeners> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TextWriterOutput.log" /> <remove name="Default" /> listeners> trace> system.diagnostics> configuration> On retrouve les traces dans TextWriterOutput.log On peut imaginer ne rien mettre dans app.config et activer les traces au moment de l’exécution en mettant ces lignes dans le fichier appli.exe.config.
Pour activer les traces de la classe classe , il ne faut pas oublier de compiler avec l'option TRACE (/define:TRACE en ligne de commande).
09:41 - 3/06/2008 - commentaires {0} - commenter ce billetFaire des mutex en CSharpLes mutex permettent de gérer l'acces exclusif à une resssource. Un mutex peut etre posé par un process et etre visible par l'autre. Un seul des deux process aura le mutex. Pour faire simple, il suffit de creer un mutex et d'essayer de le prendre, si on en peut pas quelqu'un d'autre l'a deja pris. Les mutex peuvent etre utilisés pour éviter de lancer deux fois la même application.
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "Singleton"); if (mutex.WaitOne(0, false))lancerAppli(args); elsereturn;
Pour vérifier l'état des mutex, ojn peut utiliser le célèbre process explorer de systinternals. Il suffit de chercher dans les mutants du process courant, ou alors de faire un find Handle... on verra le nom du mutex, si il est pris (held) et par qui... eventuellement on pourra forcer un close
17:33 - 21/04/2008 - commentaires {0} - commenter ce billetprogressbar, statusbar, invoke, invokerequiredprivate void btOk_Click(object sender, System.EventArgs e) { // OK on demarre la statusbar // dans le thread de l’IHM statusBar.Start(); (......) // OK creation d'un thread ThreadPool.QueueUserWorkItem(new WaitCallback(threaded_btOk_Click), infos);
private void threaded_btOk_Click(object state) { // OK recupération des parametres maClasse infos = (maClasse)state; // on fait ici tous les traitements que l’on veut dans le thread // sauf ceux qui touche a l’IHM (pas possible de modifier une IHM en dehors de son thread principal) (...) // les modifications de l’IHM sont faites dans une autre méthode callback_btOk_Click(reponse); } private void callback_btOk_Click(object returnValue) { // Au premier appel on vient du second thread // L’invoke permet d’executer cette méthode dans le thread de l’IHM et donc on peut modifier l’IHM if (InvokeRequired) { Invoke(new WaitCallback(callback_btOk_Click), new object[]{returnValue}); return; } (.....) //On peut arreter la status bar qui a été démarrée dans le thread principal... statusBar.Stop(); } 15:59 - 16/04/2008 - commentaires {0} - commenter ce billetdot.net csharp profiler profileDe temps en temps, c'est bien de savoir comment un programme se comporte et dans quelle méthode, il passe le plus de temps.
Plusieurs utilitaires permettent de faire ça.
Tout d'abord, le CLR Profiler de Microsoft. Seul soucis, il est activé pendant tout le temps du programme, ce qui peut être trés lent.
Un autre utilitaire permet de déclencher la récolte de données pendant l'exécution du programme, juste au moment où on en a besoin. Il s'agit de ProfileSharp Enterprise Edition de SoftProdigy. On peut récupérer une version d'évaluation.
D'autres profiler existent, mais je ne les ai pas testés. nprofiler : http://chimpswithkeyboards.com/projects/nprofiler/ ProfIt : http://dotnet.jku.at/projects/Prof-It/ nProf : http://sourceforge.net/projects/nprof/
17:01 - 4/02/2008 - commentaires {0} - commenter ce billetLog4net : traces applicatives dans dotnet : mise en place rapide et saleVoici un exemple rapide de mise en place de log4net pour une application dotnet (en C#, csharp).
Log4Net permet de créer des fichiers de logs, de gérer des patterns, de gérer des niveaux d'alertes. Il y a plusieurs composants qui font ce genre de chose, mais log4net reste un standard, à l'instar de log4j.
La mise au point de la configuration peut s'avérer fastidieuse car le composant permet beaucoup de choses. Pour tester ou le mettre en place en deux coups de cuillères à pots. On peut se contenter de peu. Voici un exemple :
Tout d'abord, on peut mettre la configuration de log4net dans un fichier séparé, pour faire rapide, on mettra cette configuration dans le App.Config.
Dans l' AssemblyInfos.cs, on ajoute [assembly: log4net.Config.XmlConfigurator(Watch=true)]
Dans app.config <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
puis, pour un fichier log simple <appender name="FileAppender" type="log4net.Appender.FileAppender"> <file value="log-file.txt" /> <appendToFile value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> layout> appender>
On peut alors utiliser dans le code ... protected static readonly log4net.ILog log = log4net.LogManager.GetLogger("default");
et vous pouvez, vous amusez log.Debug("Hello"); log.Fatal("Hello"); log.Info("Hello");
les messages iront dans log-file.txt.
Quelques exemples de config simples : http://logging.apache.org/log4net/release/config-examples.html Pour tout le reste (log4net, log4j, log4CC )et le download de log4net : http://logging.apache.org/
12:09 - 15/01/2008 - commentaires {0} - commenter ce billetAstuce pour compter un caractère dans une chainePour compter le nombre d'occurrence d'un caractère dans une chaine, on peut utiliser les expressions régulières (et la méthode count), ou alors parser toute la chaine avec une belle boucle foreach et compter..compter. Il y a plus simple en utilisant la méthode split.
Exemple int nb; String S="aabbaabba"; //retourne le nombrenb=(S .Split(new char[] {'a'})).Length;
08:24 - 20/11/2007 - commentaires {0} - commenter ce billetQuelques raccourcis Visual C# csharpVoici quelques raccourcis indispensables sous Visual C# Csharp.. enfin ceux que j'utilise souvent :
ctrl K + C : commenter la sélection ctrl K + U : décommenter la sélection ctrl K + D : indenter la sélection
ctrl K + X : insertion d'un snippet
ctrl + espace : completer la commande avec intellisense strl + shift + espace : donne les infos sur la méthode courante (parametres ,...) ctrl + J : completer les arguments avec intellisense
ctrl + ] : trouver la parenthèse correspondante. F12 : aller à la définition de la sélection
ctrl + - : aller à la ligne de code précédemment vue. ctrl + shift - : idem pour la suivante
ctrl + shift + F : chercher et remplacer pour toute la solution ctrl + F : chercher ctrl + G : aller à la ligne
F7 : vue code shift + F7 : vue design
F5 : exécuter, debugger ctrl + shift + B : construire la solution ctrl + shift + S : sauver la solution ctrl + alt + Q : afficher un espion sur la sélection F11 : executer pas à pas détaillé. F10 : executer pas à pas. F9 : poser ou enlever un point d'arrêt pour le debugger.
Le document de microsoft pour Visual Studio 2005 :
Visual C# 2005 Keyboard Shortcut Reference Poster
/// ; Commentaires automatique d'une méthode /// /// /// /// /// /// /// ///
14:06 - 2/11/2007 - commentaires {0} - commenter ce billetExemple d'appel à Mq-Series en csharp, dotnetVoici un exemple minimaliste de lecture/ecriture Mq-Series avec dotnet, csharp.
John Concannon nous donne un exemple plus complet qui contient la dll d'IBM (mqs-series 5.3), (les liens sont cassés).
La page suivante semble plus complete et donne aussi les dll nécessaires sous forme d'un zip à installer.
Rosi Reddy : http://www.csharphelp.com/archives3/archive477.html
et enfin quelques exemples de sources données par IBM : http://www-304.ibm.com/jct09002c/isv/tech/sampmq.html
17:16 - 31/10/2007 - commentaires {0} - commenter ce billetXMLSerializer et Interfaces : contourner l'infaisableQuelques fois, on a besoin de sauvegarder en fichiers XML des classes qui ne sont connues que par leurs interfaces. L'utilisation direct de la classe XMSserializer n'est pas possible, car cette dernière n'accepte pas les interfaces comme type à sérialiser (normal, on ne peut sérialiser que des types que l'on connait, une interface ne connait pas ses types internes).
C'est, encore, plus compliqué lorsqu'on veut sérialiser une interface qui est, elle-même, une collection d'une autre interface.
L'objectif (propre?) sera donc de se rapprocher au plus près des implémentations afin d'avoir des objets sérialisables. Ce principe casse un peu notre utilisation des interfaces...
Pour commencer :
IPortes est une interface : collection de IPorte
ImplCC.Portes est son implementation
IPorte est une interface : classe représentant une porte
ImplCC.Porte est son implementation
Nous allons avoir besoin d'une classe qui sera utilisée pour contenir les données de Portes qui seront sérialises.
PortesSerialisable
/*** la classe qui reprend les données de l'interface ***/
public class PortesSerializable
{
// l'element en xml s'appelera Porte
[System.Xml.Serialization.XmlElement("Porte")]
// champ de la classe : un tableau de l'implementation de Porte
//(donc serialisable)
public ImplCC.Porte[] _portes;
public PortesSerializable(){} // Pour la serialisation
// constructeur qui va récupérer un tableau d'implementation de Porte
public PortesSerializable(ImplCC.Porte[] p)
{
_portes = p;
}
}
/** la classe qui ecrit notre collection de porte en xml **/
public static void Write(IPortes portes)
{
// Creer une instance de la classe XmlSerializer
// en speicifiant le type de l'objet (pas l'interface)
XmlSerializer serializer = new XmlSerializer(typeof(PortesSerializable));
// transferer la collection de porte dans un tableau pour sérialiser
ImplCC.Porte[] ps =
new ImplCC.Porte[portes.Count];
// ici on transtype l'interface en son implementation...:-(
for (int i = 0; i < portes.Count; i++)
ps[i]=(ImplCC.Porte)portes[i];
PortesSerializable tmp_portes = new PortesSerializable(ps);
// Ouvrir un streamwriter
TextWriter writer = new StreamWriter("porte.xml");
// Serializer les portes et fermer le stream
serializer.Serialize(writer, tmp_portes);
writer.Close();
return;
}
11:08 - 31/10/2007 - commentaires {0} - commenter ce billetEnregistrer des sources csharp en htmlIl existe différents petits outils pour publier du code source dotNet (chercher codeprint). Cependant, le plus simple, lorsqu'on n'a que quelques lignes est de faire un petit copier-coller dans un document word et de l'enregistrer en html.
11:00 - 31/10/2007 - commentaires {0} - commenter ce billet |
Description Quelques notes sur csharp et dotnet
Accueil Archives Amis Articles Recents - System.Diagnostics simple ou pour les nuls, exemple - Faire des mutex en CSharp - progressbar, statusbar, invoke, invokerequired - dot.net csharp profiler profile - Log4net : traces applicatives dans dotnet : mise en place rapide et sale Amis - ben - Christelle - bartheju - REBRAB - BizigDu |
||||||||||||||||||||||||||||||||||||||||||