<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Benoît Laut</title>
    <link>http://benoitlaut.net/</link>
    <description>Let There Be Code</description>
    <language>en-us</language>
    <copyright>Benoît Laut</copyright>
    <lastBuildDate>Fri, 23 Dec 2011 10:37:38 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>benoit.laut@bewise.fr</managingEditor>
    <webMaster>benoit.laut@bewise.fr</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BenoitLaut" /><feedburner:info uri="benoitlaut" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=43ca7767-ef9d-4d5c-87d0-7eb30fb8e2b5</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,43ca7767-ef9d-4d5c-87d0-7eb30fb8e2b5.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,43ca7767-ef9d-4d5c-87d0-7eb30fb8e2b5.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=43ca7767-ef9d-4d5c-87d0-7eb30fb8e2b5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Retour-aux-sources_A2AC/image_5.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Retour-aux-sources_A2AC/image_thumb_1.png" width="369" height="247" />
          </a>
        </p>
        <p>
Si vous aussi vous rechercher une solution pour effectuer des recherches dans les
fichiers de code source de TFS, <a href="http://labs.bewise.fr/Article/Indexer-les-sources-d-un-serveur-TFS/">voici
un article qui devrait vous intéresser</a>.
</p>
        <p>
Dans cet article, nous mettons en place une solution d’indexation des source TFS basée
sur la recherche Full Text de SQL Server et Team Build.
</p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=43ca7767-ef9d-4d5c-87d0-7eb30fb8e2b5" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/weqUWhI1Apk" height="1" width="1" /></body>
      <title>Retour aux Sources…</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,43ca7767-ef9d-4d5c-87d0-7eb30fb8e2b5.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/weqUWhI1Apk/RetourAuxSources.aspx</link>
      <pubDate>Fri, 23 Dec 2011 10:37:38 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Retour-aux-sources_A2AC/image_5.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Retour-aux-sources_A2AC/image_thumb_1.png" width="369" height="247"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Si vous aussi vous rechercher une solution pour effectuer des recherches dans les
fichiers de code source de TFS, &lt;a href="http://labs.bewise.fr/Article/Indexer-les-sources-d-un-serveur-TFS/"&gt;voici
un article qui devrait vous intéresser&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Dans cet article, nous mettons en place une solution d’indexation des source TFS basée
sur la recherche Full Text de SQL Server et Team Build.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=43ca7767-ef9d-4d5c-87d0-7eb30fb8e2b5" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,43ca7767-ef9d-4d5c-87d0-7eb30fb8e2b5.aspx</comments>
      <category>TFS</category>
    <feedburner:origLink>http://benoitlaut.net/2011/12/23/RetourAuxSources.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=1a9bec02-b7f0-4aa2-954f-7306404b6f02</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,1a9bec02-b7f0-4aa2-954f-7306404b6f02.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,1a9bec02-b7f0-4aa2-954f-7306404b6f02.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1a9bec02-b7f0-4aa2-954f-7306404b6f02</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Venez-dcouvrir-le-Kinect-SDK_ED57/image_2.png">
            <img style="background-image: none; border-right-width: 0px; margin: 0px 6px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Venez-dcouvrir-le-Kinect-SDK_ED57/image_thumb.png" width="238" height="244" />
          </a>Suite
à la sortie du Kinect Windows SDK, Microsoft France organise demain, mardi 28 juin,
un après midi du développement pour vous faire découvrir ce SDK. Alors si vous n’êtes
pas encore inscrits, dépêchez-vous, ça se passe par <a href="http://msdn.microsoft.com/fr-fr/gg416477">ici</a>.
</p>
        <p>
Je présenterai pour ma part le pilotage d’une scène 3D temps réel avec Kinect.
</p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=1a9bec02-b7f0-4aa2-954f-7306404b6f02" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/tfV-cZzQzr4" height="1" width="1" /></body>
      <title>Venez découvrir le Kinect SDK !</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,1a9bec02-b7f0-4aa2-954f-7306404b6f02.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/tfV-cZzQzr4/VenezD%c3%a9couvrirLeKinectSDK.aspx</link>
      <pubDate>Mon, 27 Jun 2011 15:02:28 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Venez-dcouvrir-le-Kinect-SDK_ED57/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 6px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Venez-dcouvrir-le-Kinect-SDK_ED57/image_thumb.png" width="238" height="244"&gt;&lt;/a&gt;Suite
à la sortie du Kinect Windows SDK, Microsoft France organise demain, mardi 28 juin,
un après midi du développement pour vous faire découvrir ce SDK. Alors si vous n’êtes
pas encore inscrits, dépêchez-vous, ça se passe par &lt;a href="http://msdn.microsoft.com/fr-fr/gg416477"&gt;ici&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Je présenterai pour ma part le pilotage d’une scène 3D temps réel avec Kinect.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=1a9bec02-b7f0-4aa2-954f-7306404b6f02" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,1a9bec02-b7f0-4aa2-954f-7306404b6f02.aspx</comments>
      <category>Kinect</category>
    <feedburner:origLink>http://benoitlaut.net/2011/06/27/VenezD%c3%a9couvrirLeKinectSDK.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=23c5ef73-8d16-49df-98ad-8fc74f37beda</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,23c5ef73-8d16-49df-98ad-8fc74f37beda.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,23c5ef73-8d16-49df-98ad-8fc74f37beda.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=23c5ef73-8d16-49df-98ad-8fc74f37beda</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
La problématique est dans le titre : comment peut-on lancer l’exécution d’une build
à partir d’une autre ? D’autre part, j’aimerai également que la build maitre, attende
la fin de l’exécution de la build enfant, et en fonction de son statut qu’elle s’arrête
ou continue.
</p>
        <p>
La première chose à faire est de développer une activité Workflow Foundation qui va
permettre de lancer l’exécution d’une build :
</p>
        <ul>
          <li>
Créer un nouveau projet de type Activity Library</li>
          <li>
Ajouter les références suivantes : Microsoft.TeamFoundation.Client, Microsoft.TeamFoundation.Build.Client</li>
          <li>
Ajouter une Code Activity. Voici le code de notre activité :</li>
        </ul>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>[BuildActivity(HostEnvironmentOption.All)]</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">sealed</span>
            <span class="kwrd">class</span> QueueDemoDefinitionBuildActivity
: CodeActivity</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>{</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> TfsCollectionUri
= <span class="str">"http://localhost:8080/tfs/defaultcollection"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> BuildDefinitionName
= <span class="str">"DemoDefinition"</span>;</pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> TeamProjectName
= <span class="str">"Demo"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> </pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="kwrd">public</span> OutArgument&lt;IQueuedBuild&gt;
Build { get; set; }</pre>
          <pre class="alt">
            <span class="lnum"> 9: </span> </pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="kwrd">protected</span>
            <span class="kwrd">override</span>
            <span class="kwrd">void</span> Execute(CodeActivityContext
context)</pre>
          <pre class="alt">
            <span class="lnum"> 11: </span> {</pre>
          <pre>
            <span class="lnum"> 12: </span> var
collection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(<span class="kwrd">new</span> Uri(TfsCollectionUri));</pre>
          <pre class="alt">
            <span class="lnum"> 13: </span> collection.EnsureAuthenticated();</pre>
          <pre>
            <span class="lnum"> 14: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 15: </span> IBuildServer
buildServer = (IBuildServer)collection.GetService(<span class="kwrd">typeof</span>(IBuildServer));</pre>
          <pre>
            <span class="lnum"> 16: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 17: </span> </pre>
          <pre>
            <span class="lnum"> 18: </span> var
buildDefinition = buildServer.GetBuildDefinition(TeamProjectName, BuildDefinitionName);</pre>
          <pre class="alt">
            <span class="lnum"> 19: </span> </pre>
          <pre>
            <span class="lnum"> 20: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 21: </span> var
buildRequest = buildDefinition.CreateBuildRequest();</pre>
          <pre>
            <span class="lnum"> 22: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 23: </span> var
queuedBuild = buildServer.QueueBuild(buildRequest);</pre>
          <pre>
            <span class="lnum"> 24: </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 25: </span> Build.Set(context,
queuedBuild);</pre>
          <pre>
            <span class="lnum"> 26: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 27: </span>}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
 
</p>
        <p>
Le principe est simple :
</p>
        <ul>
          <li>
On récupère le service de build depuis la collection de projets. 
</li>
          <li>
On récupère ensuite la définition de la build. 
</li>
          <li>
Et enfin on met en file la build via la méthode QueueBuild.</li>
        </ul>
        <p>
Dans notre activité, on remarque le paramètre de sortie Build de type IQueuedBuild
que l’on “set” à la fin de l’activité. Nous verrons par la suite à quoi il va servir.
</p>
        <p>
Il ne reste plus qu’à compiler, à déployer notre assembly dans le source control et
enfin d’indiquer au contrôleur de Build où se trouvent notre custom assembly.
</p>
        <p>
Pour illustrer cet exemple, j’ai créé un nouveau template de build xaml dans lequel
je fais simplement appel à ma nouvelle activité comme ceci :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb.png" width="501" height="133" />
          </a>
        </p>
        <p>
Pour récupérer le paramètre de sortie de cette activité, il nous faut déclarer une
variable au niveau de la séquence :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_4.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_1.png" width="634" height="162" />
          </a>
        </p>
        <p>
Ensuite dans les propriétés de l’activité QueueDemoDefinitionBuildActivity on récupére
le paramètre de sortie dans notre variable :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_6.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_2.png" width="422" height="187" />
          </a>
        </p>
        <p>
Comme je le disais au début de mon post, je veux que ma build maitre attende le résultat
de la build enfant. 
</p>
        <p>
Nous avons donc besoin d’une boucle While. Sa condition de sortie est que le statut
de la build est soit annulé soit terminé :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_8.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_3.png" width="471" height="218" />
          </a>
        </p>
        <p>
Dans le Body de cette boucle nous allons ajouter une activité de type Delay, de manière
à attendre quelques secondes (ou minutes) avant de revérifier le statut. Nous avons
également besoin d’appeler la méthode Refresh sur notre objet IQueuedBuild. En effet
les propriétés de notre variable ne se mette pas automatiquement à jour. Un appel
à la méthode Refresh est donc nécessaire.
</p>
        <p>
Les 2 activités dont nous avons besoin sont présentes dans la toolbox à cette endroit
:
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_10.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_4.png" width="363" height="161" />
          </a>
        </p>
        <p>
Dans l’activité While, on ajoute une activité de type séquence, puis on ajoute les
activités Delay et InvokeMethod comme ceci :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_12.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_5.png" width="278" height="362" />
          </a>
        </p>
        <p>
On paramètre l’activité Delay :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_32.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_15.png" width="494" height="157" />
          </a>
        </p>
        <p>
Pour l’activité InvokeMethod, il faut indiquer l’objet sur lequel la méthode doit
être appelée, en l’occurrence QueuedBuild et le nom de la méthode, Refresh. La méthode
Refresh prend en paramètre d’entrée une valeur de l’énumération QueryOptions. Dans
les propriétés de l’activité InvoMethod, il est possible de renseigner les paramètres
d’entrée et de sortie :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_14.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_6.png" width="642" height="396" />
          </a>
        </p>
        <p>
Une fois que l’on sort de la boucle, cela signifie que la build est terminée. Mais
la propriété Status de l’objet QueuedBuild ne nous dis pas si la build est dans l’état
Fail ou Success. Pour celà il faut accéder à la propriété suivante : QueuedBuild.Build.Status.
Mais encore une fois il faut appeler la méthode Refresh sur la propriété Build :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_16.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_7.png" width="273" height="174" />
          </a>
        </p>
        <p>
Et maintenant, on met à jour le statut de la build maitre en fonction du résultat
de la build enfant à l’aide d’une activité SetBuildProperties,
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_18.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_8.png" width="253" height="59" />
          </a>
        </p>
        <p>
que l’on paramètre de cette manière :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_20.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_9.png" width="437" height="389" />
          </a>
        </p>
        <p>
Une fois notre workflow de build terminé, on crée une définition de build basée sur
ce template :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_22.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_10.png" width="421" height="237" />
          </a>
        </p>
        <p>
Avant de lancer l’exécution de la build, il faut vérifier que le service de build
à la possibilité d’exécuter plusieurs build simultanément. Si ce n’est pas le cas,
lorsque la build maitre va lancer l’exécution de la build enfant, la build enfant
va attendre que la première soit terminée pour s’exécuter. Et la première va attendre
que la build enfant soit terminée aussi… Donc pour vérifier ça, ouvrir la console
d’administration de TFS sur le serveur de Build et vérifier la concurrence des builds
au niveau des propriétés du contrôleur :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_24.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_11.png" width="460" height="464" />
          </a>
        </p>
        <p>
On peut maintenant tester et lancer la Master Build. Si on regarde le log d’exécution,
on peut voir notre boucle d’attente pendant que l’autre build s’exécute :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_26.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_12.png" width="381" height="521" />
          </a>
        </p>
        <p>
Depuis la liste des builds en cours d’exécution on aperçoit nos 2 builds :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_28.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_13.png" width="537" height="228" />
          </a>
        </p>
        <p>
Et enfin au niveau des résultats, si la build enfant échoue alors la master échoue
également :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_30.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_14.png" width="537" height="237" />
          </a>
        </p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=23c5ef73-8d16-49df-98ad-8fc74f37beda" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/8RH2TjbaD7o" height="1" width="1" /></body>
      <title>Lancer l’exécution d’une build TFS depuis une autre build</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,23c5ef73-8d16-49df-98ad-8fc74f37beda.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/8RH2TjbaD7o/LancerLex%c3%a9cutionDuneBuildTFSDepuisUneAutreBuild.aspx</link>
      <pubDate>Fri, 11 Mar 2011 16:19:34 GMT</pubDate>
      <description>&lt;p&gt;
La problématique est dans le titre : comment peut-on lancer l’exécution d’une build
à partir d’une autre ? D’autre part, j’aimerai également que la build maitre, attende
la fin de l’exécution de la build enfant, et en fonction de son statut qu’elle s’arrête
ou continue.
&lt;/p&gt;
&lt;p&gt;
La première chose à faire est de développer une activité Workflow Foundation qui va
permettre de lancer l’exécution d’une build :
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Créer un nouveau projet de type Activity Library&lt;/li&gt;
&lt;li&gt;
Ajouter les références suivantes : Microsoft.TeamFoundation.Client, Microsoft.TeamFoundation.Build.Client&lt;/li&gt;
&lt;li&gt;
Ajouter une Code Activity. Voici le code de notre activité :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;[BuildActivity(HostEnvironmentOption.All)]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; QueueDemoDefinitionBuildActivity
: CodeActivity&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TfsCollectionUri
= &lt;span class="str"&gt;"http://localhost:8080/tfs/defaultcollection"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; BuildDefinitionName
= &lt;span class="str"&gt;"DemoDefinition"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TeamProjectName
= &lt;span class="str"&gt;"Demo"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; OutArgument&amp;lt;IQueuedBuild&amp;gt;
Build { get; set; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute(CodeActivityContext
context)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; var
collection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(TfsCollectionUri));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; collection.EnsureAuthenticated();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; IBuildServer
buildServer = (IBuildServer)collection.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(IBuildServer));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; var
buildDefinition = buildServer.GetBuildDefinition(TeamProjectName, BuildDefinitionName);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; var
buildRequest = buildDefinition.CreateBuildRequest();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; var
queuedBuild = buildServer.QueueBuild(buildRequest);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt; Build.Set(context,
queuedBuild);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Le principe est simple :
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
On récupère le service de build depuis la collection de projets. 
&lt;/li&gt;
&lt;li&gt;
On récupère ensuite la définition de la build. 
&lt;/li&gt;
&lt;li&gt;
Et enfin on met en file la build via la méthode QueueBuild.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Dans notre activité, on remarque le paramètre de sortie Build de type IQueuedBuild
que l’on “set” à la fin de l’activité. Nous verrons par la suite à quoi il va servir.
&lt;/p&gt;
&lt;p&gt;
Il ne reste plus qu’à compiler, à déployer notre assembly dans le source control et
enfin d’indiquer au contrôleur de Build où se trouvent notre custom assembly.
&lt;/p&gt;
&lt;p&gt;
Pour illustrer cet exemple, j’ai créé un nouveau template de build xaml dans lequel
je fais simplement appel à ma nouvelle activité comme ceci :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb.png" width="501" height="133"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Pour récupérer le paramètre de sortie de cette activité, il nous faut déclarer une
variable au niveau de la séquence :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_1.png" width="634" height="162"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Ensuite dans les propriétés de l’activité QueueDemoDefinitionBuildActivity on récupére
le paramètre de sortie dans notre variable :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_2.png" width="422" height="187"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Comme je le disais au début de mon post, je veux que ma build maitre attende le résultat
de la build enfant. 
&lt;/p&gt;
&lt;p&gt;
Nous avons donc besoin d’une boucle While. Sa condition de sortie est que le statut
de la build est soit annulé soit terminé :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_3.png" width="471" height="218"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Dans le Body de cette boucle nous allons ajouter une activité de type Delay, de manière
à attendre quelques secondes (ou minutes) avant de revérifier le statut. Nous avons
également besoin d’appeler la méthode Refresh sur notre objet IQueuedBuild. En effet
les propriétés de notre variable ne se mette pas automatiquement à jour. Un appel
à la méthode Refresh est donc nécessaire.
&lt;/p&gt;
&lt;p&gt;
Les 2 activités dont nous avons besoin sont présentes dans la toolbox à cette endroit
:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_10.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_4.png" width="363" height="161"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Dans l’activité While, on ajoute une activité de type séquence, puis on ajoute les
activités Delay et InvokeMethod comme ceci :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_12.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_5.png" width="278" height="362"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
On paramètre l’activité Delay :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_32.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_15.png" width="494" height="157"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Pour l’activité InvokeMethod, il faut indiquer l’objet sur lequel la méthode doit
être appelée, en l’occurrence QueuedBuild et le nom de la méthode, Refresh. La méthode
Refresh prend en paramètre d’entrée une valeur de l’énumération QueryOptions. Dans
les propriétés de l’activité InvoMethod, il est possible de renseigner les paramètres
d’entrée et de sortie :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_14.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_6.png" width="642" height="396"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Une fois que l’on sort de la boucle, cela signifie que la build est terminée. Mais
la propriété Status de l’objet QueuedBuild ne nous dis pas si la build est dans l’état
Fail ou Success. Pour celà il faut accéder à la propriété suivante : QueuedBuild.Build.Status.
Mais encore une fois il faut appeler la méthode Refresh sur la propriété Build :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_16.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_7.png" width="273" height="174"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Et maintenant, on met à jour le statut de la build maitre en fonction du résultat
de la build enfant à l’aide d’une activité SetBuildProperties,
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_18.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_8.png" width="253" height="59"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
que l’on paramètre de cette manière :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_20.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_9.png" width="437" height="389"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Une fois notre workflow de build terminé, on crée une définition de build basée sur
ce template :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_22.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_10.png" width="421" height="237"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Avant de lancer l’exécution de la build, il faut vérifier que le service de build
à la possibilité d’exécuter plusieurs build simultanément. Si ce n’est pas le cas,
lorsque la build maitre va lancer l’exécution de la build enfant, la build enfant
va attendre que la première soit terminée pour s’exécuter. Et la première va attendre
que la build enfant soit terminée aussi… Donc pour vérifier ça, ouvrir la console
d’administration de TFS sur le serveur de Build et vérifier la concurrence des builds
au niveau des propriétés du contrôleur :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_24.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_11.png" width="460" height="464"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
On peut maintenant tester et lancer la Master Build. Si on regarde le log d’exécution,
on peut voir notre boucle d’attente pendant que l’autre build s’exécute :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_26.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_12.png" width="381" height="521"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Depuis la liste des builds en cours d’exécution on aperçoit nos 2 builds :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_28.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_13.png" width="537" height="228"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Et enfin au niveau des résultats, si la build enfant échoue alors la master échoue
également :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_30.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Mettre-une-build-en-file-depuis-une-autr_E542/image_thumb_14.png" width="537" height="237"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=23c5ef73-8d16-49df-98ad-8fc74f37beda" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,23c5ef73-8d16-49df-98ad-8fc74f37beda.aspx</comments>
      <category>TFS</category>
    <feedburner:origLink>http://benoitlaut.net/2011/03/11/LancerLex%c3%a9cutionDuneBuildTFSDepuisUneAutreBuild.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=fd3b832d-4f28-471c-aa02-7c27b6c6b05e</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,fd3b832d-4f28-471c-aa02-7c27b6c6b05e.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,fd3b832d-4f28-471c-aa02-7c27b6c6b05e.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=fd3b832d-4f28-471c-aa02-7c27b6c6b05e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Le millésime 2011 de la Bewise Day Conference est annoncé pour le 7 avril et se déroulera
au casino Barrière à Toulouse.
</p>
        <p>
Vous pouvez d’ores et déjà vous y inscrire depuis le site <a href="http://bdc2011.bewise.fr/?canal=blog">BDC2011</a> et
suivre l’évènement depuis <a href="http://www.facebook.com/#!/event.php?eid=204476262902486">sa
page facebook</a>.
</p>
        <p>
Cette année j’animerai une session sur Windows Azure et vous me retrouverez également
sur l’ATE Windows Azure.
</p>
        <p>
Une petite vidéo de teasing où comme souvent dans les vidéos de Bewise nous apercevons
notre ami Guillaume L. :
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:702cd8cf-fc6c-4215-a074-314f913ba427" class="wlWriterEditableSmartContent">
          <div id="854597b3-b926-44a5-a470-17b717c8c825" style="margin: 0px; padding: 0px; display: inline;">
            <div>
              <a href="http://www.youtube.com/watch?v=Jw3Fg9-LqMA&amp;feature=player_embedded" target="_new">
                <img src="http://benoitlaut.net/content/binary/Windows-Live-Writer/B_99CB/video00eea92dc7ce.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('854597b3-b926-44a5-a470-17b717c8c825'); downlevelDiv.innerHTML = &quot;&lt;div&gt;&lt;object width=\&quot;448\&quot; height=\&quot;252\&quot;&gt;&lt;param name=\&quot;movie\&quot; value=\&quot;http://www.youtube.com/v/Jw3Fg9-LqMA?hl=en&amp;hd=1\&quot;&gt;&lt;\/param&gt;&lt;embed src=\&quot;http://www.youtube.com/v/Jw3Fg9-LqMA?hl=en&amp;hd=1\&quot; type=\&quot;application/x-shockwave-flash\&quot; width=\&quot;448\&quot; height=\&quot;252\&quot;&gt;&lt;\/embed&gt;&lt;\/object&gt;&lt;\/div&gt;&quot;;" alt="" />
              </a>
            </div>
          </div>
        </div>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=fd3b832d-4f28-471c-aa02-7c27b6c6b05e" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/4JC-InWoptk" height="1" width="1" /></body>
      <title>BDC 2011 : Faites vos jeux!</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,fd3b832d-4f28-471c-aa02-7c27b6c6b05e.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/4JC-InWoptk/BDC2011FaitesVosJeux.aspx</link>
      <pubDate>Fri, 04 Mar 2011 09:16:00 GMT</pubDate>
      <description>&lt;p&gt;
Le millésime 2011 de la Bewise Day Conference est annoncé pour le 7 avril et se déroulera
au casino Barrière à Toulouse.
&lt;/p&gt;
&lt;p&gt;
Vous pouvez d’ores et déjà vous y inscrire depuis le site &lt;a href="http://bdc2011.bewise.fr/?canal=blog"&gt;BDC2011&lt;/a&gt; et
suivre l’évènement depuis &lt;a href="http://www.facebook.com/#!/event.php?eid=204476262902486"&gt;sa
page facebook&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Cette année j’animerai une session sur Windows Azure et vous me retrouverez également
sur l’ATE Windows Azure.
&lt;/p&gt;
&lt;p&gt;
Une petite vidéo de teasing où comme souvent dans les vidéos de Bewise nous apercevons
notre ami Guillaume L. :
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:702cd8cf-fc6c-4215-a074-314f913ba427" class="wlWriterEditableSmartContent"&gt;
&lt;div id="854597b3-b926-44a5-a470-17b717c8c825" style="margin: 0px; padding: 0px; display: inline;"&gt;
&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=Jw3Fg9-LqMA&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://benoitlaut.net/content/binary/Windows-Live-Writer/B_99CB/video00eea92dc7ce.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('854597b3-b926-44a5-a470-17b717c8c825'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/Jw3Fg9-LqMA?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/Jw3Fg9-LqMA?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=fd3b832d-4f28-471c-aa02-7c27b6c6b05e" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,fd3b832d-4f28-471c-aa02-7c27b6c6b05e.aspx</comments>
      <category>BDC 2011</category>
    <feedburner:origLink>http://benoitlaut.net/2011/03/04/BDC2011FaitesVosJeux.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=dd8c2a76-d551-40cc-812e-935031ca38d1</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,dd8c2a76-d551-40cc-812e-935031ca38d1.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,dd8c2a76-d551-40cc-812e-935031ca38d1.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=dd8c2a76-d551-40cc-812e-935031ca38d1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Avec l’un de mes collègues, nous avons récemment eu un débat autour de cette question,
que nous avons fini par élucider. Voici le contexte : nous avons une classe A et une
classe B, aucun héritage n’existe entre ces 2 classes, par contre nous redéfinissons
l’opérateur de cast explicite de cette manière :
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> B</pre>
          <pre>
            <span class="lnum"> 2: </span>{</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>}</pre>
          <pre>
            <span class="lnum"> 4: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> A</pre>
          <pre>
            <span class="lnum"> 6: </span>{</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">static</span>
            <span class="kwrd">explicit</span>
            <span class="kwrd">operator</span> B(A
a)</pre>
          <pre>
            <span class="lnum"> 8: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 9: </span>
            <span class="kwrd">return</span>
            <span class="kwrd">new</span> B();</pre>
          <pre>
            <span class="lnum"> 10: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 11: </span>}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <h1>
          <font color="#0000ff">
          </font>
        </h1>
        <p>
Une fois que nous avons défini ces 2 classes, il est tout à fait possible d’effectuer
un cast entre un objet A et un objet B :
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>A a = <span class="kwrd">new</span> A();</pre>
          <pre>
            <span class="lnum"> 2: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>B
b = (B)a;</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
 
</p>
        <p>
Maintenant que ce passe-t-il si on instancie une liste d’objets A et que l’on appelle
la méthode d’extension Cast&lt;T&gt; comme ceci :
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>var list = <span class="kwrd">new</span> List&lt;A&gt;()
{ <span class="kwrd">new</span> A(), <span class="kwrd">new</span> A() };</pre>
          <pre>
            <span class="lnum"> 2: </span>list.Cast&lt;B&gt;().ToList();</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
 
</p>
        <p>
Et bien à l’exécution, notre opérateur de cast explicite n’est pas appelé. Par contre
une exception InvalidCastException est levée. La première réponse que l’on m’a donné
était de dire que la méthode d’extension Cast&lt;T&gt; ne fait pas un cast… 
</p>
        <p>
Utilisons notre outil préféré (ou presque puisqu’il va bientôt devenir payant… ;))
Reflector. En reflectant la méthode Cast&lt;T&gt;, on peut voir qu’elle fait appel
à la classe CastIterator. Celle-ci est tout simplement un itérateur sur notre collection
qui dans la méthode MoveNext affecte à l’objet courant l’objet casté :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_2.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_thumb.png" width="336" height="101" />
          </a>
        </p>
        <p>
Donc oui la méthode Cast&lt;T&gt; fait un cast… d’après le code C#.  Car en fait,
plus précisément, elle fait une opération de type unbox.any, comme le montre le code
IL suivant :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_4.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_thumb_1.png" width="504" height="127" />
          </a>
        </p>
        <p>
C’est justement là qu’est notre problème. La classe CastIterator ne connait pas notre
type A et elle itère sur une liste de type IEnumerable. Donc pour la classe CastIterator,
nos objets sont de type System.Object. A cet endroit, un cast est effectué entre un
objet de type System.Object et un type TResult. Du coup il fait un unbox (équivalent
à l’opérateur castclass).
</p>
        <p>
Décompilons maintenant le code écrit au tout début de ce post, qui caste notre variable
de type A en type B :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_6.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_thumb_2.png" width="705" height="80" />
          </a>
        </p>
        <p>
Nous voyons bien que le compilateur a trouvé notre opérateur explicite et donc l’appelle
pour effectuer la conversion.
</p>
        <p>
Pour reproduire ce qu’il se passe au niveau du CastIterator, il suffit d’écrire ceci
:
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>A a = <span class="kwrd">new</span> A();</pre>
          <pre>
            <span class="lnum"> 2: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>
            <span class="kwrd">object</span> o
= a;</pre>
          <pre>
            <span class="lnum"> 4: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>B
b = (B)o;</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
Et ici, le compilateur fait appel à l’opérateur castclass et non à notre opérateur
de cast explicite :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_8.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_thumb_3.png" width="452" height="127" />
          </a>
        </p>
        <p>
Pour palier ce problème nous avons 2 solutions. La 1ère consiste à effectuer le cast
soit même dans un Select :
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>var list = <span class="kwrd">new</span> List&lt;A&gt;()
{ <span class="kwrd">new</span> A(), <span class="kwrd">new</span> A() };</pre>
          <pre>
            <span class="lnum"> 2: </span>var
result = list.Select(a =&gt; (B) a);</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
La seconde solution consiste a utiliser le mécanisme de Reflection pour retrouver
l’existence de l’opérateur. On peut ainsi définir la méthode d’extension suivante
:
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">static</span>
            <span class="kwrd">class</span> EnumarableExtensions</pre>
          <pre>
            <span class="lnum"> 2: </span>{</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">static</span> MethodInfo
GetMethod(Type toSearch, <span class="kwrd">string</span> methodName, Type returnType,
BindingFlags bindingFlags)</pre>
          <pre>
            <span class="lnum"> 4: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>
            <span class="kwrd">return</span> Array.Find(toSearch.GetMethods(bindingFlags), <span class="kwrd">delegate</span>(MethodInfo
inf) { <span class="kwrd">return</span> ((inf.Name == methodName) &amp;&amp; (inf.ReturnType
== returnType)); });</pre>
          <pre>
            <span class="lnum"> 6: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> </pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">static</span> IEnumerable&lt;T&gt;
DynamicCast&lt;T&gt;(<span class="kwrd">this</span> IEnumerable list)</pre>
          <pre class="alt">
            <span class="lnum"> 9: </span> {</pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="kwrd">foreach</span> (var
obj <span class="kwrd">in</span> list)</pre>
          <pre class="alt">
            <span class="lnum"> 11: </span> {</pre>
          <pre>
            <span class="lnum"> 12: </span> Type
ot = obj.GetType();</pre>
          <pre class="alt">
            <span class="lnum"> 13: </span> MethodInfo
meth = GetMethod(ot, <span class="str">"op_Implicit"</span>, <span class="kwrd">typeof</span>(T),
BindingFlags.Static | BindingFlags.Public);</pre>
          <pre>
            <span class="lnum"> 14: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 15: </span>
            <span class="kwrd">if</span> (meth
== <span class="kwrd">null</span>)</pre>
          <pre>
            <span class="lnum"> 16: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 17: </span> meth
= GetMethod(ot, <span class="str">"op_Explicit"</span>, <span class="kwrd">typeof</span>(T),
BindingFlags.Static | BindingFlags.Public);</pre>
          <pre>
            <span class="lnum"> 18: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 19: </span> </pre>
          <pre>
            <span class="lnum"> 20: </span>
            <span class="kwrd">if</span> (meth
== <span class="kwrd">null</span>)</pre>
          <pre class="alt">
            <span class="lnum"> 21: </span>
            <span class="kwrd">yield</span>
            <span class="kwrd">return</span> (T)obj;</pre>
          <pre>
            <span class="lnum"> 22: </span>
            <span class="kwrd">else</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 23: </span>
            <span class="kwrd">yield</span>
            <span class="kwrd">return</span> (T)meth.Invoke(<span class="kwrd">null</span>, <span class="kwrd">new</span>[]
{ obj });</pre>
          <pre>
            <span class="lnum"> 24: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 25: </span> </pre>
          <pre>
            <span class="lnum"> 26: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 27: </span>}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
Et notre appel se fait ainsi :
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>var list = <span class="kwrd">new</span> List&lt;A&gt;()
{ <span class="kwrd">new</span> A(), <span class="kwrd">new</span> A() };</pre>
          <pre>
            <span class="lnum"> 2: </span>var
result = list.DynamicCast&lt;B&gt;();</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
 
</p>
        <p>
Et voilà un mystère d’élucidé! :)
</p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=dd8c2a76-d551-40cc-812e-935031ca38d1" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/F0fbFDmNIxI" height="1" width="1" /></body>
      <title>Pourquoi la méthode d’extension Cast&lt;T&gt; me lève l’exception InvalidCastException ?</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,dd8c2a76-d551-40cc-812e-935031ca38d1.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/F0fbFDmNIxI/PourquoiLaM%c3%a9thodeDextensionCastMeL%c3%a8veLexceptionInvalidCastException.aspx</link>
      <pubDate>Fri, 04 Mar 2011 06:00:00 GMT</pubDate>
      <description>&lt;p&gt;
Avec l’un de mes collègues, nous avons récemment eu un débat autour de cette question,
que nous avons fini par élucider. Voici le contexte : nous avons une classe A et une
classe B, aucun héritage n’existe entre ces 2 classes, par contre nous redéfinissons
l’opérateur de cast explicite de cette manière :
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; B&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;}&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; A&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;explicit&lt;/span&gt; &lt;span class="kwrd"&gt;operator&lt;/span&gt; B(A
a)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt; {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; B();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;h1&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;
&lt;/h1&gt;
&lt;p&gt;
Une fois que nous avons défini ces 2 classes, il est tout à fait possible d’effectuer
un cast entre un objet A et un objet B :
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;A a = &lt;span class="kwrd"&gt;new&lt;/span&gt; A();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;B
b = (B)a;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Maintenant que ce passe-t-il si on instancie une liste d’objets A et que l’on appelle
la méthode d’extension Cast&amp;lt;T&amp;gt; comme ceci :
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;var list = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;A&amp;gt;()
{ &lt;span class="kwrd"&gt;new&lt;/span&gt; A(), &lt;span class="kwrd"&gt;new&lt;/span&gt; A() };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;list.Cast&amp;lt;B&amp;gt;().ToList();&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Et bien à l’exécution, notre opérateur de cast explicite n’est pas appelé. Par contre
une exception InvalidCastException est levée. La première réponse que l’on m’a donné
était de dire que la méthode d’extension Cast&amp;lt;T&amp;gt; ne fait pas un cast… 
&lt;/p&gt;
&lt;p&gt;
Utilisons notre outil préféré (ou presque puisqu’il va bientôt devenir payant… ;))
Reflector. En reflectant la méthode Cast&amp;lt;T&amp;gt;, on peut voir qu’elle fait appel
à la classe CastIterator. Celle-ci est tout simplement un itérateur sur notre collection
qui dans la méthode MoveNext affecte à l’objet courant l’objet casté :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_thumb.png" width="336" height="101"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Donc oui la méthode Cast&amp;lt;T&amp;gt; fait un cast… d’après le code C#.&amp;nbsp; Car en fait,
plus précisément, elle fait une opération de type unbox.any, comme le montre le code
IL suivant :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_thumb_1.png" width="504" height="127"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
C’est justement là qu’est notre problème. La classe CastIterator ne connait pas notre
type A et elle itère sur une liste de type IEnumerable. Donc pour la classe CastIterator,
nos objets sont de type System.Object. A cet endroit, un cast est effectué entre un
objet de type System.Object et un type TResult. Du coup il fait un unbox (équivalent
à l’opérateur castclass).
&lt;/p&gt;
&lt;p&gt;
Décompilons maintenant le code écrit au tout début de ce post, qui caste notre variable
de type A en type B :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_thumb_2.png" width="705" height="80"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Nous voyons bien que le compilateur a trouvé notre opérateur explicite et donc l’appelle
pour effectuer la conversion.
&lt;/p&gt;
&lt;p&gt;
Pour reproduire ce qu’il se passe au niveau du CastIterator, il suffit d’écrire ceci
:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;A a = &lt;span class="kwrd"&gt;new&lt;/span&gt; A();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;&lt;span class="kwrd"&gt;object&lt;/span&gt; o
= a;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;B
b = (B)o;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
Et ici, le compilateur fait appel à l’opérateur castclass et non à notre opérateur
de cast explicite :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Pourquoi-la-mthode-dextension-CastT-me-r_E21A/image_thumb_3.png" width="452" height="127"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Pour palier ce problème nous avons 2 solutions. La 1ère consiste à effectuer le cast
soit même dans un Select :
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;var list = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;A&amp;gt;()
{ &lt;span class="kwrd"&gt;new&lt;/span&gt; A(), &lt;span class="kwrd"&gt;new&lt;/span&gt; A() };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;var
result = list.Select(a =&amp;gt; (B) a);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
La seconde solution consiste a utiliser le mécanisme de Reflection pour retrouver
l’existence de l’opérateur. On peut ainsi définir la méthode d’extension suivante
:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; EnumarableExtensions&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; MethodInfo
GetMethod(Type toSearch, &lt;span class="kwrd"&gt;string&lt;/span&gt; methodName, Type returnType,
BindingFlags bindingFlags)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; Array.Find(toSearch.GetMethods(bindingFlags), &lt;span class="kwrd"&gt;delegate&lt;/span&gt;(MethodInfo
inf) { &lt;span class="kwrd"&gt;return&lt;/span&gt; ((inf.Name == methodName) &amp;amp;&amp;amp; (inf.ReturnType
== returnType)); });&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt;
DynamicCast&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; IEnumerable list)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var
obj &lt;span class="kwrd"&gt;in&lt;/span&gt; list)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; Type
ot = obj.GetType();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; MethodInfo
meth = GetMethod(ot, &lt;span class="str"&gt;"op_Implicit"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T),
BindingFlags.Static | BindingFlags.Public);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (meth
== &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt; meth
= GetMethod(ot, &lt;span class="str"&gt;"op_Explicit"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T),
BindingFlags.Static | BindingFlags.Public);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (meth
== &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; (T)obj;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; (T)meth.Invoke(&lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt;[]
{ obj });&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
Et notre appel se fait ainsi :
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;var list = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;A&amp;gt;()
{ &lt;span class="kwrd"&gt;new&lt;/span&gt; A(), &lt;span class="kwrd"&gt;new&lt;/span&gt; A() };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;var
result = list.DynamicCast&amp;lt;B&amp;gt;();&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Et voilà un mystère d’élucidé! :)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=dd8c2a76-d551-40cc-812e-935031ca38d1" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,dd8c2a76-d551-40cc-812e-935031ca38d1.aspx</comments>
      <category>C#</category>
    <feedburner:origLink>http://benoitlaut.net/2011/03/04/PourquoiLaM%c3%a9thodeDextensionCastMeL%c3%a8veLexceptionInvalidCastException.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=b1305f04-ec65-4e9a-93ad-806d5a251474</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,b1305f04-ec65-4e9a-93ad-806d5a251474.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,b1305f04-ec65-4e9a-93ad-806d5a251474.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b1305f04-ec65-4e9a-93ad-806d5a251474</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Entity-Framework-doit-il-faire-peur-aux-_9447/image_2.png">
            <img style="background-image: none; border-right-width: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Entity-Framework-doit-il-faire-peur-aux-_9447/image_thumb.png" width="107" height="97" />
          </a>Avec
Entity Framework, et les outils de mapping objets relationnels de manière générale,
les développeurs écrivent facilement des requêtes Linq To Entities sans savoir le
SQL qui est réellement exécuté côté serveur. 
</p>
        <p>
On perd la maitrise du SQL exécuté, et ceci peut faire peur à nos chers administrateurs
SQL. <a href="http://labs.bewise.fr/Article/Entity-Framework-doit-il-faire-peur-aux-DBA--/">Dans
cette article</a> je vous propose de comparer les plans d’exécution des requêtes générées
par Entity Framework et des requêtes que nous aurions écrit à la main.
</p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=b1305f04-ec65-4e9a-93ad-806d5a251474" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/-KXU_1XUM48" height="1" width="1" /></body>
      <title>Entity Framework doit-il faire peur aux DBA ?</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,b1305f04-ec65-4e9a-93ad-806d5a251474.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/-KXU_1XUM48/EntityFrameworkDoitilFairePeurAuxDBA.aspx</link>
      <pubDate>Thu, 03 Mar 2011 09:48:38 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Entity-Framework-doit-il-faire-peur-aux-_9447/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Entity-Framework-doit-il-faire-peur-aux-_9447/image_thumb.png" width="107" height="97"&gt;&lt;/a&gt;Avec
Entity Framework, et les outils de mapping objets relationnels de manière générale,
les développeurs écrivent facilement des requêtes Linq To Entities sans savoir le
SQL qui est réellement exécuté côté serveur. 
&lt;/p&gt;
&lt;p&gt;
On perd la maitrise du SQL exécuté, et ceci peut faire peur à nos chers administrateurs
SQL. &lt;a href="http://labs.bewise.fr/Article/Entity-Framework-doit-il-faire-peur-aux-DBA--/"&gt;Dans
cette article&lt;/a&gt; je vous propose de comparer les plans d’exécution des requêtes générées
par Entity Framework et des requêtes que nous aurions écrit à la main.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=b1305f04-ec65-4e9a-93ad-806d5a251474" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,b1305f04-ec65-4e9a-93ad-806d5a251474.aspx</comments>
      <category>Entity Framework 4.0</category>
      <category>SQL Server</category>
    <feedburner:origLink>http://benoitlaut.net/2011/03/03/EntityFrameworkDoitilFairePeurAuxDBA.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=d2f24038-ef27-4248-b7ae-14f15fdff474</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,d2f24038-ef27-4248-b7ae-14f15fdff474.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,d2f24038-ef27-4248-b7ae-14f15fdff474.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d2f24038-ef27-4248-b7ae-14f15fdff474</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://labs.bewise.fr/">
            <img style="background-image: none; border-right-width: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/91684b30053a_D2BD/image_3.png" width="333" height="110" />
          </a>
          <a href="http://labs.bewise.fr/">Labs</a> est
un site dédié aux technologies Microsoft dont le but est de partager nos connaissances
et notre passion. 
</p>
        <p>
Vous y retrouverez tous les articles, projets, KB, études de cas ainsi que les blogs
des consultants de Bewise.
</p>
        <p>
N’hésitez pas <a href="mailto:benoit.laut@bewise.fr?subject=Labs Feedback">à nous
envoyer vos retours</a>.
</p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=d2f24038-ef27-4248-b7ae-14f15fdff474" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/_srRV7Ofg_U" height="1" width="1" /></body>
      <title>Bewise lance le site Labs!!</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,d2f24038-ef27-4248-b7ae-14f15fdff474.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/_srRV7Ofg_U/BewiseLanceLeSiteLabs.aspx</link>
      <pubDate>Fri, 04 Feb 2011 08:00:00 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://labs.bewise.fr/"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 5px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/91684b30053a_D2BD/image_3.png" width="333" height="110"&gt;&lt;/a&gt;&lt;a href="http://labs.bewise.fr/"&gt;Labs&lt;/a&gt; est
un site dédié aux technologies Microsoft dont le but est de partager nos connaissances
et notre passion. 
&lt;/p&gt;
&lt;p&gt;
Vous y retrouverez tous les articles, projets, KB, études de cas ainsi que les blogs
des consultants de Bewise.
&lt;/p&gt;
&lt;p&gt;
N’hésitez pas &lt;a href="mailto:benoit.laut@bewise.fr?subject=Labs Feedback"&gt;à nous
envoyer vos retours&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=d2f24038-ef27-4248-b7ae-14f15fdff474" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,d2f24038-ef27-4248-b7ae-14f15fdff474.aspx</comments>
      <category>Bewise</category>
    <feedburner:origLink>http://benoitlaut.net/2011/02/04/BewiseLanceLeSiteLabs.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=c61c2283-f496-4493-93a6-d2ad42949afd</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,c61c2283-f496-4493-93a6-d2ad42949afd.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,c61c2283-f496-4493-93a6-d2ad42949afd.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c61c2283-f496-4493-93a6-d2ad42949afd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Le-1er-rendez-vous-de-lanneTechdays-2011_C658/Capture_2.jpg">
            <img style="background-image: none; border-right-width: 0px; margin: 0px 9px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Capture" border="0" alt="Capture" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Le-1er-rendez-vous-de-lanneTechdays-2011_C658/Capture_thumb.jpg" width="232" height="79" />
          </a> J-7
avant l’édition 2011 des Techdays. Je serai au rendez-vous et j’animerai avec <a href="http://alain-marty.blogspot.com/">Alain
Marty</a> la session <a href="http://www.microsoft.com/france/mstechdays/programmes/Session.aspx?CellID=83d4c071-e792-4616-813e-033fb711de95&amp;DomID=2b8b5257-75a5-4d07-9b2f-173740e7f56b">TFS
Basic</a> sur le parcours ALM.
</p>
        <p>
Vous pourrez également me croiser du côté des exposants et des partenaires Inner Circle
et <a href="http://azure.bewise.fr/">Azure Circle</a> toute la journée du 8 février.
</p>
        <p>
Pour retrouver tous les speakers Bewise c’est pas <a href="http://www.bewise.fr/actualite/117/Bewise-aux-TechDay-s.aspx">là</a>.
</p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=c61c2283-f496-4493-93a6-d2ad42949afd" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/lohhgk6SPoQ" height="1" width="1" /></body>
      <title>1er rendez-vous de l’année : Techdays 2011</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,c61c2283-f496-4493-93a6-d2ad42949afd.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/lohhgk6SPoQ/1erRendezvousDeLann%c3%a9eTechdays2011.aspx</link>
      <pubDate>Tue, 01 Feb 2011 13:20:45 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Le-1er-rendez-vous-de-lanneTechdays-2011_C658/Capture_2.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 9px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Capture" border="0" alt="Capture" align="left" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Le-1er-rendez-vous-de-lanneTechdays-2011_C658/Capture_thumb.jpg" width="232" height="79"&gt;&lt;/a&gt; J-7
avant l’édition 2011 des Techdays. Je serai au rendez-vous et j’animerai avec &lt;a href="http://alain-marty.blogspot.com/"&gt;Alain
Marty&lt;/a&gt; la session &lt;a href="http://www.microsoft.com/france/mstechdays/programmes/Session.aspx?CellID=83d4c071-e792-4616-813e-033fb711de95&amp;amp;DomID=2b8b5257-75a5-4d07-9b2f-173740e7f56b"&gt;TFS
Basic&lt;/a&gt; sur le parcours ALM.
&lt;/p&gt;
&lt;p&gt;
Vous pourrez également me croiser du côté des exposants et des partenaires Inner Circle
et &lt;a href="http://azure.bewise.fr/"&gt;Azure Circle&lt;/a&gt; toute la journée du 8 février.
&lt;/p&gt;
&lt;p&gt;
Pour retrouver tous les speakers Bewise c’est pas &lt;a href="http://www.bewise.fr/actualite/117/Bewise-aux-TechDay-s.aspx"&gt;là&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=c61c2283-f496-4493-93a6-d2ad42949afd" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,c61c2283-f496-4493-93a6-d2ad42949afd.aspx</comments>
      <category>Techdays 2011</category>
    <feedburner:origLink>http://benoitlaut.net/2011/02/01/1erRendezvousDeLann%c3%a9eTechdays2011.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=538b5ba2-d9ec-44e4-b955-4cce26312541</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,538b5ba2-d9ec-44e4-b955-4cce26312541.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,538b5ba2-d9ec-44e4-b955-4cce26312541.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=538b5ba2-d9ec-44e4-b955-4cce26312541</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Depuis bientôt 3 mois que Kinect est sorti, on peut voir sur le web beaucoup d’initiatives
de R&amp;D utilisant ce périphérique. <a href="http://www.vertice.fr/">Vertice</a>,
la petite soeur de Bewise a elle aussi investit un peu de son temps sur Kinect. Il
est maintenant possible de se déplacer dans une scène 3D temps réel Nova grâce à Kinect.
Ajoutez à ça l’écran et les lunettes 3D... :) 
</p>
        <p>
Un petit aperçu ci-dessous :
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:3a24d8ac-55aa-4344-9933-3e7b647dac6d" class="wlWriterEditableSmartContent">
          <div id="b393bd3d-7a76-49f4-a07c-2c57a2ce514b" style="margin: 0px; padding: 0px; display: inline;">
            <div>
              <a href="http://www.youtube.com/watch?v=82ieg_xABzs" target="_new">
                <img src="http://benoitlaut.net/content/binary/Windows-Live-Writer/89d80b31a87c_A68D/video479a8d0bd762.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('b393bd3d-7a76-49f4-a07c-2c57a2ce514b'); downlevelDiv.innerHTML = &quot;&lt;div&gt;&lt;object width=\&quot;540\&quot; height=\&quot;302\&quot;&gt;&lt;param name=\&quot;movie\&quot; value=\&quot;http://www.youtube.com/v/82ieg_xABzs?hl=en&amp;hd=1\&quot;&gt;&lt;\/param&gt;&lt;embed src=\&quot;http://www.youtube.com/v/82ieg_xABzs?hl=en&amp;hd=1\&quot; type=\&quot;application/x-shockwave-flash\&quot; width=\&quot;540\&quot; height=\&quot;302\&quot;&gt;&lt;\/embed&gt;&lt;\/object&gt;&lt;\/div&gt;&quot;;" alt="" />
              </a>
            </div>
          </div>
        </div>
        <p>
 
</p>
        <p>
Vertice présentera cette nouveauté au salon <a href="http://www.imagina.mc/2011/content/Accueil/accueilFR.php">Imagina
2011</a> qui se déroulera du 1er au 3 février prochain. Retrouvez également toute
l’actualité Vertice sur <a href="http://blog.vertice.fr/">son blog</a>.
</p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=538b5ba2-d9ec-44e4-b955-4cce26312541" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/f9Rkx7ft9gY" height="1" width="1" /></body>
      <title>Kinect a débarqué à Bewise</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,538b5ba2-d9ec-44e4-b955-4cce26312541.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/f9Rkx7ft9gY/KinectAD%c3%a9barqu%c3%a9%c3%80Bewise.aspx</link>
      <pubDate>Thu, 27 Jan 2011 11:10:54 GMT</pubDate>
      <description>&lt;p&gt;
Depuis bientôt 3 mois que Kinect est sorti, on peut voir sur le web beaucoup d’initiatives
de R&amp;amp;D utilisant ce périphérique. &lt;a href="http://www.vertice.fr/"&gt;Vertice&lt;/a&gt;,
la petite soeur de Bewise a elle aussi investit un peu de son temps sur Kinect. Il
est maintenant possible de se déplacer dans une scène 3D temps réel Nova grâce à Kinect.
Ajoutez à ça l’écran et les lunettes 3D... :) 
&lt;/p&gt;
&lt;p&gt;
Un petit aperçu ci-dessous :
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:3a24d8ac-55aa-4344-9933-3e7b647dac6d" class="wlWriterEditableSmartContent"&gt;
&lt;div id="b393bd3d-7a76-49f4-a07c-2c57a2ce514b" style="margin: 0px; padding: 0px; display: inline;"&gt;
&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=82ieg_xABzs" target="_new"&gt;&lt;img src="http://benoitlaut.net/content/binary/Windows-Live-Writer/89d80b31a87c_A68D/video479a8d0bd762.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('b393bd3d-7a76-49f4-a07c-2c57a2ce514b'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;540\&amp;quot; height=\&amp;quot;302\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/82ieg_xABzs?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/82ieg_xABzs?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;540\&amp;quot; height=\&amp;quot;302\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Vertice présentera cette nouveauté au salon &lt;a href="http://www.imagina.mc/2011/content/Accueil/accueilFR.php"&gt;Imagina
2011&lt;/a&gt; qui se déroulera du 1er au 3 février prochain. Retrouvez également toute
l’actualité Vertice sur &lt;a href="http://blog.vertice.fr/"&gt;son blog&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=538b5ba2-d9ec-44e4-b955-4cce26312541" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,538b5ba2-d9ec-44e4-b955-4cce26312541.aspx</comments>
      <category>Kinect</category>
    <feedburner:origLink>http://benoitlaut.net/2011/01/27/KinectAD%c3%a9barqu%c3%a9%c3%80Bewise.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=168c6db9-dfa3-4b1e-901d-b36207c076e1</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,168c6db9-dfa3-4b1e-901d-b36207c076e1.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,168c6db9-dfa3-4b1e-901d-b36207c076e1.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=168c6db9-dfa3-4b1e-901d-b36207c076e1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
L’accès au bureau distant d’une instance Azure est une autre nouveauté de la plateforme.
L’activation peut se configurer depuis Visual Studio au moment du déploiement ou depuis
le portail Azure.
</p>
        <p>
Depuis Visual Studio, lorsque l’on déploie nos services Azure la fenêtre suivante
s’ouvre :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb.png" width="400" height="240" />
          </a>
        </p>
        <p>
Depuis ce wizard, il suffit de cliquer sur le lien “Configure Remote Desktop connections…”,
puis de renseigner le formulaire :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_4.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_1.png" width="372" height="369" />
          </a>
        </p>
        <p>
Le premier champ correspond au certificat qui va permettre de crypter le mot de passe.
On peut soit en choisir un dans la liste, soit en créer un. Il suffit ensuite de remplir
les informations de connexion. Une fois ce formulaire rempli, Visual Studio stocke
ces informations dans le fichier ServiceConfiguration.cscg de notre projet Azure :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_18.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_8.png" width="537" height="217" />
          </a>
        </p>
        <p>
Pour qu’Azure puisse de son côté décrypter le mot de passe, il faut déployer le certificat
sur notre “Hosted Service”.
</p>
        <p>
Dans un premier temps, nous allons exporter le certificat. Depuis le wizard de configuration
de l’accès distant, il suffit de cliquer sur le bouton View afin d’afficher le certificat
:
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_6.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_2.png" width="328" height="412" />
          </a>
        </p>
        <p>
Dans l’onglet Details, cliquer sur “Copy to File…” pour l’exporter.
</p>
        <p>
Au moment de l’export du certificat ne pas oublier de sélectionner l’option d’export
de la clé privé :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_8.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_3.png" width="369" height="332" />
          </a>
        </p>
        <p>
Une fois le certificat exporté, il ne reste plus qu’à se connecter au portail Azure,
accéder à notre Hosted Service, puis d’y télécharger le certificat :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_10.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_4.png" width="378" height="205" />
          </a>
        </p>
        <p>
Après avoir déployé nos rôles sur Azure, il est également possible d’activer/désactiver
et configurer le bureau distant depuis le portail pour chacun des rôles :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_14.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_6.png" width="487" height="221" />
          </a>
        </p>
        <p>
Lorsque nos instances sont démarrées, nous pouvons nous connecter en remote :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_16.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_7.png" width="484" height="220" />
          </a>
        </p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=168c6db9-dfa3-4b1e-901d-b36207c076e1" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/QtbNkneKk8o" height="1" width="1" /></body>
      <title>Activer l’accès au bureau distant pour Azure</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,168c6db9-dfa3-4b1e-901d-b36207c076e1.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/QtbNkneKk8o/ActiverLacc%c3%a8sAuBureauDistantPourAzure.aspx</link>
      <pubDate>Wed, 26 Jan 2011 12:03:00 GMT</pubDate>
      <description>&lt;p&gt;
L’accès au bureau distant d’une instance Azure est une autre nouveauté de la plateforme.
L’activation peut se configurer depuis Visual Studio au moment du déploiement ou depuis
le portail Azure.
&lt;/p&gt;
&lt;p&gt;
Depuis Visual Studio, lorsque l’on déploie nos services Azure la fenêtre suivante
s’ouvre :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb.png" width="400" height="240"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Depuis ce wizard, il suffit de cliquer sur le lien “Configure Remote Desktop connections…”,
puis de renseigner le formulaire :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_1.png" width="372" height="369"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Le premier champ correspond au certificat qui va permettre de crypter le mot de passe.
On peut soit en choisir un dans la liste, soit en créer un. Il suffit ensuite de remplir
les informations de connexion. Une fois ce formulaire rempli, Visual Studio stocke
ces informations dans le fichier ServiceConfiguration.cscg de notre projet Azure :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_18.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_8.png" width="537" height="217"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Pour qu’Azure puisse de son côté décrypter le mot de passe, il faut déployer le certificat
sur notre “Hosted Service”.
&lt;/p&gt;
&lt;p&gt;
Dans un premier temps, nous allons exporter le certificat. Depuis le wizard de configuration
de l’accès distant, il suffit de cliquer sur le bouton View afin d’afficher le certificat
:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_2.png" width="328" height="412"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Dans l’onglet Details, cliquer sur “Copy to File…” pour l’exporter.
&lt;/p&gt;
&lt;p&gt;
Au moment de l’export du certificat ne pas oublier de sélectionner l’option d’export
de la clé privé :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_3.png" width="369" height="332"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Une fois le certificat exporté, il ne reste plus qu’à se connecter au portail Azure,
accéder à notre Hosted Service, puis d’y télécharger le certificat :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_10.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_4.png" width="378" height="205"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Après avoir déployé nos rôles sur Azure, il est également possible d’activer/désactiver
et configurer le bureau distant depuis le portail pour chacun des rôles :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_14.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_6.png" width="487" height="221"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Lorsque nos instances sont démarrées, nous pouvons nous connecter en remote :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_16.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Activer-laccs-au-bureau-distant_C02D/image_thumb_7.png" width="484" height="220"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=168c6db9-dfa3-4b1e-901d-b36207c076e1" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,168c6db9-dfa3-4b1e-901d-b36207c076e1.aspx</comments>
      <category>Azure</category>
    <feedburner:origLink>http://benoitlaut.net/2011/01/26/ActiverLacc%c3%a8sAuBureauDistantPourAzure.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://benoitlaut.net/Trackback.aspx?guid=10372dca-0fac-4106-9f97-71c8b7e35748</trackback:ping>
      <pingback:server>http://benoitlaut.net/pingback.aspx</pingback:server>
      <pingback:target>http://benoitlaut.net/PermaLink,guid,10372dca-0fac-4106-9f97-71c8b7e35748.aspx</pingback:target>
      <dc:creator>Benoît Laut</dc:creator>
      <wfw:comment>http://benoitlaut.net/CommentView,guid,10372dca-0fac-4106-9f97-71c8b7e35748.aspx</wfw:comment>
      <wfw:commentRss>http://benoitlaut.net/SyndicationService.asmx/GetEntryCommentsRss?guid=10372dca-0fac-4106-9f97-71c8b7e35748</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Si vous avez suivi l’actualité d’Azure, vous avez pu voir que Microsoft avait annoncé
que les fonctionnalités d’IIS seraient disponible au niveau des Web Role. Nous pouvons
donc configurer notre Web Role afin d’y définir les sites, répertoires virtuels ou
encore les applications comme nous le souhaitons.
</p>
        <p>
A l’ajout d’un projet Azure à notre solution Visual Studio, nous allons choisir de
déployer un Web Role.
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/AddWebRole.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="AddWebRole" border="0" alt="AddWebRole" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/AddWebRole_thumb.png" width="569" height="357" />
          </a>
        </p>
        <p>
Nous allons ajouter 2 sites web supplémentaires à notre solution.
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/Solution.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Solution" border="0" alt="Solution" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/Solution_thumb.png" width="361" height="243" />
          </a>
        </p>
        <p>
Examinons maintenant le fichier ServiceDefinition.csdef de notre projet Azure :
</p>
        <div class="csharpcode">
          <pre class="code">
            <span style="color: blue">&lt;</span>
            <span style="color: #a31515">ServiceDefinition </span>
            <span style="color: red">name</span>
            <span style="color: blue">=</span>"<span style="color: blue">AzureProject</span>" <span style="color: red">xmlns</span><span style="color: blue">=</span>"<span style="color: blue">http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">WebRole </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">WebRoleSample</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Sites</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Site </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Web</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Bindings</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Binding </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint1</span>" <span style="color: red">endpointName</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint1</span>" <span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">Bindings</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">Site</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">Sites</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Endpoints</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">InputEndpoint </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint1</span>" <span style="color: red">protocol</span><span style="color: blue">=</span>"<span style="color: blue">http</span>" <span style="color: red">port</span><span style="color: blue">=</span>"<span style="color: blue">80</span>" <span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">Endpoints</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Imports</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Import </span><span style="color: red">moduleName</span><span style="color: blue">=</span>"<span style="color: blue">Diagnostics</span>" <span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">Imports</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">WebRole</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">ServiceDefinition</span><span style="color: blue">&gt; </span></pre>
        </div>
        <p>
          <font size="2" face="Consolas">
          </font> 
</p>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
Dans ce fichier, on peut voir la définition de notre Web Role. 
</p>
        <p>
Il contient un site nommé “Web” disponible en http sur le port 80. Nous pouvons observer
que l’élément xml Site possède comme élément parent “Sites”. Nous allons définir nos
autres sites de cette manière :
</p>
        <pre class="code">
          <span style="color: blue">&lt;</span>
          <span style="color: #a31515">ServiceDefinition </span>
          <span style="color: red">name</span>
          <span style="color: blue">=</span>"<span style="color: blue">AzureProject</span>" <span style="color: red">xmlns</span><span style="color: blue">=</span>"<span style="color: blue">http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">WebRole </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">WebRoleSample</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Sites</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Site </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Web</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">VirtualDirectory </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Images</span>" <span style="color: red">physicalDirectory</span><span style="color: blue">=</span>"<span style="color: blue">../PremierSiteWeb/Img</span>"<span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">VirtualDirectory</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Bindings</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Binding </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint1</span>" <span style="color: red">endpointName</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint1</span>" <span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">Bindings</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">Site</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Site </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">PremierSite</span>" <span style="color: red">physicalDirectory</span><span style="color: blue">=</span>"<span style="color: blue">../PremierSiteWeb</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">VirtualApplication </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">SecondSite</span>" <span style="color: red">physicalDirectory</span><span style="color: blue">=</span>"<span style="color: blue">../SecondSiteWeb</span>"<span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">VirtualApplication</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Bindings</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Binding </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint2</span>" <span style="color: red">endpointName</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint2</span>"<span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">Bindings</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">Site</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">Sites</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Endpoints</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">InputEndpoint </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint1</span>" <span style="color: red">protocol</span><span style="color: blue">=</span>"<span style="color: blue">http</span>" <span style="color: red">port</span><span style="color: blue">=</span>"<span style="color: blue">80</span>" <span style="color: blue">/&gt;
&lt;</span><span style="color: #a31515">InputEndpoint </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Endpoint2</span>" <span style="color: red">protocol</span><span style="color: blue">=</span>"<span style="color: blue">http</span>" <span style="color: red">port</span><span style="color: blue">=</span>"<span style="color: blue">81</span>" <span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">Endpoints</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Imports</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">Import </span><span style="color: red">moduleName</span><span style="color: blue">=</span>"<span style="color: blue">Diagnostics</span>" <span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">Imports</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">WebRole</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">ServiceDefinition</span><span style="color: blue">&gt; </span></pre>
        <p>
 
</p>
        <p>
Dans le premier, nous avons ajouté un répertoire virtuel “Images” qui pointe sur le
répertoire “../PremierSiteWeb/Img”. Nous avons ensuite déployé le site PremierSiteWeb
en http sur le port 81. Puis dans ce site, nous avons défini une application virtuelle
qui pointe sur le projet SecondSiteWeb. Lorsque nous déployons localement notre web
role (F5), 2 navigateurs s’ouvrent sur les 2 sites. Si nous ouvrons la console d’administration
d’IIS, nous retrouvons les 2 sites, le répertoire virtuel, ainsi que l’application
:
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/IIS.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IIS" border="0" alt="IIS" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/IIS_thumb.png" width="388" height="465" />
          </a>
        </p>
        <p>
Ici mon IIS local possède déjà un site sur le port 80. Pour le déploiement local,
Visual Studio a publié mes sites sur les ports 81 et 82.
</p>
        <p>
Après avoir déployé notre Web Role sur Azure, nous pouvons nous connecter en remote
desktop à notre VM Azure, accéder au serveur IIS et vérifier que nos 2 sites ont bien
été déployés :
</p>
        <p>
          <a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/image_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/image_thumb.png" width="338" height="472" />
          </a>
        </p>
        <img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=10372dca-0fac-4106-9f97-71c8b7e35748" />
      <xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/BenoitLaut/~4/79HpuWhlK8o" height="1" width="1" /></body>
      <title>Configurer plusieurs sites sur un même Web Role Azure</title>
      <guid isPermaLink="false">http://benoitlaut.net/PermaLink,guid,10372dca-0fac-4106-9f97-71c8b7e35748.aspx</guid>
      <link>http://feedproxy.google.com/~r/BenoitLaut/~3/79HpuWhlK8o/ConfigurerPlusieursSitesSurUnM%c3%aameWebRoleAzure.aspx</link>
      <pubDate>Sun, 23 Jan 2011 12:36:27 GMT</pubDate>
      <description>&lt;p&gt;
Si vous avez suivi l’actualité d’Azure, vous avez pu voir que Microsoft avait annoncé
que les fonctionnalités d’IIS seraient disponible au niveau des Web Role. Nous pouvons
donc configurer notre Web Role afin d’y définir les sites, répertoires virtuels ou
encore les applications comme nous le souhaitons.
&lt;/p&gt;
&lt;p&gt;
A l’ajout d’un projet Azure à notre solution Visual Studio, nous allons choisir de
déployer un Web Role.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/AddWebRole.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="AddWebRole" border="0" alt="AddWebRole" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/AddWebRole_thumb.png" width="569" height="357"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Nous allons ajouter 2 sites web supplémentaires à notre solution.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/Solution.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Solution" border="0" alt="Solution" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/Solution_thumb.png" width="361" height="243"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Examinons maintenant le fichier ServiceDefinition.csdef de notre projet Azure :
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceDefinition &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;AzureProject&lt;/span&gt;" &lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebRole &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;WebRoleSample&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sites&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Web&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;" &lt;span style="color: red"&gt;endpointName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sites&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Endpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InputEndpoint &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;" &lt;span style="color: red"&gt;protocol&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;http&lt;/span&gt;" &lt;span style="color: red"&gt;port&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;80&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Endpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Imports&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Import &lt;/span&gt;&lt;span style="color: red"&gt;moduleName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Diagnostics&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Imports&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebRole&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;font size="2" face="Consolas"&gt;&lt;/font&gt;&amp;nbsp;
&lt;/p&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
Dans ce fichier, on peut voir la définition de notre Web Role. 
&lt;/p&gt;
&lt;p&gt;
Il contient un site nommé “Web” disponible en http sur le port 80. Nous pouvons observer
que l’élément xml Site possède comme élément parent “Sites”. Nous allons définir nos
autres sites de cette manière :
&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceDefinition &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;AzureProject&lt;/span&gt;" &lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebRole &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;WebRoleSample&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sites&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Web&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;VirtualDirectory &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Images&lt;/span&gt;" &lt;span style="color: red"&gt;physicalDirectory&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;../PremierSiteWeb/Img&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;VirtualDirectory&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;" &lt;span style="color: red"&gt;endpointName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;PremierSite&lt;/span&gt;" &lt;span style="color: red"&gt;physicalDirectory&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;../PremierSiteWeb&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;VirtualApplication &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;SecondSite&lt;/span&gt;" &lt;span style="color: red"&gt;physicalDirectory&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;../SecondSiteWeb&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;VirtualApplication&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint2&lt;/span&gt;" &lt;span style="color: red"&gt;endpointName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint2&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sites&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Endpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InputEndpoint &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;" &lt;span style="color: red"&gt;protocol&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;http&lt;/span&gt;" &lt;span style="color: red"&gt;port&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;80&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InputEndpoint &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Endpoint2&lt;/span&gt;" &lt;span style="color: red"&gt;protocol&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;http&lt;/span&gt;" &lt;span style="color: red"&gt;port&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;81&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Endpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Imports&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Import &lt;/span&gt;&lt;span style="color: red"&gt;moduleName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Diagnostics&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Imports&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebRole&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Dans le premier, nous avons ajouté un répertoire virtuel “Images” qui pointe sur le
répertoire “../PremierSiteWeb/Img”. Nous avons ensuite déployé le site PremierSiteWeb
en http sur le port 81. Puis dans ce site, nous avons défini une application virtuelle
qui pointe sur le projet SecondSiteWeb. Lorsque nous déployons localement notre web
role (F5), 2 navigateurs s’ouvrent sur les 2 sites. Si nous ouvrons la console d’administration
d’IIS, nous retrouvons les 2 sites, le répertoire virtuel, ainsi que l’application
:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/IIS.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IIS" border="0" alt="IIS" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/IIS_thumb.png" width="388" height="465"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Ici mon IIS local possède déjà un site sur le port 80. Pour le déploiement local,
Visual Studio a publié mes sites sur les ports 81 et 82.
&lt;/p&gt;
&lt;p&gt;
Après avoir déployé notre Web Role sur Azure, nous pouvons nous connecter en remote
desktop à notre VM Azure, accéder au serveur IIS et vérifier que nos 2 sites ont bien
été déployés :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://benoitlaut.net/content/binary/Windows-Live-Writer/Dployer-plusieurs-sites_AA9F/image_thumb.png" width="338" height="472"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://benoitlaut.net/aggbug.ashx?id=10372dca-0fac-4106-9f97-71c8b7e35748" /&gt;</description>
      <comments>http://benoitlaut.net/CommentView,guid,10372dca-0fac-4106-9f97-71c8b7e35748.aspx</comments>
      <category>Azure</category>
    <feedburner:origLink>http://benoitlaut.net/2011/01/23/ConfigurerPlusieursSitesSurUnM%c3%aameWebRoleAzure.aspx</feedburner:origLink></item>
  </channel>
</rss>

