<?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>Tracelight.ch - Leuchtspur im Internet &#187; Intermediate Language</title>
	<atom:link href="http://www.tracelight.ch/tag/intermediate-language/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tracelight.ch</link>
	<description></description>
	<lastBuildDate>Sun, 04 Dec 2011 10:48:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Spass mit Emit</title>
		<link>http://www.tracelight.ch/2008/06/18/spass-mit-emit/</link>
		<comments>http://www.tracelight.ch/2008/06/18/spass-mit-emit/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 19:59:39 +0000</pubDate>
		<dc:creator>Daniel Marbach</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Emit]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[Intermediate Language]]></category>
		<category><![CDATA[System.Reflection.Emit]]></category>

		<guid isPermaLink="false">http://www.tracelight.ch/?p=458</guid>
		<description><![CDATA[In diesem Artikel möchte ich euch kurz aufzeigen, was man mit System.Reflection.Emit unter C# machen kann. Dies ist bei weitem kein komplettes Tutorial sondern nur eine kleine Übersicht über die Möglichkeiten mit Emit. Was wollen wir tun? Ziel ist es eine Klasse Person zu generieren die das Interface IPerson und IComparable implementiert. Die Klasse soll [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Artikel möchte ich euch kurz aufzeigen, was man mit System.Reflection.Emit unter C# machen kann. Dies ist bei weitem kein komplettes Tutorial sondern nur eine kleine Übersicht über die Möglichkeiten mit Emit.</p>
<h3>Was wollen wir tun?</h3>
<p>Ziel ist es eine Klasse <em>Person </em>zu generieren die das Interface <em>IPerson </em>und <em>IComparable<IPerson></em> implementiert. Die Klasse soll folgendermassen aussehen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">interface</span> IPerson <span style="color: #008000;">&#123;</span>
     <span style="color: #6666cc; font-weight: bold;">string</span> Vorname <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Person <span style="color: #008000;">:</span> IPerson, IComparable<span style="color: #008000;">&lt;</span>IPerson<span style="color: #008000;">&gt;</span> <span style="color: #008000;">&#123;</span>
   <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">string</span> vorName<span style="color: #008000;">;</span>
&nbsp;
   <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Vorname <span style="color: #008000;">&#123;</span>
      get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> vorName<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
      set <span style="color: #008000;">&#123;</span> vorName <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
   <span style="color: #008000;">&#125;</span>
&nbsp;
   <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> CompareTo<span style="color: #008000;">&#40;</span>IPerson other<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
      <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
   <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Sicherlich macht es nicht viel Sinn in der <em>CompareTo </em>Methode immer 1 zurück zu geben. Ich habe es nur so gemacht, damit das Beispiel etwas einfacher zu verstehen ist. Da das Emiten von Functioncalls auf .NET Klassen etwas schwieriger ist.</p>
<h3>Generieren eines dynamischen Assemblies</h3>
<p>Das untenstehende Codesegment zeigt wie man ein dynamisches Assembly erzeugt. Dazu definiert man zuerst einen <em>AssemblyName </em>und setzt auf dem <em>AssemblyName </em>das Property <em>Name </em>und <em>Version </em>entsprechend den Anforderungen (<strong>Zeile 2, 4, 6</strong>). Als nächstes holt man sich den <em>AssemblyBuilder  </em>über die bestehende ApplicationDomain des Mainthreads (<strong>Zeile 9</strong>; dann läuft das Assembly unter der gleichen ApplicationDomain). Über den <em>AssemblyBuilder </em>ruft man die Methode <em>DefineDynamicModule </em>aus und erhält somit einen <em>ModuleBuilder </em>der für das Builden eines Modules zuständig ist (<strong>Zeile 11</strong>; ein Assembly kann mehrere Module enthalten).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// Define the new AssemblyName</span>
AssemblyName assName <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> AssemblyName<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Specify the assembly name (without .dll)</span>
assName<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;MyEmitTest&quot;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Define the version</span>
assName<span style="color: #008000;">.</span><span style="color: #0000FF;">Version</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Version<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span>, <span style="color: #FF0000;">0</span>, <span style="color: #FF0000;">0</span>, <span style="color: #FF0000;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Get the AssemblyBuilder for the current application domain</span>
AssemblyBuilder assBuilder <span style="color: #008000;">=</span> Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">GetDomain</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">DefineDynamicAssembly</span><span style="color: #008000;">&#40;</span>assName, AssemblyBuilderAccess<span style="color: #008000;">.</span><span style="color: #0000FF;">RunAndSave</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Get the ModuleBuilder over the AssemblyBuilder</span>
ModuleBuilder modBuilder <span style="color: #008000;">=</span> assBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineDynamicModule</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;MyFirstEmittedModule&quot;</span>, <span style="color: #666666;">&quot;MyEmitTest.dll&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<h3>Definieren der Klasse Person</h3>
<p>Um in dem bestehenden Module eine neue Klasse zu definieren, rufen wir die Methode <em>DefineType </em>des ModuleBuilders auf. Die Methode gibt ein <em>TypeBuilder </em>zurück, den wir brauchen um die Klasse zusammenzubauen. Damit die Klasse Person die Interfaces <em>IPerson </em>und <em>IComparable<IPerson></em> kennt, muss über den <em>TypeBuilder </em>und die Methode <em>AddInterfaceImplementation </em>das entsprechende Interface dem Typ bekannt gemacht werden. Achtung dadurch implementiert der Typ Person die Methoden und Properties der Interfaces nicht automatisch, die muss auch von Hand erledigt werden (mehr dazu später).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// Define Person class which is public</span>
TypeBuilder personBuilder <span style="color: #008000;">=</span> modBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineType</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Person&quot;</span>, TypeAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Public</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Add IPerson interface</span>
personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">AddInterfaceImplementation</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>IPerson<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Add interface IComparable&lt;IPerson&gt;</span>
personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">AddInterfaceImplementation</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>IComparable<span style="color: #008000;">&lt;&gt;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">MakeGenericType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>IPerson<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<h3>Definieren des Feldes <em>vorName</em></h3>
<p>Über den <em>TypeBuilder personBuilder</em> und die Methode <em>DefineField </em>kann ein neues Feld im Typ Person definiert werden. Dazu spezifiziert man den Namen des Feldes, den darunterliegenden Typ und den Fieldmodifier (private, protected, public) über das <em>FieldAttribute</em>. That&#8217;s the whole magic <img src='http://www.tracelight.ch/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// Vorname Field</span>
FieldBuilder vornameFieldBuilder <span style="color: #008000;">=</span> personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineField</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;vorName&quot;</span>, <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span>, FieldAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Private</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<h3>Definieren des Properties <em>Vorname</em></h3>
<p>Für das Definieren des Properties <em>Vorname </em>ist etwas mehr Arbeit nötig. Dies hat mit dem internen Aufbau der Klassen zu tun. Definiert man nämlich ein Property <em>Vorname </em>in C# mit einem <em>get </em>und <em>set </em>Accessor, so wird automatisch vom Compiler jeweils eine Methode <em>get_Vorname</em> und <em>set_Vorname</em> ausprogrammiert und verknüpft. Deshalb muss man nach der Definition des eigentlichen Properties über den <em>TypeBuilder personBuilder</em> und die Methode <em>DefineProperty </em>noch die Methoden <em>get_Vorname</em> und <em>set_Vorname</em> emitten. Doch Eins nach dem Anderen.</p>
<p>Die Methode <em>DefineProperty </em>des <em>TypeBuilder personBuilder</em> definiert den Namen des Properties (hier &#8220;Vorname&#8221;) und den Typ des Properties (hier string).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">PropertyBuilder vornamePropBuilder <span style="color: #008000;">=</span> personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineProperty</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Vorname&quot;</span>, PropertyAttributes<span style="color: #008000;">.</span><span style="color: #0000FF;">None</span>, <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span>, <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p>Nach der obigen Codezeile ist das Property ohne Rumpf definiert. Würde man den Typ <em>Person </em>bereits jetzt versuchen zur Laufzeit zu generieren, würde eine Exception geworfen, dass das Property <em>Vorname </em>noch nicht vollständig implementiert sei. Als erstes beginnen wir mit dem implementieren der <em>get_Vorname </em>Methode. Dazu ruft man auf dem TypeBuilder personBuilder die Methode DefineMethod auf und definiert die Methodenattribute (werden ver-OR-t). Da es sich bei den Methoden <em>get_PropertyName </em>und <em>set_PropertyName </em>um spezielle Methoden handelt (sogenannte Specialnames) muss das MethodAttribute <em>SpecialName </em>gesetzt werden!</p>
<p>Als nächstes holt man sich über den MethodBuilder den ILGenerator und baut über diesen die Operationen der Methode zusammen. Da dies nicht ganz trivial ist, hier ein kleiner Trick:</p>
<p>Der .NET Reflector von Lutze Roeder erlaubt es DLLs die mit .NET erstellt wurden einzulesen und den darunterliegenden Code zu extrahieren. Der Reflector ist erweiterbar mit einem coolen Plugin ReflectorEmitLanguage. Dieses Plugin erlaubt es den IL Code anzusehen. So kann man sich Sampleklassen mit Visual Studio bauen, diese in einer DLL speichern und schlussendlich die erzeuge DLL mit dem Reflector anzusehen. So sieht man genau wie der IL Code mit dem ILGenerator gemacht werden müsste <img src='http://www.tracelight.ch/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Darum gehe ich jetzt nicht weiter auf den IL Code ein.</p>
<p>Zum Schluss muss man noch auf der Klasse mit DefineMethodOverride dem Emitter mitteilen, dass die neue Methode die Methode des Interfaces überschreibt. Sonst gibt es eine Warnung, dass die Klasse Person das Interface IPerson nicht implementiere.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">            <span style="color: #008080; font-style: italic;">// Define the 'get_Vorname' method.</span>
MethodBuilder getVornameMethod <span style="color: #008000;">=</span> personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;get_Vorname&quot;</span>,
MethodAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Public</span> <span style="color: #008000;">|</span> MethodAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Virtual</span> <span style="color: #008000;">|</span> MethodAttributes<span style="color: #008000;">.</span><span style="color: #0000FF;">HideBySig</span> <span style="color: #008000;">|</span> MethodAttributes<span style="color: #008000;">.</span><span style="color: #0000FF;">SpecialName</span>,
               <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span>, <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Generate IL code for 'get_Vorname' method.</span>
ILGenerator methodIL <span style="color: #008000;">=</span> getVornameMethod<span style="color: #008000;">.</span><span style="color: #0000FF;">GetILGenerator</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ldarg_0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ldfld</span>, vornameFieldBuilder<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ret</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Define the Set Method</span>
vornamePropBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">SetGetMethod</span><span style="color: #008000;">&#40;</span>getVornameMethod<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Get the interface implementation</span>
MethodInfo interfaceGetVorname <span style="color: #008000;">=</span> <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>IPerson<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;get_Vorname&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Ovveride it</span>
personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineMethodOverride</span><span style="color: #008000;">&#40;</span>getVornameMethod, interfaceGetVorname<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p>Fast das gleiche Prinzip gilt für die Methode set_Vorname.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// Define the 'set_Vorname' method.</span>
Type<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> methodArgs <span style="color: #008000;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
MethodBuilder setVornameMethod <span style="color: #008000;">=</span> personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;set_Vorname&quot;</span>,
               MethodAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Public</span> <span style="color: #008000;">|</span> MethodAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Virtual</span> <span style="color: #008000;">|</span> MethodAttributes<span style="color: #008000;">.</span><span style="color: #0000FF;">HideBySig</span> <span style="color: #008000;">|</span> MethodAttributes<span style="color: #008000;">.</span><span style="color: #0000FF;">SpecialName</span>,
               <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">void</span><span style="color: #008000;">&#41;</span>, methodArgs<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Generate IL code for 'set_Vorname' method.</span>
methodIL <span style="color: #008000;">=</span> setVornameMethod<span style="color: #008000;">.</span><span style="color: #0000FF;">GetILGenerator</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ldarg_0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ldarg_1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Stfld</span>, vornameFieldBuilder<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ret</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
vornamePropBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">SetSetMethod</span><span style="color: #008000;">&#40;</span>setVornameMethod<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
MethodInfo interfaceSetVorname <span style="color: #008000;">=</span> <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>IPerson<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;set_Vorname&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineMethodOverride</span><span style="color: #008000;">&#40;</span>setVornameMethod, interfaceSetVorname<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<h3>Definieren der Methode <em>CompareTo</em></h3>
<p>CompareTo definiert die Methode des Interfaces IComparable<IPerson> und hat darum einen IPerson Parameter <em>other</em>. Dies muss ebenfalls über den MethodBuilder erstellt werden und über DefineParameter wird die Position, das Parameterattribute und der Name des Parameters festgelegt. Schlussendlich geben wir hier im Beispielcode einfach als Returnparameter eine 1 zurück, die wir über den IL Generator auf den Stack geladen haben&#8230;</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// Make compareTo Method with the Person param</span>
Type<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> compareToArgs <span style="color: #008000;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>IPerson<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
MethodBuilder compareToMethod <span style="color: #008000;">=</span> personBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;CompareTo&quot;</span>,
MethodAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Public</span> <span style="color: #008000;">|</span> MethodAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Virtual</span>, <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>, compareToArgs<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            compareToMethod<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineParameter</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">1</span>, ParameterAttributes<span style="color: #008000;">.</span><span style="color: #0000FF;">None</span>, <span style="color: #666666;">&quot;other&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// Generate the IL code for the compareTo Method</span>
methodIL <span style="color: #008000;">=</span> compareToMethod<span style="color: #008000;">.</span><span style="color: #0000FF;">GetILGenerator</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ldarg_0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ldc_I4</span>, <span style="color: #FF0000;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// Pushes the value 1 (int32) to the stack</span>
methodIL<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ret</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p>Viel Spass</p>
<h3>Links</h3>
<p><a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx" target="_blank">MSDN System.Reflection.Emit</a><br />
<a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.assemblybuilder.aspx" target="_blank">MSDN System.Reflection.Emit.AssemblyBuilder</a><br />
<a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.methodbuilder.aspx" target="_blank">MSDN System.Reflection.Emit.MethodBuilder</a><br />
<a href="http://www.aisto.com/roeder/dotnet/" target="_blank">.NET Reflector</a><br />
<a href="http://www.codeplex.com/reflectoraddins" target="_blank">.NET Reflector Add-Ins</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tracelight.ch/2008/06/18/spass-mit-emit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

