<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
    <channel>
        <title>SimonFerquel.net</title>
        <link>http://www.simonferquel.net//blog/Default.aspx</link>
        <description>A blog about .Net development</description>
        <language>fr-FR</language>
        <copyright>Simon FERQUEL</copyright>
        <managingEditor>simon.ferquel@hotmail.fr</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <image>
            <title>SimonFerquel.net</title>
            <url>http://www.simonferquel.net//blog/images/RSS2Image.gif</url>
            <link>http://www.simonferquel.net//blog/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Simonferquelnet" type="application/rss+xml" /><item>
            <title>[DSL Tools] G&amp;eacute;n&amp;eacute;ration incr&amp;eacute;mentale, g&amp;eacute;n&amp;eacute;ration multi-artefacts : partie 2</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/279578435/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-2.aspx</link>
            <description>&lt;p&gt;Dans la précédente partie de cet article, nous avons vu comment générer plusieurs fichier à partir du même DSL. Nous allons maintenant voir comment faire de la génération de code incrémentale. C'est à dire que l'on va modifier du code existant écrit par l'utilisateur en injectant du code provenant de notre générateur. Pour y parvenir, nous allons utiliser une API COM exposée par Visual Studio baptisée CodeModel.&lt;/p&gt;  &lt;p&gt;CodeModel permet de parcourir en lecture-écriture notre code source sous forme d'arbre d'objets, pour peu qu'il soit écrit dans un langage supportant CodeModel (C#, VB.Net et C++ sont actuellement supportés par Microsoft). Cette API est assez rudimentaire et peu pratique à utiliser "out of the box". Pour comprendre l'API et son fonctionnement, je vous conseille la lecture de cet article de la MSDN : &lt;a title="http://msdn2.microsoft.com/en-us/library/92aexfx5(VS.80).aspx" href="http://msdn2.microsoft.com/en-us/library/92aexfx5(VS.80).aspx"&gt;http://msdn2.microsoft.com/en-us/library/92aexfx5(VS.80).aspx&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Ce qu'il faut en retenir, c'est que ca ressemble énormément à du DOM XML, mais dont la grammaire est différentes. L'interface "de base" (oui, on est en COM, on ne manipule pas les objets directement en utilisant leur classe, mais via les interfaces qu'ils implémentent... le "de base" voulant dire que c'est l'interface commune à tous les objets d'un arbre CodeModel) CodeElement a des propriétés Parent, Children et Kind, tout comme XmlNode. On peut ensuite le caster sous forme de CodeClass, CodeNamespace etc., tout come XmlNode peut-être casté en XmlElement, XmlAttribute, etc. Le soucis étant qu'il n'éxiste pas d'API de requétage correct pour CodeModel.&lt;/p&gt;  &lt;p&gt;Afin de palier à ce manque et rendre l'API plus "developer friendly", mon idée a été de développer des méthodes d'extensions pour les classes CodeClass2, CodeFunction2, CodeProperty etc.&lt;/p&gt;  &lt;p&gt;Voici un exemple simple:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;CodeFunction2&lt;/span&gt;&amp;gt; FindMethodsByName(&lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CodeClass2 &lt;/span&gt;codeClass, &lt;span style="color: blue"&gt;string &lt;/span&gt;name)
        {
            &lt;span style="color: blue"&gt;return &lt;/span&gt;codeClass.Children.OfType&amp;lt;&lt;span style="color: #2b91af"&gt;CodeFunction2&lt;/span&gt;&amp;gt;().Where(cf =&amp;gt; cf.Name == name);
        }&lt;/pre&gt;

&lt;p&gt;Cette méthode d'extension me permet de faire des choses du genre : &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(codeClass.FindMethodsByName(&lt;span style="color: #a31515"&gt;"Initialize"&lt;/span&gt;).FirstOrDefault() == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                CreateInitializeMethod();&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Ce qui est vous l'avouerez est quand même plutôt simple comparé à ce que l'on aurait du faire en C# 2 :).&lt;/p&gt;

&lt;p&gt;Pour illustrer l'utilisation de cette API, de mes méthodes d'extension ainsi que de ce que l'on a vu dans la précédente partie, nous allons écrire un générateur de Behavior ASP.Net Ajax qui produit les behaviors côté client en Script#, et des Control Extender côté serveur pour faciliter leur utilisation avec ASP.Net.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Création du modèle &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le modèle est très simple, car il ne fait intervenir que 2 notions : L'Extender et l'ExtenderProperty&lt;/p&gt;

&lt;p&gt;&lt;a href="http://simonferquel.net/blog/images/simonferquel_net/blog/WindowsLiveWriter/DSLToolsGnrationincrmentalegnrationmulti_119DC/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://simonferquel.net/blog/images/simonferquel_net/blog/WindowsLiveWriter/DSLToolsGnrationincrmentalegnrationmulti_119DC/image_thumb.png" width="569" height="284" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Je ne m'étendrai pas trop là dessus, car c'est vraiment simple. La seule chose à dire c'est que j'ai créé des TypeEditor pour le BehaviorFile et ExtenderFile, ainsi qu'une enum PropertyType (qui n'a que 3 valeurs possibles pour l'instant : String, ExternalControl, ExternalBehavior, qui permettront donc de référencer d'autres contrôles / extenders facilement).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Création des "CodeGenerators" &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comme nous l'avons vu dans &lt;a href="http://www.simonferquel.net/blog/archive/2008/04/03/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-1.aspx"&gt;l'article précédant&lt;/a&gt;, nous n'allons pas créer de CustomTool, mais nous allons directement mettre le code de génération dans le projet de Package Visual Studio. Dans notre cas, nous avons 2 classes à générer dans 2 projets différents (un projet Script# côté client, un projet C# côté serveur). Les 2 classes étant écrites en C#, avec les même contraintes de capacité de "customisation", nous allons toutes les 2 les créer / modifier avec CodeModel. Pour faciliter tout celà, j'ai créer une classe de base dont les 2 générateurs hériteront :&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public abstract class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CodeModelBasedGenerator
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DTE2 &lt;/span&gt;_dte;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DTE2 &lt;/span&gt;DTE
        {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_dte; }
        }
        &lt;span style="color: blue"&gt;private string &lt;/span&gt;_fileName;

        &lt;span style="color: blue"&gt;protected string &lt;/span&gt;FileName
        {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_fileName; }
        }

        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FileCodeModel2 &lt;/span&gt;_fileCodeModel;

        &lt;span style="color: blue"&gt;protected &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FileCodeModel2 &lt;/span&gt;FileCodeModel
        {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_fileCodeModel; }
        }
        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CodeModel &lt;/span&gt;_codeModel;

        &lt;span style="color: blue"&gt;protected &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CodeModel &lt;/span&gt;CodeModel
        {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_codeModel; }
        }
        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ProjectItem &lt;/span&gt;_projectItem;

        &lt;span style="color: blue"&gt;protected &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ProjectItem &lt;/span&gt;ProjectItem
        {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_projectItem; }
        }
        &lt;span style="color: blue"&gt;protected &lt;/span&gt;CodeModelBasedGenerator(&lt;span style="color: blue"&gt;string &lt;/span&gt;fileName, &lt;span style="color: #2b91af"&gt;IServiceProvider &lt;/span&gt;serviceProvider)
        {
            _fileName = fileName;
            _dte = (&lt;span style="color: #2b91af"&gt;DTE2&lt;/span&gt;)serviceProvider.GetService(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;DTE&lt;/span&gt;));
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(_dte == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"The service provider cannot provide Visual Studio DTE Service"&lt;/span&gt;);
            _projectItem = _dte.Solution.FindProjectItem(_fileName);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(_projectItem == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"The specified file is not part of the current solution projects"&lt;/span&gt;);
            _fileCodeModel = (&lt;span style="color: #2b91af"&gt;FileCodeModel2&lt;/span&gt;)_projectItem.FileCodeModel;
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(_fileCodeModel == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"The specified file does not support Code Model"&lt;/span&gt;);
            _codeModel = _projectItem.ContainingProject.CodeModel;
           
        }

        &lt;span style="color: blue"&gt;public abstract void &lt;/span&gt;Generate();
    }&lt;/pre&gt;

&lt;p&gt;En héritant de cette classe, mes générateurs auront ainsi accès au FileCodeModel du fichier qu'ils doivent manipuler, ainsi qu'à d'autres points d'extensibilité.&lt;/p&gt;

&lt;p&gt;Voici un extrait de code du générateur de behavior Script#, illustrant l'utilisation de la classe de base, et de mon API de requétage CodeModel :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BehaviorCodeGenerator &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;CodeModelBasedGenerator
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ExtenderElement &lt;/span&gt;_element;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;BehaviorCodeGenerator(&lt;span style="color: blue"&gt;string &lt;/span&gt;fileName,&lt;span style="color: #2b91af"&gt;ExtenderElement &lt;/span&gt;element, &lt;span style="color: #2b91af"&gt;IServiceProvider &lt;/span&gt;provider)
            : &lt;span style="color: blue"&gt;base&lt;/span&gt;(fileName, provider)
        { _element = element; }

        &lt;span style="color: blue"&gt;public override void &lt;/span&gt;Generate()
        {
            FileCodeModel.&lt;font color="#ff00ff"&gt;AddImportsIfNotExist&lt;/font&gt;(&lt;span style="color: #a31515"&gt;"System"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"System.DHTML"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"Sys"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"Sys.UI"&lt;/span&gt;);
            &lt;span style="color: blue"&gt;var &lt;/span&gt;behaviorNS = FileCodeModel.&lt;font color="#ff00ff"&gt;FindOrCreateNamespace&lt;/font&gt;(_element.BehaviorNamespace);
            &lt;span style="color: blue"&gt;var &lt;/span&gt;behaviorClass = behaviorNS.&lt;font color="#ff00ff"&gt;FindOrCreateClass&lt;/font&gt;(_element.Name + &lt;span style="color: #a31515"&gt;"Behavior"&lt;/span&gt;);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(behaviorClass.Bases.OfType&amp;lt;&lt;span style="color: #2b91af"&gt;CodeElement&lt;/span&gt;&amp;gt;().Where(ctr =&amp;gt; ctr.FullName == &lt;span style="color: #a31515"&gt;"Sys.UI.Behavior"&lt;/span&gt;)&lt;br /&gt;                                                         .FirstOrDefault() == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                behaviorClass.AddBase(&lt;span style="color: #a31515"&gt;"Behavior"&lt;/span&gt;, &lt;span style="color: blue"&gt;null&lt;/span&gt;);


            &lt;span style="color: green"&gt;// Constructor
            &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;constructor = behaviorClass.&lt;font color="#ff00ff"&gt;FindConstructors&lt;/font&gt;().Where(fc =&amp;gt; fc.MatchParameterTypes(&lt;span style="color: #a31515"&gt;"System.DHTML.DOMElement"&lt;/span&gt;))&lt;br /&gt;                                                              .FirstOrDefault();
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(constructor == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
            {
                constructor = (&lt;span style="color: #2b91af"&gt;CodeFunction2&lt;/span&gt;) behaviorClass.AddFunction(_element.Name + &lt;span style="color: #a31515"&gt;"Behavior"&lt;/span&gt;, &lt;br /&gt;                                                            &lt;span style="color: #2b91af"&gt;vsCMFunction&lt;/span&gt;.vsCMFunctionConstructor, &lt;br /&gt;                                                            &lt;span style="color: blue"&gt;null&lt;/span&gt;, -1, &lt;br /&gt;                                                            &lt;span style="color: #2b91af"&gt;vsCMAccess&lt;/span&gt;.vsCMAccessPublic, &lt;span style="color: blue"&gt;null&lt;/span&gt;);
                &lt;span style="color: blue"&gt;var &lt;/span&gt;param = constructor.AddParameter(&lt;span style="color: #a31515"&gt;"element"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"DOMElement"&lt;/span&gt;, -1);
                &lt;span style="color: blue"&gt;var &lt;/span&gt;editPoint = param.EndPoint.CreateEditPoint();
                editPoint.EndOfLine();
                editPoint.&lt;font color="#ff00ff"&gt;InsertFormated&lt;/font&gt;(&lt;span style="color: #a31515"&gt;" : base(element)"&lt;/span&gt;);
            }

            &lt;span style="color: green"&gt;// Properties
            &lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;prop &lt;span style="color: blue"&gt;in &lt;/span&gt;_element.ExtenderPropertyElements)
            {
                &lt;span style="color: #2b91af"&gt;CodeVariable2 &lt;/span&gt;field;
                &lt;span style="color: #2b91af"&gt;CodeProperty &lt;/span&gt;codeProp;&lt;/pre&gt;

  &lt;pre class="code"&gt;                {...}
            }
        }
    }&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;(en violet, ce sont les méthodes d'extensions que j'ai rajouté)&lt;/p&gt;

&lt;p&gt;Comme on peut le voir, le code existant est manipulé, mais pas écraser. On vérifie la présence du constructeur des propriétés, des "using" etc. avant de les ajouter au code existant.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Branchement des générateurs &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comme dans mon &lt;a href="http://www.simonferquel.net/blog/archive/2008/04/03/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-1.aspx"&gt;article précédant&lt;/a&gt;, je déclenche la génération au moment ou le document est sauvé. Ce code a donc lieu dans la classe DocData (que l'on étend par partialité, pour ne pas se faire écraser par le générateur de code du designer de DSL) :&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ExtenderFactoryDocData
   &lt;/span&gt;{
       &lt;span style="color: blue"&gt;protected override void &lt;/span&gt;OnDocumentSaved(&lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)
       {
           &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnDocumentSaved(e);
           &lt;span style="color: #2b91af"&gt;ExtenderBagModel &lt;/span&gt;root = RootElement &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ExtenderBagModel&lt;/span&gt;;
           &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;elem &lt;span style="color: blue"&gt;in &lt;/span&gt;root.ExtenderElements)
           {
               &lt;span style="color: blue"&gt;var &lt;/span&gt;behaviorGen = &lt;span style="color: blue"&gt;new &lt;/span&gt;CodeGenerators.&lt;span style="color: #2b91af"&gt;BehaviorCodeGenerator&lt;/span&gt;(elem.BehaviorFile, elem, ServiceProvider);
               behaviorGen.Generate();
               &lt;span style="color: blue"&gt;var &lt;/span&gt;extenderGen = &lt;span style="color: blue"&gt;new &lt;/span&gt;CodeGenerators.&lt;span style="color: #2b91af"&gt;ExtenderCodeGenerator&lt;/span&gt;(elem.ExtenderFile, elem, ServiceProvider);
               extenderGen.Generate();
           }
       }
   }&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Et voilà, rien de très compliqué en somme... juste une librairies d'extensions (que vous pouvez télécharger avec les sources), qui facilite grandement la vie.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Pour regarder ce que ca donne en vrai, manipuler le code et l'améliorer (par exemple, utiliser des chemins relatifs plutôt qu'absolus pour référencer les fichiers, gérer d'autres types de données...), voici les sources, contenant un petit projet de test tout simple (qui nécessite par ailleurs l'installation de Script# pour fonctionner) :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.simonferquel.net/blog/Images/simonferquel_net/blog/ExtenderFactory.zip"&gt;Les sources&lt;/a&gt;&lt;/p&gt;

&lt;div style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fdc6d651-c63f-485e-902b-8f27474e0069" class="wlWriterSmartContent"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/DSL" rel="tag"&gt;DSL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%20Sharp" rel="tag"&gt;C Sharp&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CodeModel" rel="tag"&gt;CodeModel&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual%20Studio" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/38.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=6tRoQp"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=6tRoQp" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=ZJhTHg"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=ZJhTHg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=3LkEGG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=3LkEGG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=WWhqaG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=WWhqaG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=dAI8jG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=dAI8jG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=k3SXkG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=k3SXkG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/279578435" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2008/04/28/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-2.aspx</guid>
            <pubDate>Mon, 28 Apr 2008 18:56:41 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/38.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2008/04/28/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-2.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/38.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/38.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2008/04/28/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-2.aspx</feedburner:origLink></item>
        <item>
            <title>[DSL Tools] G&amp;eacute;n&amp;eacute;ration incr&amp;eacute;mentale, g&amp;eacute;n&amp;eacute;ration multi-artefacts : partie 1</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/263589332/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-1.aspx</link>
            <description>&lt;p&gt;Dans la plupart des présentations sur les DSL Tools, on nous montre des scénarios très simples de génération de code "one-shot", et qui ne tiennent pas compte du code éxistant.&lt;/p&gt;  &lt;p&gt;Récemment, j'ai eu à travailler sur un cas plus complexe : Notre client souhaitait faire du développement d'interface utilisateur Ajax piloté par les specs. C'est à dire, que la personne en charge des spécifications de l'UI doit pouvoir définir le contenu de l'écran (les champs de formulaires), des règles d'assistance à la saisie (remplir une combobox en fonction de tels ou tels autres champs, de données provenant d'un SGBD etc.) et des déclencheurs pour exécuter ces règles (événement sur un champs, timer, ...), et qu'à partir de cela, un squelette de code et des artefacts de documentation soient générés. Pour chaque champs et chaque règle, le "spécificateur" donnera une description détaillée de ce que le "dévelopeur" devra faire. L'outil utilisé par le "spécificateur" (et plus tard par le "dévelopeur" aussi, rassurez vous ;-)) est un DSL qui va donc générer un certain nombre d'artefacts:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Un extrait de doc au format xhtml utilisé pour les documents de spécification détaillant le contenu des écrans, les actions déclenchées sur tel ou tel évènement etc. &lt;/li&gt;    &lt;li&gt;Un UserControl ASP.Net contenant les champs définis dans le DSL &lt;/li&gt;    &lt;li&gt;Un Behavior ASP.Net Ajax permettant de contrôler l'état de l'écran côté client et générer les "triggers" sensés déclencher les "règles", et contenir des points d'entrée customisables par le dévelopeur (notamment pour donner la possibilité d'implémenter certaines règles côté client) &lt;/li&gt;    &lt;li&gt;Un Service WCF exposé à ASP.Net Ajax, contenant des méthodes correspondant aux règles à exécuter côté serveur (celles qui nécessitent un accès à la base de donnée par exemple). La description de chaque règle sera recopiée dans la Documentation Xml de ces méthodes afin d'assister le dévelopeur &lt;/li&gt;    &lt;li&gt;Bien sûr, le développeur n'aura à sa charge que l'implémentation des règles et éventuellement la retouche du UserControl pour modifier le layout (la communication entre le behavior et les règles côté client et serveur étant entièrement générée) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Une première problématique se pose directement : notre DSL génère plusieurs artefacts, donc un CustomTool implémentant IVsSingleFileGenerator ne fonctionnera pas. Pour cela il existe un moyen simple, il suffit dans la classe DocData générée par le designer DSL (dans le projet DslPackage) et de surcharger sa méthode OnDocumentSaved (créez une partial class dans un fichier à part pour ne pas vous faire écraser vos modifications) :&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Company.DemoIncrementalDSL
{
    &lt;span style="color: blue"&gt;partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DemoIncrementalDSLDocData
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;protected override void &lt;/span&gt;OnDocumentSaved(&lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)
        {
            &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnDocumentSaved(e);

            &lt;span style="color: green"&gt;// Do your own logic
            &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;rootElement =  &lt;span style="color: blue"&gt;this&lt;/span&gt;.RootElement &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ModelWithMultipleFiles&lt;/span&gt;;

            &lt;span style="color: blue"&gt;string &lt;/span&gt;docFilePath = rootElement.DocumentationFilePath;
            &lt;span style="color: blue"&gt;string &lt;/span&gt;classFilePath = rootElement.ClassFilePath;
        }
    }
}&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Dans cet exemple, &lt;span style="color: #2b91af"&gt;ModelWithMultipleFiles&lt;/span&gt; est le nom de l'élément racine de mon model, et il contient 2 DomainProperties "DocumentationFilePath" et "ClassFilePath". Nous sommes donc prêt ici à générer nos fichiers à partir du model (car ici nous savons que le model vient d'être persisté, nous avons l'instance en cours dans la variable rootElement, et nous avons donc les chemins des fichier à générer).&lt;/p&gt;

&lt;p&gt;Pour parfaire cet exemple, il serait bon de fournir un éditeur personnalisé pour les chemins de fichier. En effet, l'expérience utilisateur de notre DSL reste pour le moment à désirer, car nos propriétés de types string, ne sont éditables que via une TextBox.&lt;/p&gt;

&lt;p&gt;Pour y remédier, nous devons implémenter un UITypeEditor et placer un attribut sur notre propriété spécifiant l'utilisation de notre editeur. Voici un exemple de code pour implémenter UITypeEditor à base de SaveFileDialog :&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Drawing.Design;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Forms;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Company.DemoIncrementalDSL
{
    &lt;span style="color: green"&gt;// UITypeEditor est situé dans le namespace System.Drawing.Design
    &lt;/span&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FilePathEditor &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;UITypeEditor
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UITypeEditorEditStyle &lt;/span&gt;GetEditStyle(System.ComponentModel.&lt;span style="color: #2b91af"&gt;ITypeDescriptorContext &lt;/span&gt;context)
        {
            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UITypeEditorEditStyle&lt;/span&gt;.Modal;
        }
        &lt;span style="color: blue"&gt;public override object &lt;/span&gt;EditValue(System.ComponentModel.&lt;span style="color: #2b91af"&gt;ITypeDescriptorContext &lt;/span&gt;context, &lt;span style="color: #2b91af"&gt;IServiceProvider &lt;/span&gt;provider, &lt;span style="color: blue"&gt;object &lt;/span&gt;value)
        {
            &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;sfd = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SaveFileDialog&lt;/span&gt;())
            {
                sfd.FileName = value.ToString();
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(sfd.ShowDialog() == &lt;span style="color: #2b91af"&gt;DialogResult&lt;/span&gt;.OK)
                {
                    &lt;span style="color: blue"&gt;return &lt;/span&gt;sfd.FileName;
                }
                &lt;span style="color: blue"&gt;else
                    return &lt;/span&gt;value;
            }
        }
    }
}&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Dans l'éditeur de DSL, on posera alors un custom attribute sur les propriété qui devront utiliser cet éditeur :&lt;/p&gt;

&lt;p&gt; &lt;a href="http://simonferquel.net/blog/images/simonferquel_net/blog/WindowsLiveWriter/DSLToolsGnrationdecodeincrmentaleetAPICo_13B12/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://simonferquel.net/blog/images/simonferquel_net/blog/WindowsLiveWriter/DSLToolsGnrationdecodeincrmentaleetAPICo_13B12/image_thumb.png" width="376" height="267" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Un deuxième problème se pose à nous : Générer du code de manière incrémentale. En effet, je n'ai jamais vu de projet où les spécifications étaient fixées une fois pour toute. Il y a toujours des allers-retours à faire, adapter les specs au feedback utilisateur etc. Il n'est donc pas possible de regénérer notre code sans tenir compte des personnalisations opérées par le dévelopeur depuis la précédente génération (remplissage des méthodes de règle). Pour des fichiers basés sur du X(ht)ml, il n'y a pas de soucis, les APIs DOM, ou Linq to Xml sont là pour ca, mais en ce qui concerne le code C# (ou VB), cela semble assez compliqué.&lt;/p&gt;

&lt;p&gt;Nous verrons dans la prochaine partie de cet article comment utiliser une API fournie par Visual Studio pour explorer / écrire / modifier du code programatiquement (et qui nous aidera donc à régler notre problème) : CodeModel.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;UPDATE : La 2e partie de l'article est &lt;a href="http://www.simonferquel.net/blog/archive/2008/04/28/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-2.aspx"&gt;publiée&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d44a4d4b-10c2-4c0c-b4ec-825c92307641" class="wlWriterSmartContent"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/DSL" rel="tag"&gt;DSL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Ajax" rel="tag"&gt;Ajax&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UITypeEditor" rel="tag"&gt;UITypeEditor&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CodeModel" rel="tag"&gt;CodeModel&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/37.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=dajse0"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=dajse0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=cECypYg"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=cECypYg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=YUR9VcG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=YUR9VcG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=sdb0JVG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=sdb0JVG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=gMm6B2G"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=gMm6B2G" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=XByv8AG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=XByv8AG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/263589332" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2008/04/03/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-1.aspx</guid>
            <pubDate>Thu, 03 Apr 2008 21:53:39 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/37.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2008/04/03/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-1.aspx#feedback</comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/37.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/37.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2008/04/03/dsl-tools-geacuteneacuteration-increacutementale-geacuteneacuteration-multi-artefacts--partie-1.aspx</feedburner:origLink></item>
        <item>
            <title>VLinq is alive!</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/263201403/vlinq-is-alive.aspx</link>
            <description>&lt;p&gt;Et voilà, vous l'attendiez, moi aussi d'ailleurs, VLinq vient d'être "releasé" sur MSDN Code Gallery : &lt;a title="http://code.msdn.microsoft.com/vlinq" href="http://code.msdn.microsoft.com/vlinq"&gt;http://code.msdn.microsoft.com/vlinq&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Mitsu a fait un long poste récapitulatif sur le projet, son déroulement, comment il marche etc., je vous le (v)linq donc ^^: &lt;a href="http://blogs.msdn.com/mitsufu/archive/2008/04/02/visual-linq-query-builder-pour-linq-to-sql-vlinq.aspx"&gt;Le poste avec toutes les infos qui vont bien sur VLinq&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Apparemment il y'a encore un bug ou deux qui traînent, notamment dans le programme d'installation. Mitsu a posté une solution en commentaire de son post, et je vais essayer de regarder ce qui va pas dès que j'ai un peu de temps et une VPC vierge sous la main.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Enjoy it, Comment it, Share it!&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e67cd54e-7576-4af3-b0d7-361e7609edbf" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/Linq" rel="tag"&gt;Linq&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual%20Studio" rel="tag"&gt;Visual Studio&lt;/a&gt;,&lt;a href="http://technorati.com/tags/VLinq" rel="tag"&gt;VLinq&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%20Sharp" rel="tag"&gt;C Sharp&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/36.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=ttHMO9"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=ttHMO9" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=npyoHmg"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=npyoHmg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=tKGia2G"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=tKGia2G" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=0UrL4LG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=0UrL4LG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=SikUL4G"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=SikUL4G" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=bfoJJjG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=bfoJJjG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/263201403" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2008/04/03/vlinq-is-alive.aspx</guid>
            <pubDate>Thu, 03 Apr 2008 08:41:05 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/36.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2008/04/03/vlinq-is-alive.aspx#feedback</comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/36.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/36.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2008/04/03/vlinq-is-alive.aspx</feedburner:origLink></item>
        <item>
            <title>[TFS] Debug de Custom Task Team Build</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/238194513/tfs-debug-de-custom-task-team-build.aspx</link>
            <description>&lt;p&gt;Pour un projet interne, j'ai récemment du étendre les fonctionnalités de Team Foundation Server, en implémentant (entre autres) une tâche MSBuild pour Team Build.&lt;/p&gt;  &lt;p&gt;Le processus de création de custom task est éxactement le même que celui d'une task MSBuild classique, mais le debugging n'est pas franchement aisé. Dans le cas où la tâche n'utilise pas d'informations fournies par Team Build, il n'y a pas de problème, il suffit de lancer un MSBuild en stand-alone sur lequel on attache le debugger, mais dans le cas contraire, ca se complique.&lt;/p&gt;  &lt;p&gt;En effet, attacher le debugger sur le processus du Web-Service Team Build ne résout rien, car il ne fait que lancer et piloter un process MSBuild externe (le debugger ne voit que ce qui tourne dans le process ASP.Net).&lt;/p&gt;  &lt;p&gt;Ainsi pour pouvoir attacher un debugger, il faut feinter légèrement et faire en sorte que ce soit la task MSBuild elle-même qui demande un debugger. Pour ce-faire, une solution consiste d'écrire au début de la méthode Execute:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;#if DEBUG&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;System.Diagnostics.Debug.Fail("Click Retry, and attach a debugger!");&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;#endif&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Cet astuce peut aussi être utilisée, par exemple lors du développement de Services Windows.&lt;/p&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/35.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=A5j0wg"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=A5j0wg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=1bd3dse"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=1bd3dse" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=ufxJo4E"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=ufxJo4E" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=DsB6PZE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=DsB6PZE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=ALruI4E"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=ALruI4E" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=6pqsvPE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=6pqsvPE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/238194513" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2008/02/20/tfs-debug-de-custom-task-team-build.aspx</guid>
            <pubDate>Wed, 20 Feb 2008 14:13:17 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/35.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2008/02/20/tfs-debug-de-custom-task-team-build.aspx#feedback</comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/35.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/35.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2008/02/20/tfs-debug-de-custom-task-team-build.aspx</feedburner:origLink></item>
        <item>
            <title>Techdays 2008 : Sources du projet MyFlickr</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/236880931/techdays-2008--sources-du-projet-myflickr.aspx</link>
            <description>&lt;p&gt;Comme promis, je poste les sources du projet MyFlickr, avant et après Silverlightisation.&lt;/p&gt;  &lt;p&gt;Je vais prendre le temps ce week end ou le week end prochain de rejouer la démo en WebCast, en prenant tout le temps d'expliquer en détail ce que je fais (chose que je n'ai pas pu faire en 15 minutes de démo mardi dernier ^^).&lt;/p&gt;  &lt;p&gt;En attendant, profitez des sources qui fournissent un bon exemple d'utilisation de SBT, Script#, des techniques de templatisation, de conventions de nommage et tout ce que l'on a vu dans cette session "marathon".&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.simonferquel.net/blog/Images/simonferquel_net/blog/MyFlickr.zip"&gt;MyFlickr Source code&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4697eb4e-028a-4df3-b76d-cf39e2a65223" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/Techdays" rel="tag"&gt;Techdays&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Script#" rel="tag"&gt;Script#&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/34.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=a6szTq"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=a6szTq" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=iPRIwie"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=iPRIwie" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=ShyJ7kE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=ShyJ7kE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=FkgPj7E"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=FkgPj7E" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=oxBQe7E"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=oxBQe7E" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=Jf8wPoE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=Jf8wPoE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/236880931" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2008/02/18/techdays-2008--sources-du-projet-myflickr.aspx</guid>
            <pubDate>Mon, 18 Feb 2008 09:20:50 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/34.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2008/02/18/techdays-2008--sources-du-projet-myflickr.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/34.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/34.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2008/02/18/techdays-2008--sources-du-projet-myflickr.aspx</feedburner:origLink></item>
        <item>
            <title>Techdays 2008 : Viendez les amis ! viendez !</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/225618345/techdays-2008--viendez-les-amis--viendez.aspx</link>
            <description>&lt;p&gt;Les Techdays 2008, comme on dit par chez nous, "C'est-bon-mangez-en", avec pleins de présentations et démos sur les nouveautés MS. &lt;/p&gt;  &lt;p&gt;Ce sera aussi l'occasion de venir me rencontrer lors de 2 sessions que j'aurai le plaisir de co-animer :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://galilee.microsoft.fr/TechDays2008/Session-Agenda.aspx?cellid=81298e3b-95a1-44b6-a0b8-22d8441d6d47"&gt;Visual Linq Query Builder&lt;/a&gt;, mardi 12 février 14h30 - 15h30, avec Mitsu Furuta, mon mentor le temps de mon stage chez MS ;-). On parlera de Linq bien sûr, de VLinq aussi, de WPF dans Visual Studio sûrement, mais aussi des choses plus rigolotes sur le "comment qu'on a fait avec nos petits doigts", et l'occasion pour les développeurs junior et étudiants d'avoir un retour d'expérience sur le déroulement d'un stage chez Microsoft (même si le stage que j'ai fait est un petit peu... particulier !). C'est une session niveau 200, donc on ne rentrera pas dans des détails trop trop techniques non plus, session aspirine-free ! (mais néanmoins une session à laquelle je tiens tout particulièrement, parce que c'est quand même un peu mon bébé)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://galilee.microsoft.fr/TechDays2008/Session-Agenda.aspx?cellid=0d3f4545-135a-4f51-9f87-b9185759bad9"&gt;Développement avancé avec Silverlight 1.0 et JavaScript&lt;/a&gt;, mardi 12 février 13h00 - 14h00, avec Guillaume Renaud, architecte au MTC, architecte du projet Blue Portal (et aussi celui qui s'est le levé le plus tard le samedi du ProFrance à Biarritz :-p). Attention, session 400, mais pas dans un sens "je vais voir des trucs hyper techniques et je vais rien y comprendre" (enfin, y'aura quand même de quoi bien se poiler, je vous rassure), mais plutôt, avec l'expérience acquise en production, comment être productif avec Silverlight 1.0 et JavaScript, quels sont les pièges à éviter, et quelles sont les perspectives d'avenir de Silverlight 1.0 avec la sortie de la prochaine version... En vrac voici de quoi on va essayer de parler:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Rappels sur JS / ASP.Net Ajax, IntelliSense, Debugging, appels de Web Services&lt;/li&gt;      &lt;li&gt;Animations : Blend, création de templates et conventions de nommage, solution adoptée dans Silverlight Behaviors Toolkit, Tweened, Injection de xaml dynamique à partir de JS / depuis des fichiers de template&lt;/li&gt;      &lt;li&gt;Silverlight et l'existant JS : migration DHTML -&amp;gt; Silverlight, scénarios multi-plugin, clipping, utilisation du framework Silverlight Behavior Toolkit dans une application ASP.Net Ajax, programmation orientée composants et comment Script# peut nous aider, build events, ou comment automatiser pleins de choses ;-)&lt;/li&gt;      &lt;li&gt;Sujets pur Silverlight : debugging, gestion des erreurs, écrans de loading, downloader, fonts, overlay CSS, architecturer ses applications en JS, gestion du mode Full Screen, Drag &amp;amp; Drop...&lt;/li&gt;      &lt;li&gt;Silverlight 1.0 vs Silverlight 2.0&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Comme vous pouvez le voir cette session Silverlight est vraiment TRES fournie... On vous promet très peu de slides, beaucoup d'action, et pour le coup normalement tout le monde devrait sortir de la salle sur les rotules (et moi le premier ^^).&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Vous pourrez récupérer les sources des démos (en tout cas des miennes...) sur ce blog dès la fin de la session... A savoir partir d'une application ASP.Net Ajax avec du code fonctionnel déjà en place, et migrer l'interface en Silverlight 1.0 avec des effets "zouff ! wiff ! boom !" en s'appuyant sur cet existant fonctionnel.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Voilà voilà, je vous conseil de prendre un peu d'avance sur la session et de vous familiariser un minimum avec Asp.Net Ajax (côté client hein, pas juste l'Update Panel), ainsi qu'avec JavaScript et Silverlight 1.0 avant de venir...&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2f79805e-3988-49fe-a195-fa74b920ab7f" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/Techdays" rel="tag"&gt;Techdays&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Linq" rel="tag"&gt;Linq&lt;/a&gt;,&lt;a href="http://technorati.com/tags/VLinq" rel="tag"&gt;VLinq&lt;/a&gt;,&lt;a href="http://technorati.com/tags/JavaScript" rel="tag"&gt;JavaScript&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/33.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=McnPY9"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=McnPY9" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=ziGRdgd"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=ziGRdgd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=KeMolED"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=KeMolED" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=5aor1mD"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=5aor1mD" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=wy7qjuD"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=wy7qjuD" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=XnkksaD"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=XnkksaD" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/225618345" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2008/01/30/techdays-2008--viendez-les-amis--viendez.aspx</guid>
            <pubDate>Wed, 30 Jan 2008 01:53:32 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/33.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2008/01/30/techdays-2008--viendez-les-amis--viendez.aspx#feedback</comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/33.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/33.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2008/01/30/techdays-2008--viendez-les-amis--viendez.aspx</feedburner:origLink></item>
        <item>
            <title>Source code du Framework .Net</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/217910877/source-code-du-framework-.net.aspx</link>
            <description>&lt;p&gt;Ca a été annoncé il y a quelques temps déjà, c'est maintenant chose faite : &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx"&gt;Le code source du Framework .Net 3.5 est ouvert&lt;/a&gt; :-).&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3857110b-0bb4-4dcb-a64f-3c56d4186447" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C#" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual%20Studio" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/32.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=jCAMed"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=jCAMed" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=V6GxZ8d"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=V6GxZ8d" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=GIAjjOD"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=GIAjjOD" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=r9rW1OD"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=r9rW1OD" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=eYXv3mD"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=eYXv3mD" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=kTlsWND"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=kTlsWND" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/217910877" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2008/01/17/source-code-du-framework-.net.aspx</guid>
            <pubDate>Wed, 16 Jan 2008 23:19:04 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/32.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2008/01/17/source-code-du-framework-.net.aspx#feedback</comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/32.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/32.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2008/01/17/source-code-du-framework-.net.aspx</feedburner:origLink></item>
        <item>
            <title>Silverlight Behaviors Toolkit - Happy New Year release</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/208546850/silverlight-behaviors-toolkit---happy-new-year-release.aspx</link>
            <description>&lt;p&gt;Je viens de publier une nouvelle release de &lt;a href="http://www.codeplex.com/SLToolKit"&gt;Silverlight Behaviors Toolkit&lt;/a&gt;, pleine de Breaking Changes, mais avec quelques nouveautés sympathiques dans l'"API core" :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MultiBehavior : Permet d'attacher plusieurs Behaviors au même UIElement&lt;/li&gt;    &lt;li&gt;Supports des UIElement non nommés&lt;/li&gt;    &lt;li&gt;Supports des NameScopes Silverlight&lt;/li&gt;    &lt;li&gt;Version compactée qui fonctionne&lt;/li&gt;    &lt;li&gt;FlowPanel (merci Pierlag ^^)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Cette version nécessite Script# 0.4.5.0 minimum (qui apporte quelques nouveauté sympathiques, voir mon post précédant).&lt;/p&gt;  &lt;p&gt;SBT n'est pas encore tout à fait stabilisé, mais le nombre de breaking changes dans les prochaines versions devraient être considérablement réduit.&lt;/p&gt;  &lt;p&gt;N'hésitez pas à tester, utiliser, commenter, et communiquer sur ce projet :)!&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:15d8b66f-660f-4e44-98de-3d08b6036836" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SBT" rel="tag"&gt;SBT&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight%20Behaviors%20Toolkit" rel="tag"&gt;Silverlight Behaviors Toolkit&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/31.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=zP7LAd"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=zP7LAd" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=GpRdvEc"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=GpRdvEc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=mixGI9C"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=mixGI9C" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=2Lklf5C"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=2Lklf5C" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=jCGuhkC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=jCGuhkC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=uBcnIvC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=uBcnIvC" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/208546850" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2007/12/30/silverlight-behaviors-toolkit---happy-new-year-release.aspx</guid>
            <pubDate>Sun, 30 Dec 2007 17:12:19 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/31.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2007/12/30/silverlight-behaviors-toolkit---happy-new-year-release.aspx#feedback</comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/31.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/31.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2007/12/30/silverlight-behaviors-toolkit---happy-new-year-release.aspx</feedburner:origLink></item>
        <item>
            <title>Script# 0.4.5 : Support de VS 2008 et pas mal de BugFixes</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/208095681/script-0.4.5--support-de-vs-2008-et-pas-mal.aspx</link>
            <description>&lt;p&gt;Pendant ces périodes de fêtes, je surveille un peu moins les différents blogs / projets qui m'intéresse, et j'ai donc loupé il y'a une dizaine de jours, la sortie d'une nouvelle version de &lt;a href="http://projects.nikhilk.net/Projects/ScriptSharp.aspx"&gt;Script#&lt;/a&gt; (projet mené par &lt;a href="http://www.nikhilk.net/"&gt;Nikhil Kothari&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;La plus grosse nouveauté est la présence d'un MSI pour Visual Studio 2008 à côté du MSI version 2005. Une autre nouveauté importante, est la présence de nombreux big-fixes du compilateur, surtout en ce qui concerne la génération de code compacté (code release). Par exemple, &lt;a href="http://www.codeplex.com/SLToolkit"&gt;Silverlight Behavior Toolkit&lt;/a&gt; fonctionne désormais correctement en version "Release".&lt;/p&gt;  &lt;p&gt;Au passage, je suis en train de travailler activement sur SBT, et de nombreuses modifications de fond (refactoring, application de behaviors sur des éléments non nommés, application de plusieurs behaviors sur le même élément), ainsi que de nouveaux samples, avec utilisation du downloader Silverlight pour compacter et télécharger séparément les templates d'animation sont en cours de finition.&lt;/p&gt;  &lt;p&gt;Attendez vous à des Breaking changes qui vont faire mal... et on est toujours à un stade alpha, sans garantie de compatibilité ascendante pour le moment !&lt;/p&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/30.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=Fgg9Ya"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=Fgg9Ya" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=XtS6FVc"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=XtS6FVc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=zn3DOtC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=zn3DOtC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=mADsyIC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=mADsyIC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=z4zLosC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=z4zLosC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=W3I6GzC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=W3I6GzC" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/208095681" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2007/12/29/script-0.4.5--support-de-vs-2008-et-pas-mal.aspx</guid>
            <pubDate>Sat, 29 Dec 2007 16:16:41 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/30.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2007/12/29/script-0.4.5--support-de-vs-2008-et-pas-mal.aspx#feedback</comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/30.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/30.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2007/12/29/script-0.4.5--support-de-vs-2008-et-pas-mal.aspx</feedburner:origLink></item>
        <item>
            <title>Ca y est, c'est fini</title>
            <link>http://feeds.feedburner.com/~r/Simonferquelnet/~3/203336026/ca-y-est-cest-finit.aspx</link>
            <description>&lt;p&gt;Et voilà, après 6 mois de travail sur VLinq au sein de l'équipe DPE de Microsoft France (salut les gens au fait ^^), le projet est en cours de finalisation (localisation, tests finaux, quelques réglages au niveau de la distributions...) et mon stage est finit.&lt;/p&gt;
&lt;p&gt;J'en profite justement pour vous annoncer la sortie des &lt;a href="http://msdn2.microsoft.com/fr-fr/data/bb743261.aspx"&gt;Webcast du tour "Accès aux données"&lt;/a&gt; de &lt;a href="http://blogs.msdn.com/mitsufu/"&gt;Mitsu&lt;/a&gt;, dans lequel vous pourrez voir 13 minutes de présentation du projet (bon la version sur laquelle on l'a fait date un peu, mais ça donne une bonne idée ^^).&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7978d8b8-eab4-425f-836a-ef567a677df4" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Mots clés Technorati : &lt;a rel="tag" href="http://technorati.com/tags/Linq"&gt;Linq&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/VLinq"&gt;VLinq&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Data%20access"&gt;Data access&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Microsoft"&gt;Microsoft&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.simonferquel.net//blog/aggbug/29.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Simonferquelnet?a=UpVss7"&gt;&lt;img src="http://feeds.feedburner.com/~a/Simonferquelnet?i=UpVss7" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=xroxjqc"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=xroxjqc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=1cAf1lC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=1cAf1lC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=pYjG7CC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=pYjG7CC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=lqP5nGC"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=lqP5nGC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Simonferquelnet?a=kfKxh6C"&gt;&lt;img src="http://feeds.feedburner.com/~f/Simonferquelnet?i=kfKxh6C" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Simonferquelnet/~4/203336026" height="1" width="1"/&gt;</description>
            <dc:creator>Simon FERQUEL</dc:creator>
            <guid isPermaLink="false">http://www.simonferquel.net//blog/archive/2007/12/20/ca-y-est-cest-finit.aspx</guid>
            <pubDate>Thu, 20 Dec 2007 10:51:06 GMT</pubDate>
            <wfw:comment>http://www.simonferquel.net//blog/comments/29.aspx</wfw:comment>
            <comments>http://www.simonferquel.net//blog/archive/2007/12/20/ca-y-est-cest-finit.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://www.simonferquel.net//blog/comments/commentRss/29.aspx</wfw:commentRss>
            <trackback:ping>http://www.simonferquel.net//blog/services/trackbacks/29.aspx</trackback:ping>
        <feedburner:origLink>http://www.simonferquel.net//blog/archive/2007/12/20/ca-y-est-cest-finit.aspx</feedburner:origLink></item>
    </channel>
</rss>
