<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7585819210280137176</id><updated>2011-04-21T12:18:33.180-07:00</updated><title type='text'>DevBlog</title><subtitle type='html'>Ceci est un blog sur le developpement en général, les jeux vidéos, le homebrow, etc...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dpamar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7585819210280137176/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dpamar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Scarta</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7585819210280137176.post-3423178135014693824</id><published>2007-10-17T02:26:00.001-07:00</published><updated>2007-10-17T02:26:20.461-07:00</updated><title type='text'>Evaluation dynamique d'expressions</title><content type='html'>&lt;div&gt;Article: Evaluation dynamique d&amp;#39;expressions en C#&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Langage: C#&lt;/div&gt; &lt;div&gt;Environnement: Microsoft Visual Studio 2005&lt;/div&gt; &lt;div&gt;Description: Ce petit article présente comment réaliser en quelques lignes un analyseur d&amp;#39;expressions mathématiques, en utilisant la compilation dynamique.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Premier point: L&amp;#39;idée&lt;/div&gt; &lt;div&gt;Prenons le code suivant:&lt;/div&gt; &lt;div&gt;public Double Run()&lt;/div&gt; &lt;div&gt;{&lt;/div&gt; &lt;div&gt;&amp;nbsp; return 1+1+1;&lt;/div&gt; &lt;div&gt;}&lt;br clear="all"&gt;Que va-t&amp;#39;on obtenir en appelant Run? Réponse: 3, bien évidement. Par contre, c&amp;#39;est purement statique.&lt;/div&gt; &lt;div&gt;Supposons maintenant une string contenant le texte suivant:&lt;/div&gt; &lt;div&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; _source = &lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#a31515" size="2"&gt;@&amp;quot;using System;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#a31515" size="2"&gt;public class Interpreter{{&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#a31515" size="2"&gt;public static Double Run(){{ return {0}; }}&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#a31515" size="2"&gt;}}&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Les doubles accolades sont là pour gérer le {0}, paramètre de formatage. Ainsi, on a dans notre string le code d&amp;#39;une micro-classe avec sa méthode, mais pas le fameux 1+1+1. Pour fixer une expression dans notre micro-classe, il fudrait appeller  String.Format(_source, &amp;quot;1+1+1&amp;quot;);&lt;/div&gt; &lt;div&gt;L&amp;#39;idée est donc de créer à la volée le code d&amp;#39;une micro-classe, puis de le compiler et de l&amp;#39;executer.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Deuxième point: Réalisation&lt;/div&gt; &lt;div&gt;Créaons un projet Windows application quelconque, avec une TextBox tbSource et un bouton btnGo.&lt;/div&gt; &lt;div&gt;Dans notre classe, déclarer les usings suivants:&lt;/div&gt; &lt;div&gt;&lt;font color="#0000ff" size="2"&gt;using&lt;/font&gt;&lt;font size="2"&gt; Microsoft.CSharp;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#0000ff" size="2"&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.CodeDom.Compiler;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#0000ff" size="2"&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Reflection;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;Déclarer aussi _source:&lt;/div&gt; &lt;div&gt;&lt;font color="#0000ff" size="2"&gt;private string&lt;/font&gt;&lt;font size="2"&gt; _source = &lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#a31515" size="2"&gt;@&amp;quot;using System;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#a31515" size="2"&gt;public class Interpreter{{&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#a31515" size="2"&gt;public static Double Run(){{ return {0}; }}&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#a31515" size="2"&gt;}}&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Puis, sur le btnGo_Click, mettre le code suivant:&lt;/div&gt; &lt;div&gt;&lt;font color="#2b91af" size="2"&gt;CSharpCodeProvider&lt;/font&gt;&lt;font size="2"&gt; codeprovider = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;CSharpCodeProvider&lt;/font&gt;&lt;font size="2"&gt; ();&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#2b91af" size="2"&gt;CompilerResults&lt;/font&gt;&lt;font size="2"&gt; results = codeprovider.CompileAssemblyFromSource(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt; CompilerParameters&lt;/font&gt;&lt;font size="2"&gt;(), &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt;.Format(_source, tbSource.Text));&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (results.Errors.Count != 0) &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;MessageBox&lt;/font&gt;&lt;font size="2"&gt;.Show(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Error&amp;quot; &lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;font size="2"&gt; mainType = results.CompiledAssembly.GetType(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Interpreter&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#2b91af" size="2"&gt;MethodInfo&lt;/font&gt;&lt;font size="2"&gt; mainMethod = mainType.GetMethod(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Run&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#2b91af" size="2"&gt;MessageBox&lt;/font&gt;&lt;font size="2"&gt;.Show(mainMethod.Invoke(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt; ).ToString());&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Et voilà, six lignes et c&amp;#39;est réglé !&lt;/div&gt; &lt;div&gt;Explications: le CSharpCodeProvider fournit tout un tas de méthode utilisables pour compiler du code C# dans une Assembly créée dynamiquement (par exemple en utilisant CompileAssemblyFromSource).&lt;/div&gt; &lt;div&gt;Ensuite, GetType(&amp;quot;Interpreter&amp;quot;) sur l&amp;#39;assembly générée nous donne notre nouveau type correspondant à notre nouvelle classe Interpreter, et GetMethod(&amp;quot;Run&amp;quot;) permet d&amp;#39;en récuperer l&amp;#39;unique méthode. &lt;/div&gt; &lt;div&gt;Enfin, Invoke sert à invoquer la méthode. Etant donnée que la méthode Run est statique et sans paramètre, alors les deux paramètres d&amp;#39;Invoke sont null (le premier est l&amp;#39;instance d&amp;#39;Interpreter à utiliser pour appeler Run, le second la liste des paramètres). &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Dernier point: On teste&lt;/div&gt; &lt;div&gt;Lancons le programme. 1+1+1, réponse 3, ca passe.&lt;/div&gt; &lt;div&gt;Plus dur (12*5) + (9*8)/12, réponse 66, ca passe.&lt;/div&gt; &lt;div&gt;Encore plus dur, Math.Cos(Math.PI/3), réponse 0.5. Nickel&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Et voilà, après c&amp;#39;est sûr que cette application n&amp;#39;a pas grand interêt mais cela montre que l&amp;#39;utilisation du CSharpCodeProvider et de la compilation dynamique sont assez simples, à vous de trouver les applications qui vont bien avec. &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7585819210280137176-3423178135014693824?l=dpamar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpamar.blogspot.com/feeds/3423178135014693824/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7585819210280137176&amp;postID=3423178135014693824' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7585819210280137176/posts/default/3423178135014693824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7585819210280137176/posts/default/3423178135014693824'/><link rel='alternate' type='text/html' href='http://dpamar.blogspot.com/2007/10/evaluation-dynamique-dexpressions.html' title='Evaluation dynamique d&apos;expressions'/><author><name>Scarta</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7585819210280137176.post-6391361866760576129</id><published>2007-09-26T08:15:00.001-07:00</published><updated>2007-09-26T08:29:36.791-07:00</updated><title type='text'>Article: Comment créer un service Windows présentant des objets .Net Remoting</title><content type='html'>&lt;div&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;&lt;u&gt;Article: Comment créer un service Windows présentant des objets .Net Remoting&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;div&gt;&lt;br /&gt;&lt;u&gt;Langage: C#&lt;br /&gt;Environnement: Visual Studio 2005&lt;br /&gt;Description:&lt;/u&gt; Les services Windows sont assez pratiques pour maintenir des processus en tâche de fond. Par ailleurs, le .Net Remoting est assez puissant puisqu'il permet à un client de récuperer un pseudo-objet (le véritable objet étant côté serveur), et d'en appeller les méthodes comme s'il été une véritable instance de l'objet (en pratique, des connections Tcp assurent la liaison avec le serveur). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;Cet article a pour but de présenter un service présentant un objet Logger, ainsi que son client (un application console), qui pourra logger des informations, ainsi que lire et effacer les logs existants.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;u&gt;Premier point: L'interface&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;Permet de définir l'interface de l'objet présenté en .Net Remoting.&lt;br /&gt;Créez un projet Log.Serivce.Interface de type Class Library, avec un fichier ILogger.cs&lt;br /&gt;&lt;strong&gt;ILogger.cs&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-family:courier new;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;namespace Log.Service.Interface&lt;br /&gt;{&lt;br /&gt;  public interface ILogger&lt;br /&gt;  {&lt;br /&gt;    void AddLog(string log);&lt;br /&gt;    void ClearLogs();&lt;br /&gt;    string Logs { get ;}&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;u&gt;Second point: Le service&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;Permet de créer le service à proprement parler.&lt;br /&gt;Créez un projet Log.Service de type Windows Service, avec une classe Logger.cs, et renommez Service1.cs en Service.cs&lt;br /&gt;Ajoutez une réference vers Log.Service.Interface et une autre vers System.Runtime.Remoting&lt;br /&gt;&lt;strong&gt;Logger.cs&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using Log.Service.Interface;&lt;br /&gt;namespace Log.Service&lt;br /&gt;{&lt;br /&gt;  //MarshalByRef est la classe de base des objets présentable en remoting&lt;br /&gt;  internal class Logger : MarshalByRefObject, ILogger&lt;br /&gt;  {&lt;br /&gt;    private StringBuilder _logs;&lt;br /&gt;    //Permet de déclarer une durée de vie infinie pour cet objet&lt;br /&gt;    public override object InitializeLifetimeService()&lt;br /&gt;    {&lt;br /&gt;      return null ;&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;    public Logger() &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;    {&lt;br /&gt;      _logs = new StringBuilder(); &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;    } &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;    #region ILogger Members &lt;/div&gt;&lt;div&gt;    public void AddLog(string log)&lt;br /&gt;    {&lt;br /&gt;      _logs.AppendLine(String.Format( "{0} : {1}", DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss" ), log));&lt;br /&gt;    }&lt;br /&gt;    public void ClearLogs()&lt;br /&gt;    {&lt;br /&gt;      _logs = new StringBuilder();&lt;br /&gt;    }&lt;br /&gt;    public string Logs { get { return _logs.ToString(); } }&lt;br /&gt;    #endregion&lt;br /&gt;  }&lt;br /&gt;} &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:courier new;"&gt;&lt;div&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;Service.cs&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-family:courier new;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.ServiceProcess;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Runtime.Remoting.Channels.Tcp;&lt;br /&gt;using System.Runtime.Remoting.Channels;&lt;br /&gt;using System.Runtime.Remoting;&lt;br /&gt;namespace Log.Service&lt;br /&gt;{&lt;br /&gt;  public partial class Service : ServiceBase&lt;br /&gt;  {&lt;br /&gt;    //Declaration d'un channel&lt;br /&gt;    private TcpChannel _channel;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;    public Service()&lt;br /&gt;    {&lt;br /&gt;      InitializeComponent();&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;    protected override void OnStart(string[] args)&lt;br /&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;      //Initialisation du channel&lt;br /&gt;      _channel = new TcpChannel(12345);&lt;br /&gt;      ChannelServices .RegisterChannel(_channel);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;      //Enregistrement d'un objet remoting de type logger, en mode &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;singleton&lt;br /&gt;      //Le mode singleton permet de garder toujours la même instance de Logger&lt;br /&gt;      //(à la différence de SingleCall)&lt;br /&gt;      RemotingConfiguration .RegisterWellKnownServiceType(&lt;br /&gt;        typeof (Logger),&lt;br /&gt;        "Logger" ,&lt;br /&gt;        WellKnownObjectMode .Singleton);&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;    protected override void OnStop() { }&lt;br /&gt;  }&lt;br /&gt;} &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:courier new;"&gt;&lt;div&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;u&gt;Troisième point: Le client&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;Permet d'utiliser l'objet ILogger présenté par le service&lt;br /&gt;Créez un projet Log.Client de type Console Application, avec une réference vers Log.Service.Interface et System.Runtime.Remoting&lt;br /&gt;&lt;strong&gt;Program.cs&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-family:courier new;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Runtime.Remoting.Channels.Tcp;&lt;br /&gt;using System.Runtime.Remoting.Channels;&lt;br /&gt;using Log.Service.Interface;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;namespace Log.Client&lt;br /&gt;{&lt;br /&gt;  class Program&lt;br /&gt;  {&lt;br /&gt;    //Declaration d'un channel et d'un ILogger&lt;br /&gt;    private static TcpChannel _channel;&lt;br /&gt;    private static ILogger _logger;&lt;br /&gt;    static void Main(string[] args)&lt;br /&gt;    {&lt;br /&gt;      if (args.Length == 0)&lt;br /&gt;      {&lt;br /&gt;        Console .WriteLine("Log.Client");&lt;br /&gt;        Console .WriteLine("Syntax:");&lt;br /&gt;        Console .WriteLine("Log.Client /c\t\tClears the logs");&lt;br /&gt;        Console .WriteLine("Log.Client /g\t\tGets current logged text");&lt;br /&gt;        Console .WriteLine("Log.Client TEXT\t\tLogs the current text");&lt;br /&gt;        return ;&lt;br /&gt;      }&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;      //Initialisation du channel&lt;br /&gt;      _channel = new TcpChannel();&lt;br /&gt;      ChannelServices .RegisterChannel(_channel);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;      //Recuperation du ILogger&lt;br /&gt;      _logger = Activator .GetObject(typeof(ILogger), "tcp://localhost:12345/Logger" ) as ILogger;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;      if (args[0] == "/c")&lt;br /&gt;      {&lt;br /&gt;        _logger.ClearLogs();&lt;br /&gt;        Console .WriteLine("Logs cleared");&lt;br /&gt;        return ;&lt;br /&gt;      }&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;      if (args[0] == "/g")&lt;br /&gt;      { &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;        Console .WriteLine(_logger.Logs);&lt;br /&gt;        return ;&lt;br /&gt;      }&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;      StringBuilder message = new StringBuilder();&lt;br /&gt;      foreach ( string arg in args)&lt;br /&gt;        message.Append(arg + " ");&lt;br /&gt;      _logger.AddLog(message.ToString());&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;      Console.WriteLine( "Message {0} logged", message.ToString()); &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;br /&gt;  }&lt;br /&gt;} &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:courier new;"&gt;&lt;div&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;u&gt;Dernier point: Vérifier que tout marche bien&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;Création du service: via le Visual Studio 2005 Command Prompt, tapez (l'espace entre "binpath=" et le chemin est nécessaire)&lt;br /&gt;&lt;em&gt;sc create Log.Service binpath= &lt;chemin&gt;&lt;br /&gt;&lt;/em&gt;Lancement du service: via le Visual Studio 2005 Command Prompt, tapez:&lt;br /&gt;&lt;em&gt;net start Log.Service&lt;/em&gt;&lt;br /&gt;Test de l'application: essayez les commandes suivantes&lt;br /&gt;&lt;em&gt;Log.Client &lt;votre&gt;&lt;/em&gt;, plusieurs fois avec différents messages, puis&lt;br /&gt;&lt;em&gt;Log.Client /g&lt;/em&gt; pour tout récuperer, et enfin&lt;br /&gt;&lt;em&gt;Log.Client /c&lt;/em&gt; pour tout effacer.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Optionnel:&lt;br /&gt;Pour arrêter le service:&lt;br /&gt;&lt;em&gt;net stop Log.Service&lt;br /&gt;&lt;/em&gt;Pour supprimer le service:&lt;br /&gt;&lt;em&gt;sc delete Log.Service&lt;br /&gt;&lt;/em&gt;Et voilà, libre à vous d'imaginer de nouveaux modes d'utilisation sur le même principe.&lt;br /&gt;David&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7585819210280137176-6391361866760576129?l=dpamar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpamar.blogspot.com/feeds/6391361866760576129/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7585819210280137176&amp;postID=6391361866760576129' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7585819210280137176/posts/default/6391361866760576129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7585819210280137176/posts/default/6391361866760576129'/><link rel='alternate' type='text/html' href='http://dpamar.blogspot.com/2007/09/article-comment-crer-un-service-windows.html' title='Article: Comment créer un service Windows présentant des objets .Net Remoting'/><author><name>Scarta</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7585819210280137176.post-3335534811035470633</id><published>2007-09-19T05:25:00.001-07:00</published><updated>2007-09-19T05:25:09.099-07:00</updated><title type='text'>Création</title><content type='html'>&lt;div&gt;&lt;font size="4"&gt;&lt;u&gt;Allez, c&amp;#39;est parti, création de mon blog.&lt;/u&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2"&gt;Le blog, c&amp;#39;est bien, c&amp;#39;est pratique et tout et tout. Alors c&amp;#39;est dit je m&amp;#39;y met aussi. J&amp;#39;ai souvent des idées, des coups de gueules, des réalisations sympatiques: allez hop à partir de maintenant je les partagerai ici (si j&amp;#39;y pense).  &lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;font size="2"&gt;&lt;u&gt;Présentation rapide:&lt;/u&gt;&lt;/font&gt; &lt;font size="2"&gt;David, ingénieur de formation, développeur durant les heures de bureau et le temps libre aussi, mais à des fins plus variées: du gadget google à la grosse application Windows .Net, du Javascript au C++, bref un panel assez large.  &lt;/font&gt;&lt;br clear="all"&gt;&lt;/div&gt; &lt;div&gt;&lt;u&gt;Réalisations actuelles:&lt;/u&gt; Le problème c&amp;#39;est qu&amp;#39;elles trainent un peu partout. Commencez donc par &lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.scarta.info/" target="_blank"&gt; www.scarta.info&lt;/a&gt;, les plus anciennes sont trop éparpillées pour que je puisse les regrouper ou même m&amp;#39;en souvenir. Les prochaines en tout cas seront listées ici. &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;-- &lt;br&gt;I push my deadlines closer than anybody else, or let&amp;#39;s say it this way: I&amp;#39;m really late &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7585819210280137176-3335534811035470633?l=dpamar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpamar.blogspot.com/feeds/3335534811035470633/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7585819210280137176&amp;postID=3335534811035470633' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7585819210280137176/posts/default/3335534811035470633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7585819210280137176/posts/default/3335534811035470633'/><link rel='alternate' type='text/html' href='http://dpamar.blogspot.com/2007/09/cration.html' title='Création'/><author><name>Scarta</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
