<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Matthieu MEZIL &#187; IL</title>
	<atom:link href="https://blog.developpez.com/matthieu/pcategory/net/il/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/matthieu</link>
	<description></description>
	<lastBuildDate>Fri, 14 Dec 2007 21:05:16 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Bien comprendre les bases de LINQ To Objects</title>
		<link>https://blog.developpez.com/matthieu/p4422/net/bien_comprendre_les_bases_de_linq_to_obj</link>
		<comments>https://blog.developpez.com/matthieu/p4422/net/bien_comprendre_les_bases_de_linq_to_obj#comments</comments>
		<pubDate>Mon, 22 Oct 2007 07:39:50 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Frédéric Mélantois vient de publier son article &#171;&#160;Bien comprendre les bases de LINQ To Objects&#160;&#187;]]></description>
				<content:encoded><![CDATA[<p><a href="http://blogs.codes-sources.com/tkfe/">Frédéric Mélantois</a> vient de publier son <a href="http://www.techheadbrothers.com/Articles.aspx/comprendre-bases-linq-to-objects">article &laquo;&nbsp;Bien comprendre les bases de LINQ To Objects&nbsp;&raquo;</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modification d&#8217;assemblage et injection de code C# / VB.NET à la volée</title>
		<link>https://blog.developpez.com/matthieu/p4236/net/title_71</link>
		<comments>https://blog.developpez.com/matthieu/p4236/net/title_71#comments</comments>
		<pubDate>Mon, 17 Sep 2007 07:23:07 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je vous avez parlé précédemment de Sébastien Lebreton et de son add-in pour reflector : Reflexil. Il vient de publier un article sur THB sur la modification d&#8217;assembly (désolé mais j&#8217;ai du mal avec assemblage) et l&#8217;injection de code C# / VB .NET à la volée.]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.developpez.com/index.php?blog=121&amp;title=reflexil_0_3&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">Je vous avez parlé précédemment de</a> <a href="http://sebastien.lebreton.free.fr/blog/">Sébastien Lebreton</a> <a href="http://blog.developpez.com/index.php?blog=121&amp;title=reflexil_0_3&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">et de son add-in pour reflector : Reflexil</a>.<br />
Il vient de publier <a href="http://techheadbrothers.com/Articles.aspx/modification-assemblage-injection-code-csharp-vb-net-volee">un article</a> sur <a href="http://techheadbrothers.com/">THB</a> sur <a href="http://techheadbrothers.com/Articles.aspx/modification-assemblage-injection-code-csharp-vb-net-volee">la modification d&rsquo;assembly (désolé mais j&rsquo;ai du mal avec assemblage) et l&rsquo;injection de code C# / VB .NET à la volée</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reflexil 0.3</title>
		<link>https://blog.developpez.com/matthieu/p4153/tools/reflexil_0_3</link>
		<comments>https://blog.developpez.com/matthieu/p4153/tools/reflexil_0_3#comments</comments>
		<pubDate>Thu, 30 Aug 2007 12:04:53 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je viens de découvrir via Fred via Gaël Covain Reflexil. Reflexil est un add-in reflector qui permet de créer ou de modifier le code IL des méthodes d&#8217;un assembly puis de sauvegarder les modifications. Sébastien lebreton (son développeur) a sorti la version 0.4 hier. Je viens de la récupérer et vous en direz plus après l&#8217;avoir un peu plus utilisée. Ma première impression est très positive.]]></description>
				<content:encoded><![CDATA[<p>Je viens de découvrir via Fred via <a href="http://blogs.developpeur.org/coq">Gaël Covain</a> Reflexil.<br />
Reflexil est un add-in reflector qui permet de créer ou de modifier le code IL des méthodes d&rsquo;un assembly puis de sauvegarder les modifications.<br />
<a href="http://sebastien.lebreton.free.fr/blog/index.php?/archives/13-Reflexil-v0.4.html">Sébastien lebreton</a> (son développeur) a sorti <a href="http://sebastien.lebreton.free.fr/blog/index.php?/archives/13-Reflexil-v0.4.html">la version 0.4</a> hier.<br />
Je viens de la récupérer et vous en direz plus après l&rsquo;avoir un peu plus utilisée. Ma première impression est très positive.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimisation de l&#8217;IL généré par le compilateur</title>
		<link>https://blog.developpez.com/matthieu/p4119/net/optimisation_de_l_il_genere_par_le_compi</link>
		<comments>https://blog.developpez.com/matthieu/p4119/net/optimisation_de_l_il_genere_par_le_compi#comments</comments>
		<pubDate>Thu, 23 Aug 2007 07:28:02 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans le cas d&#8217;une méthode (non statique) qui renvoit this, l&#8217;IL fait un pop même s&#8217;il a besoin de l&#8217;instance juste derrière : private static void Main(string[] args) { &#160; StringBuilder sb = new StringBuilder(); &#160; sb.Append(&#34;azerty&#34;); &#160; Console.WriteLine(sb); } donne l&#8217;IL suivant : .method private hidebysig static void Main(string[] args) cil managed { &#160; &#160; .entrypoint &#160; &#160; .maxstack 2 &#160; &#160; .locals init ( &#160; &#160; &#160; &#160; [0] class [mscorlib]System.Text.StringBuilder sb) &#160; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans le cas d&rsquo;une méthode (non statique) qui renvoit this, l&rsquo;IL fait un pop même s&rsquo;il a besoin de l&rsquo;instance juste derrière :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private static void Main(string[] args) <br />
{ <br />
&nbsp; StringBuilder sb = new StringBuilder(); <br />
&nbsp; sb.Append(&quot;azerty&quot;); <br />
&nbsp; Console.WriteLine(sb); <br />
}</div></div>
<p>donne l&rsquo;IL suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.method private hidebysig static void Main(string[] args) cil managed <br />
{ <br />
&nbsp; &nbsp; .entrypoint <br />
&nbsp; &nbsp; .maxstack 2 <br />
&nbsp; &nbsp; .locals init ( <br />
&nbsp; &nbsp; &nbsp; &nbsp; [0] class [mscorlib]System.Text.StringBuilder sb) <br />
&nbsp; &nbsp; L_0000: nop &nbsp;<br />
&nbsp; &nbsp; L_0001: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor() <br />
&nbsp; &nbsp; L_0006: stloc.0 &nbsp;<br />
&nbsp; &nbsp; L_0007: ldloc.0 &nbsp;<br />
&nbsp; &nbsp; L_0008: ldstr &quot;azerty&quot; <br />
&nbsp; &nbsp; L_000d: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string) <br />
&nbsp; &nbsp; L_0012: pop &nbsp;<br />
&nbsp; &nbsp; L_0013: ldloc.0 &nbsp;<br />
&nbsp; &nbsp; L_0014: call void [mscorlib]System.Console::WriteLine(object) <br />
&nbsp; &nbsp; L_0019: nop &nbsp;<br />
&nbsp; &nbsp; L_001a: ret &nbsp;<br />
}</div></div>
<p>alors qu&rsquo;il pourrait être optimisé comme suit :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.method private hidebysig static void Main(string[] args) cil managed <br />
{ <br />
&nbsp; &nbsp; .entrypoint <br />
&nbsp; &nbsp; .maxstack 2 <br />
&nbsp; &nbsp; L_0001: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor() <br />
&nbsp; &nbsp; L_0008: ldstr &quot;azerty&quot; <br />
&nbsp; &nbsp; L_000d: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string) <br />
&nbsp; &nbsp; L_0014: call void [mscorlib]System.Console::WriteLine(object) <br />
&nbsp; &nbsp; L_001a: ret &nbsp;<br />
}</div></div>
<p>Dans l&rsquo;exemple, il est dommage de décharger la pile de l&rsquo;instance de StringBuilder pour remettre la même.</p>
<p>Petite précision tout de même, contrairement à <a href="http://blog.developpez.com/index.php?blog=121&amp;title=l_il_genere_par_le_compilateur_optimisab&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">mon post précédent sur les optimisations du compilateur</a>, dans ce cas, le compilateur est <b>obligé</b> de faire cela. En effet, il faudrait sinon qu&rsquo;il teste toutes les méthodes qui retourne un objet du même type que l&rsquo;instance sur laquelle elles s&rsquo;appliquent pour s&rsquo;assurer que c&rsquo;est bien this qui est retourné. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;IL généré par le compilateur optimisable</title>
		<link>https://blog.developpez.com/matthieu/p4086/net/l_il_genere_par_le_compilateur_optimisab</link>
		<comments>https://blog.developpez.com/matthieu/p4086/net/l_il_genere_par_le_compilateur_optimisab#comments</comments>
		<pubDate>Tue, 14 Aug 2007 07:36:32 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IL]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[L&#8217;IL généré par le compilateur peut être réduit. Prenons un exemple tout simple : public static string Test(string s) { &#160; return s.ToUpper(); } L&#8217;IL généré par le compilateur est le suivant : .method public hidebysig static string Test(string s) cil managed { &#160; &#160; .maxstack 1 &#160; &#160; .locals init ( &#160; &#160; &#160; &#160; [0] string CS$1$0000) &#160; &#160; L_0000: nop &#160; &#160; &#160; L_0001: ldarg.0 &#160; &#160; &#160; L_0002: callvirt instance string [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>L&rsquo;IL généré par le compilateur peut être réduit.</p>
<p>Prenons un exemple tout simple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public static string Test(string s) <br />
{ <br />
&nbsp; return s.ToUpper(); <br />
}</div></div>
<p>L&rsquo;IL généré par le compilateur est le suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.method public hidebysig static string Test(string s) cil managed <br />
{ <br />
&nbsp; &nbsp; .maxstack 1 <br />
&nbsp; &nbsp; .locals init ( <br />
&nbsp; &nbsp; &nbsp; &nbsp; [0] string CS$1$0000) <br />
&nbsp; &nbsp; L_0000: nop &nbsp;<br />
&nbsp; &nbsp; L_0001: ldarg.0 &nbsp;<br />
&nbsp; &nbsp; L_0002: callvirt instance string [mscorlib]System.String::ToUpper() <br />
&nbsp; &nbsp; L_0007: stloc.0 &nbsp;<br />
&nbsp; &nbsp; L_0008: br.s L_000a <br />
&nbsp; &nbsp; L_000a: ldloc.0 &nbsp;<br />
&nbsp; &nbsp; L_000b: ret &nbsp;<br />
}</div></div>
<p>Sauf subtilité qui m&rsquo;aurait échappée, l&rsquo;IL suivant fait la même chose :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.method public hidebysig static string Test(string s) cil managed <br />
{ <br />
&nbsp; &nbsp; .maxstack 1 <br />
&nbsp; &nbsp; L_0001: ldarg.0 &nbsp;<br />
&nbsp; &nbsp; L_0002: callvirt instance string [mscorlib]System.String::ToUpper() <br />
&nbsp; &nbsp; L_000b: ret &nbsp;<br />
}</div></div>
<p>Prenons un autre exemple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public static void Test(string s1, string s2) <br />
{ <br />
&nbsp; if (s1 == null || s2 == null) <br />
&nbsp; &nbsp; throw new ArgumentNullException(); <br />
}</div></div>
<p>L&rsquo;IL généré est le suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.method public hidebysig static void Test(string s1, string s2) cil managed <br />
{ <br />
&nbsp; &nbsp; .maxstack 2 <br />
&nbsp; &nbsp; .locals init ( <br />
&nbsp; &nbsp; &nbsp; &nbsp; [0] bool CS$4$0000) <br />
&nbsp; &nbsp; L_0000: nop &nbsp;<br />
&nbsp; &nbsp; L_0001: ldarg.0 &nbsp;<br />
&nbsp; &nbsp; L_0002: brfalse.s L_000d <br />
&nbsp; &nbsp; L_0004: ldarg.1 &nbsp;<br />
&nbsp; &nbsp; L_0005: ldnull &nbsp;<br />
&nbsp; &nbsp; L_0006: ceq &nbsp;<br />
&nbsp; &nbsp; L_0008: ldc.i4.0 &nbsp;<br />
&nbsp; &nbsp; L_0009: ceq &nbsp;<br />
&nbsp; &nbsp; L_000b: br.s L_000e <br />
&nbsp; &nbsp; L_000d: ldc.i4.0 &nbsp;<br />
&nbsp; &nbsp; L_000e: stloc.0 &nbsp;<br />
&nbsp; &nbsp; L_000f: ldloc.0 &nbsp;<br />
&nbsp; &nbsp; L_0010: brtrue.s L_0018 <br />
&nbsp; &nbsp; L_0012: newobj instance void [mscorlib]System.ArgumentNullException::.ctor() <br />
&nbsp; &nbsp; L_0017: throw &nbsp;<br />
&nbsp; &nbsp; L_0018: ret &nbsp;<br />
}</div></div>
<p>alors qu&rsquo;on aurait pu simplifier par</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.method public hidebysig static void Test(string s1, string s2) cil managed <br />
{ <br />
&nbsp; &nbsp; .maxstack 1 <br />
&nbsp; &nbsp; L_0001: ldarg.0 &nbsp;<br />
&nbsp; &nbsp; L_0002: brfalse.s L_0012 <br />
&nbsp; &nbsp; L_0004: ldarg.1 &nbsp;<br />
&nbsp; &nbsp; L_0005: brtrue.s L_0018 <br />
&nbsp; &nbsp; L_0012: newobj instance void [mscorlib]System.ArgumentNullException::.ctor() <br />
&nbsp; &nbsp; L_0017: throw &nbsp;<br />
&nbsp; &nbsp; L_0018: ret &nbsp;<br />
}</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>internal ET protected</title>
		<link>https://blog.developpez.com/matthieu/p4092/net/internal_et_protected</link>
		<comments>https://blog.developpez.com/matthieu/p4092/net/internal_et_protected#comments</comments>
		<pubDate>Fri, 17 Aug 2007 07:44:22 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Quand une méthode est définie internal protected, c’est un OU qui est fait (idem pour protected internal). Par conséquent, cette méthode sera utilisable depuis une classe fille ou une classe de l’assembly. En C#, il n’y a pas de internal ET protected. Pourtant, cette possibilité existe au niveau de l’IL. En effet, quand on crée une méthode à la volée via MethodBuilder, on peut définir la méthode Private, FamANDAssem, Assembly (internal), Family (protected), FamORAssem ou [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Quand une méthode est définie internal protected, c’est un OU qui est fait (idem pour protected internal). Par conséquent, cette méthode sera utilisable depuis une classe fille ou une classe de l’assembly.<br />
En C#, il n’y a pas de internal ET protected. Pourtant, cette possibilité existe au niveau de l’IL.<br />
En effet, quand on crée une méthode à la volée via  MethodBuilder, on peut définir la méthode Private, <b>FamANDAssem</b>, Assembly (<i>internal</i>), Family (<i>protected</i>), FamORAssem ou Public.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>classe statique, une spécificité C#</title>
		<link>https://blog.developpez.com/matthieu/p4093/net/class_static_une_specificite_c</link>
		<comments>https://blog.developpez.com/matthieu/p4093/net/class_static_une_specificite_c#comments</comments>
		<pubDate>Fri, 17 Aug 2007 07:55:30 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IL]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;avais déjà remarqué que la notion de classe statique n&#8217;existait pas en VB. Aussi je ne suis pas surpris de voir que cette notion n&#8217;est exploitée que par le compilateur et n&#8217;existe pas non plus en IL. Pour l&#8217;IL, une classe statique est une classe abstraite. Il y a quand même une différence notable entre une classe statique et une classe abstraite dans l&#8217;IL. Dans le cas d&#8217;une classe abtraite, on a un constructeur par [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;avais déjà remarqué que la notion de classe statique n&rsquo;existait pas en VB.<br />
Aussi je ne suis pas surpris de voir que cette notion n&rsquo;est exploitée que par le compilateur et n&rsquo;existe pas non plus en IL. Pour l&rsquo;IL, une classe statique est une classe abstraite.<br />
Il y a quand même une différence notable entre une classe statique et une classe abstraite dans l&rsquo;IL.<br />
Dans le cas d&rsquo;une classe abtraite, on a un constructeur par défaut protected et un constructeur statique. Dans le cas d&rsquo;une classe statique, on n&rsquo;a que le constructeur statique.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
