<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jb in a nutshell: Category Cecil</title>
    <link>http://evain.net/blog/articles/category/cecil</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Cecil performance issues</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/2496833680/" title="Then it showed up by Jb Evain, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2032/2496833680_7d3b8086f5.jpg" width="500" height="333" alt="Then it showed up" style="border: 2px solid black" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;At the beginning, &lt;a href="http://mono-project.com/Cecil"&gt;Cecil&lt;/a&gt; was written to be an assembly manipulation library. The initial goal was to be able to read assemblies without loading them in an AppDomain, and also, to expose more that what .net 1.1 provided.&lt;/p&gt;


	&lt;p&gt;I implemented the writing parts of Cecil during my first Summer of Code, and barely touched it after, at it turns out it was working.&lt;/p&gt;


	&lt;p&gt;But this summer, two great hackers, &lt;a href="http://weblog.ikvm.net/"&gt;Jeroen, author or &lt;span class="caps"&gt;IKVM&lt;/span&gt;&lt;/a&gt;, and &lt;a href="http://rolfkvinge.blogspot.com"&gt;Rolf&lt;/a&gt;, our &lt;a href="http://www.mono-project.com/Language_BASIC"&gt;&lt;span class="caps"&gt;VB 8&lt;/span&gt; compiler&lt;/a&gt; author, decided that they gave enough blood and sweat to work around System.Reflection.Emit issues, and prototyped a version of their project based on Cecil instead.&lt;/p&gt;


	&lt;p&gt;If Rolf decided to go the full Cecil way, and replaced the usage of System.Reflection and System.Reflection.Emit (his &lt;a href="http://anonsvn.mono-project.com/source/branches/rolf/cecil-vbnc/"&gt;branch is available&lt;/a&gt;), Jeroen decided to write a layer on top of Cecil that mimics the System.Reflection.Emit &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Both wrote a sum-up about their findings, &lt;a href="http://weblog.ikvm.net/CommentView.aspx?guid=afda88af-e2cf-47d6-917b-5f3134b681c1"&gt;here for Jeroen&lt;/a&gt;, and &lt;a href="http://rolfkvinge.blogspot.com/2008/08/cecil-reloaded.html"&gt;there for Rolf&lt;/a&gt;. And both came to the conclusion that Cecil performs a lot less well that System.Reflection.Emit, both in terms of speed and memory consumption.&lt;/p&gt;


	&lt;p&gt;Rolf also uses the &lt;a href="http://anonsvn.mono-project.com/source/branches/cecil-delayed-loading/"&gt;delay loading branch&lt;/a&gt; of Cecil, created by &lt;a href="http://dev.mainsoft.com/"&gt;Mainsoft&lt;/a&gt; for their &lt;span class="caps"&gt;CIL&lt;/span&gt; to Java bytecode translator.&lt;/p&gt;


	&lt;p&gt;So the point is that Cecil uses too much memory, and is not fast enough in those scenarios, while it performs better in the reading only or reading + manipulating.&lt;/p&gt;


	&lt;p&gt;The good news is that, thanks to those hackers, we have now two amazing test cases to work on and to optimize. I&amp;#8217;ve also started a few weeks ago, as a night hack, a refactoring of Cecil, that removes the intermediate structures that the current version of Cecil uses to read and write assemblies. If that makes reading and writing a little bit more complicated, it should also save a lot of memory.&lt;/p&gt;


	&lt;p&gt;And who knows, maybe one day, when Cecil will be optimized properly, and that the &lt;span class="caps"&gt;SRE&lt;/span&gt; on top of Cecil layer will be sufficient, it will require only a couple of changes to base mcs on Cecil.&lt;/p&gt;


	&lt;p&gt;Anyway, kudos to those hackers, let see what I can do to catch up.&lt;/p&gt;


	&lt;p&gt;&lt;i&gt;We&amp;#8217;ll let you know!&lt;/i&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 02 Sep 2008 08:45:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:c0f4d289-1f2a-4182-a73a-cb4de4989768</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2008/09/02/cecil-performance-issues</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/504</trackback:ping>
    </item>
    <item>
      <title>Mono.Cecil vs System.Reflection</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/2311630873/" title="Mouvement by Jb Evain, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3126/2311630873_c3c40b732e.jpg" style="border : 2px solid black" width="500" height="333" alt="Mouvement" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;My friend &lt;a href="http://codebetter.com/blogs/patricksmacchia/"&gt;Patrick&lt;/a&gt;, who&amp;#8217;s leading the amazing &lt;a href="http://www.ndepend.com/"&gt;NDepend&lt;/a&gt; effort wrote &lt;a href="http://codebetter.com/blogs/patricksmacchia/archive/2008/03/18/mono-cecil-vs-system-reflection.aspx"&gt;a great post&lt;/a&gt; comparing &lt;a href="http://mono-project.com/Cecil"&gt;Cecil&lt;/a&gt; against the built-in &lt;a href="http://msdn2.microsoft.com/en-us/library/system.reflection.aspx"&gt;System.Reflection&lt;/a&gt;:&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://codebetter.com/blogs/patricksmacchia/archive/2008/03/18/mono-cecil-vs-system-reflection.aspx"&gt;Mono.Cecil vs System.Reflection&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Thanks Patrick for the kind words!&lt;/p&gt;</description>
      <pubDate>Tue, 18 Mar 2008 11:25:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:adeb1a23-118a-4db2-ae95-557678785137</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2008/03/18/mono-cecil-vs-system-reflection</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/478</trackback:ping>
    </item>
    <item>
      <title>Mono.Cecil 0.6</title>
      <description>&lt;p&gt;Yeah, time for a new release of &lt;a href="http://mono-project.com/Cecil"&gt;Mono.Cecil&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;New since 0.5:&lt;/p&gt;


&lt;ul&gt;
  &lt;li&gt;A lot of work to read obfuscated assemblies,&lt;/li&gt;
  &lt;li&gt;Some precious optimizations,&lt;/li&gt;
  &lt;li&gt;Improved the Mono.Cecil.Binary layer to read pure native PE binaries,&lt;/li&gt;
  &lt;li&gt;Ability to &lt;a href="http://evain.net/blog/articles/2007/06/12/annotating-objects"&gt;annotate Cecil&amp;#8217;s objects&lt;/a&gt;,&lt;/li&gt;
  &lt;li&gt;Of course fixed a handful of bugs,&lt;/li&gt;
  &lt;li&gt;Add a lot or helpers accessors to Cecil&amp;#8217;s type, like IsPublic, IsVirtual, Is*,&lt;/li&gt;
  &lt;li&gt;Preliminary support for debugging symbols (to be blogged about).&lt;/li&gt;
&lt;/ul&gt;

	&lt;p&gt;Where to download:&lt;/p&gt;


&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://go-mono.com/archive/cecil/cecil-0.6-src.tar.gz"&gt;Mono.Cecil 0.6 Sources (tar.gz)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://go-mono.com/archive/cecil/cecil-0.6-bin.tar.gz"&gt;Mono.Cecil 0.6 Binary (tar.gz)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://go-mono.com/archive/cecil/cecil-0.6-src.zip"&gt;Mono.Cecil 0.6 Sources (zip)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://go-mono.com/archive/cecil/cecil-0.6-bin.zip"&gt;Mono.Cecil 0.6 Binary (zip)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

	&lt;p&gt;Thanks to all the folks that contributed patches to this release!&lt;/p&gt;


	&lt;p&gt;Beloved users, please upgrade.&lt;/p&gt;</description>
      <pubDate>Fri, 05 Oct 2007 15:42:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:cf55ae54-01e8-4dbd-8ce9-f0df30cbc8e8</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2007/10/05/mono-cecil-0-6</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/460</trackback:ping>
    </item>
    <item>
      <title>Reflexil will rock your IL</title>
      <description>&lt;p&gt;&lt;a href="http://www.codeproject.com/dotnet/reflexil.asp"&gt;&lt;img src="http://evain.net/public/reflexil.png" style="border:0px"/&gt;&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;a href="http://sebastien.lebreton.free.fr/"&gt;SÃ©bastien Lebreton&lt;/a&gt;, friend and &lt;a href="http://reflexil.sourceforge.net"&gt;Reflexil&lt;/a&gt;&amp;#8217;s author published &lt;a href="http://www.codeproject.com/dotnet/reflexil.asp"&gt;a nifty article on codeproject&lt;/a&gt;, which explains to the mass how to look clever in society, by inserting wisely chosen opcodes in your methods.&lt;br /&gt;
&lt;br /&gt;
As a matter of fact, this article has first be written in French, and &lt;a href="http://www.techheadbrothers.com/Articles.aspx/modification-assemblage-injection-code-csharp-vb-net-volee"&gt;published on the TechHeadBrothers web site&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
What&amp;#8217;s really brilliant is that Reflexil uses &lt;a href="http://www.mono-project.com/Cecil"&gt;Mono.Cecil&lt;/a&gt; to perform the mutations of the assemblies you&amp;#8217;ll create.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 19 Sep 2007 19:16:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:9acf5b74-ce19-4444-accb-f88470fc3faa</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2007/09/19/reflexil-will-rock-your-il</link>
      <category>Cecil</category>
      <category>Personal</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/448</trackback:ping>
    </item>
    <item>
      <title>Clarification</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/529508207/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/231/529508207_3edaf42ecd.jpg" width="500" height="333" alt="Light" style="border: 2px solid black;"/&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;
Eight days ago, I&amp;#8217;ve &lt;a href="http://evain.net/blog/articles/2007/07/12/cecil-ildasm-and-the-security-update"&gt;blogged about an issue involving Cecil and ildasm&lt;/a&gt;. And the last security update to the .net framework.&lt;br /&gt;
&lt;br /&gt;
After a few hours of investigation, I&amp;#8217;ve managed to be able to reproduce the ildasm crash. It turns out that the security update is actually not involved in the issue. It&amp;#8217;s just that I stumbled upon right after the security update, and that I had not experienced it before.&lt;br /&gt;
&lt;br /&gt;
So, the ildasm crash happened when I was disassembling an assembly that I had just round-tripped. The issue is that in the same folder as the new assembly, there was the pdb file that was going along the assembly. So when Cecil re-writes the assembly, the methods identifiers are re-generated, and the pdb which keep track of them, becomes out of sync. ildasm uses the pdb file to read the variable names, and other infos. So when it tries to read them from the pdb, which doesn&amp;#8217;t match the assembly, it may crash.&lt;br /&gt;
&lt;br /&gt;
You can read the &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=287089"&gt;bug reported at Microsoft&lt;/a&gt;. It&amp;#8217;s somewhat a corner case, so it&amp;#8217;s not really critical. But if ever you face the same symptoms while disassembling an assembly generated by Cecil, you can try to delete the pdb.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 20 Jul 2007 22:33:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:619b7f43-a462-4a31-bcea-3c3ce2049f8d</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2007/07/20/clarification</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/439</trackback:ping>
    </item>
    <item>
      <title>Mono.Cecil have moved</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/368866253/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/143/368866253_d26881104a.jpg" width="500" height="333" alt="Poison Warning" style="border: 2px solid black;" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;
Yesterday night was filled with emotion. After more than two years in its own module in &lt;span class="caps"&gt;SVN&lt;/span&gt;, the library &lt;a href="http://www.mono-project.com/Cecil"&gt;Mono.Cecil&lt;/a&gt; have moved to a shiner place, right where the core assemblies are, in the &lt;a href="http://anonsvn.mono-project.com/source/trunk/mcs/"&gt;mcs&lt;/a&gt; module.&lt;br /&gt;
&lt;br /&gt;
Dear Cecil users, you&amp;#8217;ll now have to check Cecil out from &lt;a href="http://anonsvn.mono-project.com/source/trunk/mcs/class/Mono.Cecil/"&gt;mcs/class/Mono.Cecil&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Yet, Cecil&amp;#8217;s &lt;span class="caps"&gt;API&lt;/span&gt; is not set in stone, so if Cecil makes it to the &lt;span class="caps"&gt;GAC&lt;/span&gt;, you&amp;#8217;ll still have to keep a private copy of Cecil for your developments, as it won&amp;#8217;t be deployed as a package, you&amp;#8217;ll need a private copy during the compilation.&lt;br /&gt;
&lt;br /&gt;
As soon as I can freeze the &lt;span class="caps"&gt;API&lt;/span&gt;, it will be packaged like the other assemblies. But this is another story.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 13 Jul 2007 20:57:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:c90afc70-84bd-4945-ab79-541de28380e5</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2007/07/13/mono-cecil-have-moved</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/438</trackback:ping>
    </item>
    <item>
      <title>Cecil, ildasm and the security update</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/622153915/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1346/622153915_6294683522.jpg" width="500" height="333" alt="Joutes SÃ¨toises" style="border: 2px solid black;"/&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Since the last security update of the .net 2 framework, ildasm may have some issues with assemblies emitted by &lt;a href="http://mono-project.com/Cecil"&gt;Cecil&lt;/a&gt;. This goes from a pure ildasm crash, to methods that can&amp;#8217;t be disassembled. Plus, the behavior is sometimes random. That&amp;#8217;s clearly a regression in ildasm, because it used to work, and other disassembler are able to read the assembly (Reflector, monodis).&lt;br /&gt;
&lt;br /&gt;
Still, as it seems to happen only with assemblies emitted by Cecil, Cecil must be doing something that ildasm doesn&amp;#8217;t appreciate anymore, but on the other hand, ildasm shouldn&amp;#8217;t crash either. I&amp;#8217;ve not yet been able to discover what this particular thing is. I&amp;#8217;ve &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=287089"&gt;submited a bug&lt;/a&gt; to Microsoft. Let see if they can help telling what&amp;#8217;s going wrong.&lt;/p&gt;</description>
      <pubDate>Thu, 12 Jul 2007 18:46:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:eb00f278-1127-486f-b278-9f913977a787</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2007/07/12/cecil-ildasm-and-the-security-update</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/436</trackback:ping>
    </item>
    <item>
      <title>Reflexil, easy assembly patching</title>
      <description>&lt;p&gt;My old friend &lt;a href="http://sebastien.lebreton.free.fr/blog/"&gt;SÃ©bastien&lt;/a&gt; pinged me a few days ago because he started to use Cecil. Let simply say that he was modifying some assemblies to circumvent a natural limitation of whatever program.&lt;br /&gt;
&lt;br /&gt;
This long time Delphi user like to have a &lt;span class="caps"&gt;GUI&lt;/span&gt; for this kind of hack, so he simply started to write yet another plugin for &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Reflector&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://sebastien.lebreton.free.fr/blog/index.php?/archives/9-Reflexil-v0.1.html"&gt;&lt;img src="http://sebastien.lebreton.free.fr/blog/uploads/images/reflexil.edit.gif" style="border: 0px solid" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The plugin is only in a very early stage, but still, you can deal with primitives types and branches very easily.&lt;br /&gt;
&lt;br /&gt;
You can find &lt;a href="http://sebastien.lebreton.free.fr/blog/index.php?/archives/9-Reflexil-v0.1.html"&gt;here&lt;/a&gt; the mandatory introducing post for Reflexil. Even if it&amp;#8217;s in french, I bet you&amp;#8217;ll locate the binaries as well as the sources easily.&lt;/p&gt;</description>
      <pubDate>Mon, 02 Jul 2007 11:47:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:e808d517-2ccb-4182-8770-6f8da20d1027</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2007/07/02/reflexil-easy-assembly-patching</link>
      <category>Cecil</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/433</trackback:ping>
    </item>
    <item>
      <title>Projects using Cecil</title>
      <description>&lt;p&gt;A month ago, &lt;a href="http://themonkeysgrinder.blogspot.com/"&gt;Scott&lt;/a&gt; had the good idea to start a page on the &lt;a href="http://mono-project.com/Cecil"&gt;Mono.Cecil&lt;/a&gt; &lt;a href="http://groups.google.com/group/mono-cecil"&gt;google group&lt;/a&gt;, to try to list the different projects out there that are using Cecil. The page is wisely named &lt;a href="http://groups.google.com/group/mono-cecil/web/projects-using-cecil"&gt;Projects using Cecil&lt;/a&gt;. I&amp;#8217;ve tried to complete it by myself, but I&amp;#8217;m for sure missing some of my users.&lt;br /&gt;
&lt;br /&gt;
So if you&amp;#8217;re using Cecil, that would be cool to have you listed there. Feel free to change the page yourself, or to drop a name, a summary and if possible a link in the comments.&lt;br /&gt;
&lt;br /&gt;
For bonus points, you can describe what you use Cecil for.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 18 Jun 2007 21:41:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:65163d2d-4b2b-4e81-a0bb-40956157a556</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2007/06/18/projects-using-cecil</link>
      <category>Cecil</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/427</trackback:ping>
    </item>
    <item>
      <title>Annotating objects</title>
      <description>&lt;p&gt;Two weeks ago, I&amp;#8217;ve borrowed a concept I&amp;#8217;ve first seen in &lt;a href="http://boo.codehaus.org"&gt;Boo&lt;/a&gt; to use it in &lt;a href="http://www.mono-project.com/Cecil"&gt;Cecil&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
As the title of this entry kindly suggests, it&amp;#8217;s about something called annotations. The need for them came from my work on the linker. Before using annotations, to decide which elements to link, I&amp;#8217;ve re-created a tree of objects called markers. For instance, to mark a method, I used to have a class similar to this one:
&lt;pre&gt;
public class MethodMarker : Marker {

    MethodDefinition method;

}
&lt;/pre&gt;
&lt;br /&gt;
When it was time to sweep methods in a type, I was checking if the method was found in the markers of a type, and if not, I knew I could safely remove it. That worked well, but I was basically re-creating a parallel object tree to the Cecil one, only to support a few more information.&lt;br /&gt;
&lt;br /&gt;
Here came to me the idea of reusing the annotations concept. Let&amp;#8217;s have a look at a new interface:
&lt;pre&gt;
namespace Mono.Cecil {

    using System.Collections;

    public interface IAnnotationProvider {

        IDictionary Annotations { get; }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
I&amp;#8217;ve ensured that every important type like TypeDefinition or MethodDefinition in Cecil implement this type, et voilÃ , I&amp;#8217;m now able to randomly tag them, with whatever data I want.&lt;br /&gt;
&lt;br /&gt;
To keep up with the example of the linker, instead of creating a tree of markers, I now simply annotate a method as Â«markedÂ», and when it&amp;#8217;s time to sweep the unused one, the check is now very simple.&lt;br /&gt;
&lt;br /&gt;
Well, that&amp;#8217;s pretty useful to me, hopefully it will be useful to you too.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Following the &lt;a href="http://evain.net/blog/articles/2007/06/12/annotating-objects#comments"&gt;excellent suggestion&lt;/a&gt; from &lt;a href="http://weblogs.asp.net/bleroy/"&gt;Bertrand&lt;/a&gt;, I&amp;#8217;ve changed the way the types implement IAnnotationProvider to an explicit implementation, and it looks really better.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 12 Jun 2007 16:38:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:5e1e6cfc-89b9-4feb-ad7f-aa572962147b</guid>
      <author>Jb Evain</author>
      <link>http://evain.net/blog/articles/2007/06/12/annotating-objects</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/422</trackback:ping>
    </item>
  </channel>
</rss>
