Csharp, dotnet...

Ajouter la compatibilité GET pour un WebService (suite)

Si on ne veut cette compatibilité qu'avec une location précises... un WebService et pas tout le site web par exemple.... on peut ajouter :

location path="WSTechnique.asmx">
    system.web>
      webServices>
      protocols>
        add name="HttpGet" />
      /protocols>
      /webServices>
    /system.web>
  /location>

14:54 - 6/01/2009 - commentaires {0}




Ajouter la compatibilité GET pour un WebService

Dans la section du fichier web.config, il faut ajouter :

webServices>

protocols>

add name="HttpGet" />

/protocols>

/webServices>

 

et du coup le webservice peut être appelé avec la méthode GET, pas seulement un POST ou un SOAP.

10:29 - 6/01/2009 - commentaires {0}




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 Main");

                  Console.WriteLine("Hello World.");

                  Trace.WriteLine("Exiting Main");

                  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}




Faire des mutex en CSharp

Les 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);

else

       return;

 

 

 

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}




progressbar, statusbar, invoke, invokerequired

private 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 {2}




dot.net csharp profiler profile

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

http://www.microsoft.com/Downloads/details.aspx?familyid=86CE6052-D7F4-4AEB-9B7A-94635BEEBDDA&displaylang=en

 

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.

http://www.softprodigy.com

 

 

 

 

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}




Log4net : traces applicatives dans dotnet : mise en place rapide et sale

Voici 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}




Astuce pour compter un caractère dans une chaine

Pour 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 nombre

nb=(S.Split(new char[] {'a'})).Length;

 

08:24 - 20/11/2007 - commentaires {0}




Quelques raccourcis Visual C# csharp

Voici 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 {2}




Exemple d'appel à Mq-Series en csharp, dotnet

Voici 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}




XMLSerializer et Interfaces : contourner l'infaisable

Quelques 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}




Enregistrer des sources csharp en html

Il 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}




Description
Quelques notes sur csharp et dotnet

«  11 2017  »
LunMarMerJeuVenSamDim
 12345
6789101112
13141516171819
20212223242526
27282930 

Accueil
Archives
Amis

Articles Recents
- Ajouter la compatibilité GET pour un WebService (suite)
- Ajouter la compatibilité GET pour un WebService
- System.Diagnostics simple ou pour les nuls, exemple
- Faire des mutex en CSharp
- progressbar, statusbar, invoke, invokerequired

Amis
- ben
- Christelle
- bartheju
- REBRAB
- BizigDu