<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<copyright>Manuel Josupeit-Walter</copyright>
		<generator>Capits.Simple Blog</generator>
		<language>de</language>
		<lastBuildDate>Thu, 23 May 2013 18:27:07 +0200</lastBuildDate>
		<managingEditor>webmaster@josupeit.com (Manuel Josupeit-Walter)</managingEditor>
		<webMaster>webmaster@josupeit.com (Manuel Josupeit-Walter)</webMaster>
		<ttl>1440</ttl>
		<title>josupeit.com</title>
		<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet</link>
		<description>Aus dem Leben eines Homo Informaticus</description>
		<pubDate>Thu, 15 Nov 2007 20:17:55 +0100</pubDate>
		<atom:link rel="self" type="application/rss+xml" href="http://www.josupeit.com/weblog~informatik-und-technik~dotnet?output=rss" />
		
		<item>	
			<title>C# 4.0 dynamic-Schlüsselwort</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,c-40-dynamic-schluesselwort.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=106</guid>
			<pubDate>Fri, 09 Dec 2011 20:56:33 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Ich entwickle Software nun schon seit Version 1.1 des Frameworks in .net und mit jeder Version kommen mehr oder weniger bahnbrechende Sprachfeatures hinzu. Generics, Linq oder lokale Typinferenz sind nur einige Buzzwords, die mir auf die Schnelle in diesem Zusammenhang einfallen. Seit heute jedoch bin ich Fan eines weiteren Sprachfeatures, das unter anderem der Interoperabilit&auml;t mit untypisierten Sprachen, wie Javascript geschuldet ist: Des <b><span class="schluesselwort">dynamic</span></b>-Schl&uuml;sselworts.
			</p>
			<p>
			Mit Version 4.0 des .net-Frameworks hat Microsoft die sogenannte <i>DLR</i>, die Dynamic Runtime Language eingef&uuml;hrt und damit seine Sprachen um dynamische Typisierung erweitert. Bitte nicht falsch verstehen, Variablen, die als dynamic deklariert werden sind nicht etwa untypisiert, vielmehr geht der Compiler zun&auml;chst davon aus, dass jede beliebige Operation auf einem <span class="schluesselwort">dynamic</span>-Objekt ausgef&uuml;hrt werden kann. Etwaige Probleme entstehen erst zur Laufzeit (<a href="http://de.wikipedia.org/wiki/Duck-Typing" title="Duck-Typing in der deutschen Wikipedia">Duck Typing</a> ist z.B. nicht &quot;einfach so&quot; m&ouml;glich).
			</p>
			<p>
			W&auml;hrend fr&uuml;her z.B. viel reflektiver Code notwendig war, um zur Laufzeit auf einem Objekt beliebigen Typs Methoden auszuf&uuml;hren, wird das Leben mit Hilfe des <span class="schluesselwort">dynamic</span>-Schl&uuml;sselwortes weitaus leichter. Das folgende Beispiel ist dem MSDN-Magazine entnommen: <a href="http://msdn.microsoft.com/en-us/magazine/gg598922.aspx" title="Dynamic .NET - Understanding the Dynamic Keyword in C# 4.0">Dynamic .NET - Understanding the Dynamic Keyword in C# 4.0</a>
			</p>
			<p class="code">
			<span class="schluesselwort">object </span>calc = GetCalculator();<br />
			<span class="objekt">Type </span>calcType = calc.GetType();<br />
			<span class="schluesselwort">object </span>res = calcType.InvokeMember(<span class="zeichenfolge">&quot;Add&quot;</span>, <span class="objekt">BindingFlags</span>.InvokeMethod, <span class="schluesselwort">null</span>, <span class="schluesselwort">new object</span>[] { 10, 20 });<br />
			<span class="schluesselwort">int </span>sum = <span class="objekt">Convert</span>.ToInt32(res);
			</p>
			<p>
			Vereinfachung durch die Nutzung der dynamischen Typisierung:
			</p>
			<p class="code">
			<span class="schluesselwort">dynamic </span>calc = GetCalculator();<br />
			<span class="schluesselwort">int </span>sum = calc.Add(10, 20);
			</p>
			<p>
			Interessanter finde ich jedoch, dass durch dieses Schl&uuml;sselwort auch dynamisches Dispatching erm&ouml;glicht wird! Das folgende Beispiel stellt eine Factory-Klasse dar, die verschiedene &quot;Personen&quot; instanziieren, und anhand mehrerer Methoden&uuml;berladungen einige Eigenschaften dieser &quot;Personen&quot; auf Standardwerte setzen soll. Dieses Beispiel funktioniert aufgrund des statischen Dispatchings jedoch nicht:
			</p>
			<p class="code">
			<span class="schluesselwort">
			public static class </span><span class="objekt">PersonFactory </span>{ <br />
			&nbsp; <span class="schluesselwort">public static</span> TPerson CreatePerson&lt;TPerson&gt;() <span class="schluesselwort">where </span>TPerson : Person {<br />
			&nbsp;&nbsp;&nbsp; TPerson p = (TPerson)<span class="objekt">Activator</span>.CreateInstance(<span class="schluesselwort">typeof</span>(TPerson), <span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; InitializePerson(p);<span class="kommentar"> // Wird immer die erste &Uuml;berladung aufrufen</span><br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void</span> InitializePerson(<span class="objekt">Person </span>p) {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/* Do sth. useful here */</span><br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void </span>InitializePerson(<span class="objekt">Student </span>s) {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/* Do sth. useful here */</span><br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void </span>InitializePerson(<span class="objekt">Teacher </span>t) {<br />
			&nbsp;&nbsp;&nbsp; t.Students = <span class="schluesselwort">new </span><span class="objekt">List</span>&lt;<span class="objekt">Student</span>&gt;();<br />
			&nbsp; }<br />
			}<br />
			<br />
			<span class="schluesselwort">
			public class </span><span class="objekt">Person </span>{<br />
			&nbsp; <span class="schluesselwort">public string </span>LastName { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			&nbsp; <span class="schluesselwort">public string </span>FirstName { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			}<br />
			<br />
			<span class="schluesselwort">public class </span><span class="objekt">Student </span>: <span class="objekt">Person </span>{<br />
			&nbsp; <span class="kommentar">/* This is just a stub */</span><br />
			}<br />
			<br />
			<span class="schluesselwort">public class </span><span class="objekt">Teacher </span>: <span class="objekt">Person </span>{<br />
			&nbsp; <span class="schluesselwort">public </span><span class="objekt">IList</span>&lt;<span class="objekt">Student</span>&gt; Students { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			}
			</p>
			<p>
			Da der statische Typ von <span class="inline_code">p</span> in der Methode <span class="inline_code">CreatePerson </span>der <span class="objekt">PersonFactory </span><span class="objekt">Person </span>ist, wird immer die erste &Uuml;berladung der <span class="inline_code">InitializePerson</span>-Methode aufgerufen werden. Das steht bereits zum Zeitpunkt der Kompilierung fest. Die einzige M&ouml;glichkeit bisher, die richte &Uuml;berladung ohne dynamisches Dispatching aufzurufen, ist der Umweg &uuml;ber sog. Double Dispatching:
			</p>
			<p class="code">
			<span class="schluesselwort">
			public static class </span><span class="objekt">PersonFactory </span>{ <br />
			&nbsp; <span class="schluesselwort">public static</span> TPerson CreatePerson&lt;TPerson&gt;() <span class="schluesselwort">where </span>TPerson : Person {<br />
			&nbsp;&nbsp;&nbsp; TPerson p = (TPerson)<span class="objekt">Activator</span>.CreateInstance(<span class="schluesselwort">typeof</span>(TPerson), <span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; p.InitializePerson();<span class="kommentar"></span><br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void</span> InitializePerson(<span class="objekt">Person </span>p) {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/* Do sth. useful here */</span><br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void </span>InitializePerson(<span class="objekt">Student </span>s) {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/* Do sth. useful here */</span><br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void </span>InitializePerson(<span class="objekt">Teacher </span>t) {<br />
			&nbsp;&nbsp;&nbsp; t.Students = <span class="schluesselwort">new </span><span class="objekt">List</span>&lt;<span class="objekt">Student</span>&gt;();<br />
			&nbsp; }<br />
			}<br />
			<br />
			<span class="schluesselwort">
			public abstract class </span><span class="objekt">Person </span>{<br />
			&nbsp; <span class="schluesselwort">public string </span>LastName { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			&nbsp; <span class="schluesselwort">public string </span>FirstName { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public abstract void</span> InitializePerson();<br />
			}<br />
			<br />
			<span class="schluesselwort">public class </span><span class="objekt">Student </span>: <span class="objekt">Person </span>{<br />
			&nbsp;&nbsp;
			<span class="schluesselwort">public override void</span> InitializePerson() {<br />
			&nbsp;&nbsp;&nbsp; <span class="objekt">PersonFactory</span>.InitializePerson(<span class="schluesselwort">this</span>);<br />
			&nbsp; }<br />
			}<br />
			<br />
			<span class="schluesselwort">public class </span><span class="objekt">Teacher </span>: <span class="objekt">Person </span>{<br />
			&nbsp; <span class="schluesselwort">public </span><span class="objekt">IList</span>&lt;<span class="objekt">Student</span>&gt; Students { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			<br />
			&nbsp;&nbsp;
			<span class="schluesselwort">public override void </span>InitializePerson() {<br />
			&nbsp;&nbsp;&nbsp; <span class="objekt">PersonFactory</span>.InitializePerson(<span class="schluesselwort">this</span>);<br />
			&nbsp; }<br />
			}
			</p>
			<p>
			Durch verwendung des doppelten Dispatchings wird nun die korrekte &Uuml;berladung der <span class="inline_code">InitializePerson</span>-Methode innerhalb der <span class="objekt">PersonFactory </span>aufgerufen, allerdings muss ab jetzt <b>jede von <span class="objekt">Person </span>erbende Klasse die Methode <span class="inline_code">InitializePerson </span>mit immer dem selben Aufruf implementieren</b>, was zu redundantem Code f&uuml;hrt, der dar&uuml;ber hinaus auch noch leicht vergessen werden kann und dessen Sinn sich f&uuml;r Laien oft nicht erschlie&szlig;t. Sollte k&uuml;nftig jedoch eine weitere Vererbung hinzukommen, wie z.B. der <span class="objekt">SuperTeacher</span>, der die Klasse <span class="objekt">Teacher </span>erweitert und nicht mehr vom Compiler gezwungen wird, die Methode <span class="inline_code">InitializePerson </span>zu &uuml;berschreiben, wird wiederum immer nur die Methoden&uuml;berladung f&uuml;r <span class="objekt">Teacher </span>aufgerufen werden, bis die Methode auch von <span class="objekt">SuperTeacher </span>&uuml;berschrieben wird. Der Code in der Methode ist jedoch der selbe, wie der der Basisklasse <span class="objekt">Teacher</span>. :-( 
			</p>
			<p>
			Die L&ouml;sung f&uuml;r dieses Dilemma ist das <span class="schluesselwort">dynamic</span>-Schl&uuml;sselwort, denn dadurch wird erst zur Laufzeit und nicht bereits bei der Kompilierung entschieden, welche Methode aufgerufen wird:
			</p>
			<p class="code">
			<span class="schluesselwort">
			public static class </span><span class="objekt">PersonFactory </span>{ <br />
			&nbsp; <span class="schluesselwort">public static</span> TPerson CreatePerson&lt;TPerson&gt;() <span class="schluesselwort">where </span>TPerson : Person {<br />
			&nbsp;&nbsp;&nbsp; <b class="schluesselwort">dynamic</b> p = <span class="objekt">Activator</span>.CreateInstance(<span class="schluesselwort">typeof</span>(TPerson), <span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; InitializePerson(p);<span class="kommentar"> // Wird die beste &Uuml;berladung aufrufen</span>!!<br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void</span> InitializePerson(<span class="objekt">Person </span>p) {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/* Do sth. useful here */</span><br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void </span>InitializePerson(<span class="objekt">Student </span>s) {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/* Do sth. useful here */</span><br />
			&nbsp; }<br />
			<br />
			&nbsp; <span class="schluesselwort">public static void </span>InitializePerson(<span class="objekt">Teacher </span>t) {<br />
			&nbsp;&nbsp;&nbsp; t.Students = <span class="schluesselwort">new </span><span class="objekt">List</span>&lt;<span class="objekt">Student</span>&gt;();<br />
			&nbsp; }<br />
			}<br />
			<br />
			<span class="schluesselwort">
			public class </span><span class="objekt">Person </span>{<br />
			&nbsp; <span class="schluesselwort">public string </span>LastName { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			&nbsp; <span class="schluesselwort">public string </span>FirstName { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			}<br />
			<br />
			<span class="schluesselwort">public class </span><span class="objekt">Student </span>: <span class="objekt">Person </span>{<br />
			&nbsp; <span class="kommentar">/* This is just a stub */</span><br />
			}<br />
			<br />
			<span class="schluesselwort">public class </span><span class="objekt">Teacher </span>: <span class="objekt">Person </span>{<br />
			&nbsp; <span class="schluesselwort">public </span><span class="objekt">IList</span>&lt;<span class="objekt">Student</span>&gt; Students { <span class="schluesselwort">get</span>; <span class="schluesselwort">set</span>; }<br />
			}
			</p>
			<p>
			Fertig. Geil! 8-) 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Visual Studio 2008 auf Vista x64</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,visual-studio-2008-auf-vista-x64.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=64</guid>
			<pubDate>Fri, 03 Oct 2008 15:23:44 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Seit geraumer Zeit bin ich endlich im Besitz meines neuen Rechners, allerdings bescherte mir die Installation von Visual Studio 2008 auf der 64-Bit Version von Windows Vista so einige Probleme, die auch <a href="http://grumpywookie.wordpress.com/2008/02/12/problems-installing-visual-studio-2008-on-vista-x64/" target="_blank">hier</a> bereits im Februar gebloggt wurden. (Leider bin ich trotz emsigen Googlens nicht auf eine solche Probleml&ouml;sung gesto&szlig;en.)
			</p>
			<p>
			Trotz einer frischen Installation von Windows und allen n&ouml;tigen Treibern scheiterte die Installation von Visual Studio bereits beim .NET Framework 3.5 mit einer ganzen Reihe roter Kreuze. Zudem erfreute ich mich seither daran, dass mein neuer Rechner nun ca. 10 Minuten (!!) zum booten brauchte, bis ich letztlich meinen Desktop vor mir sah (nicht, dass ich jetzt in der Lage gewesen w&auml;re, den PC in irgend einer Form zu bedienen :-)).
			</p>
			<p>
			Die L&ouml;sung des Problemes jedoch hei&szlig;t Service Pack 1 f&uuml;r Windows Vista x64, dass Microsoft gl&uuml;cklicherweise <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=874a414b-32b2-41cc-bd8b-d71eda5ec07c&amp;DisplayLang=de" target="_blank">online zum Download</a> bereitstellt. Schade allerdings, dass dort explizit vom Download abgeraten wird, da die Updates in Vista automatisch erfolgten -- Leider wurde, jedenfalls bei mir, dieses Service Pack nicht per Auto-Update ausgeliefert. Vielen Dank, Mr. Ballmer, das bescherte mir 10 Stunden Arbeit... 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Systemweiter Singleton in C#: Nachtrag</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,systemweiter-singleton-nachtrag.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=59</guid>
			<pubDate>Fri, 16 May 2008 13:29:02 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Vor einiger Zeit berichtete ich <a href="front_content.php?idart=29&amp;idcat=10&amp;lang=1&amp;client=1">hier</a> &uuml;ber die Implementierung eines systemweiten Singleton in C#. Trotz Freigabe des registrierten Mutexes bei Terminierung des Hauptprozesses und damit einhergehender Vernichtung der &uuml;ber die Anwendungsdom&auml;ne hinaus bereitgestellten Objekte, wurde bei Aufruf der GetInstance-Methode kein neues Objekt erzeugt (vielen Dank f&uuml;r den Hinweis, Tom).
			</p>
			<p>
			Diesem Problem habe ich etwas Zeit gewidmet und eine L&ouml;sung zum <a href="front_content.php?idcat=13&amp;lang=1&amp;client=1">Download</a> bereitgestellt. 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Systemweiter Singleton in C#</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,erweiterung-zum-globalen-singleton.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=29</guid>
			<pubDate>Wed, 19 Dec 2007 15:51:38 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Am 21. November, also vor gut einem Monat habe ich in meinem Artikel <a href="front_content.php?idart=23&amp;idcat=10&amp;lang=1&amp;client=1">Singleton als vererbte Klasse am Beispiel C#</a> gezeigt, wie das Singleton Entwurfsmuster so implementiert werden kann, dass eine Klasse lediglich von einer Singleton-Oberklasse erben muss, um nicht mehr als einmal in der aktuellen Applikationsdom&auml;ne instanziiert werden zu k&ouml;nnen. Wie versprochen m&ouml;chte ich die damals Schritt f&uuml;r Schritt entwickelte Klasse heute so ausbauen, dass ein systemweiter Singleton realisiert werden kann. Dadurch kann von einer Klasse &uuml;ber die Applikationsdom&auml;ne hinaus nur ausschlie&szlig;lich eine Instanz existieren und wird es sehr einfach m&ouml;glich, dass eine Anwendung beispielsweise nur einmal gestartet werden kann und jeder weitere Start lediglich das Hauptfenster in den Vordergrund holt.
			</p>
			<p>
			Damit allerdings zwei Prozesse eines Systemes miteinander kommunizieren k&ouml;nnen, wird ein Datenkanal ben&ouml;tigt, &uuml;ber den dann ein Prozess von einem anderen ferngesteuert werden kann. Bitte behalten Sie also die folgende Illustration w&auml;hrend des lesens im Hinterkopf, es wird Ihnen das Leben etwas erleichtern:&nbsp;
			</p>
			<p>
			&nbsp;
			</p>
			<div style="text-align: center">
			<img src="upload/grafiken/remoting.gif" alt="Remoting Illustration" border="0" height="248" width="501" />
			</div>
			<br />
			<p>
			&nbsp;
			</p>
			<p>
			Bevor ich nun beginne, m&ouml;chte ich kurz den letzten Stand in Erinnerung rufen: Wir entwickelten eine <span class="inline_code">SingletonProvider</span> Klasse, die alle Instanzen im eigentlichen Sinne verwaltet hat. Eine Vererbung fand im Anschluss daran &uuml;ber die Klasse <span class="inline_code">SingletonBase</span> statt:
			</p>
			<br />
			<h4>SingletonProvider</h4>
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">public static class</span> <span class="objekt">SingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Hashtable </span>Selfs = <span class="schluesselwort">new </span>Hashtable();<br />
			&nbsp; <span class="schluesselwort">private static object</span> Lock&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span>Object();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class </span><span class="kommentar">// Jede Klasse ist erlaubt</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Auf &ouml;ffentlichen Konstruktor pr&uuml;fen</span><br />
			&nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>checkCtor = (<span class="schluesselwort">typeof</span>(T)).GetConstructor(<span class="objekt">Type</span>.EmptyTypes);<br />
			&nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Falls es einen solchen Konstruktor gibt,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* schmei&szlig;en wir einen Fehler, da es dem <br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Charakter eines Singleton widerspricht.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;*/</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(checkCtor != <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">throw new</span> InvalidOperationException(<span class="zeichenfolge">&quot;Singleton means that you don't have any public constructors&quot;</span>);<br />
			<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Threadsynchronisation</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="kommentar">// Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Neue Instanz &uuml;ber Reflektion erstellen</span><br />
			&nbsp; &nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Gesch&uuml;tzte Konstruktoren auslesen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; ctorInfo = <span class="schluesselwort">typeof</span>(T).GetConstructor(<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">BindingFlags</span>.NonPublic | <br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">BindingFlags</span>.Instance,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span>,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">Type</span>.EmptyTypes,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Konstruktor ohne Parameter aufrufen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(<span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Instanz der Hashtabelle zuf&uuml;hren</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Instanz);<br />
			&nbsp;&nbsp;&nbsp; &nbsp; New = <span class="schluesselwort">true</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span>
			<br />
			<h4>SingletonBase</h4>
			<span class="code"><span class="schluesselwort">public abstract class</span> <span class="objekt">SingletonBase</span>&lt;T&gt;<br />
			&nbsp; <span class="schluesselwort">where </span>T: <span class="objekt">SingletonBase</span>&lt;T&gt;<br />
			{<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span><span class="objekt">SingletonProvider</span>.GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>New);<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span>
			<br />
			<p>
			Um nun zun&auml;chst die <span class="inline_code">SingletonProvider</span>-Klasse auszubauen, verwende ich einen sogenannten Mutex<a href="front_content.php?idart=29#fussnoten"><sup>1</sup></a>. Mutexe werden in aller Regel zur Prozesssynchronisation verwendet, das hei&szlig;t, um sicherzustellen, dass kritische Programmabschnitte nicht gleichzeitig ausgef&uuml;hrt werden k&ouml;nnen, um beispielsweise Dateninkonsistenzen zu vermeiden. Sie lassen sich allerdings auch f&uuml;r unseren Zweck nutzen, da Mutexe systemweit registriert werden. Da sich die n&ouml;tigen Klassen f&uuml;r Mutexe und unser folgendes Vorhaben aber in anderen Namensr&auml;umen (und Assemblies) befinden, m&uuml;ssen zun&auml;chst ein Verweis auf die Assembly <span class="inline_code">System.Runtime.Remoting</span> gesetzt - und die bekannten <span class="inline_code">using</span>-Direktiven um einige Namensr&auml;ume erg&auml;nzt werden, so dass unsere Klassendefinition <span class="inline_code">GlobalSingletonProvider</span> k&uuml;nftig von den folgenden Zeilen angef&uuml;hrt wird:<br />
			&nbsp;
			</p>
			<p class="code">
			<span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Threading;<br />
			<span class="schluesselwort">using </span>System.Runtime.InteropServices;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels.Ipc;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization.Formatters;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">public static class </span><span class="objekt">GlobalSingletonProvider</span><br />
			{ ... }
			</p>
			<br />
			<p>
			Dadurch aber m&uuml;ssen f&uuml;r jedes Singleton-Objekt nicht nur Instanzen verwaltet werden, sondern auch noch die zugeh&ouml;rigen Mutexe, die beim System registriert wurden. Hierzu wird unsere Liste von Deklarationen um eine Hashtabelle erweitert.<br />
			</p>
			<p class="code">
			<span class="schluesselwort">public static class</span> <span class="objekt">GlobalSingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>Selfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>ApplicationMutexes = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">object </span>Lock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span><span class="objekt">Object</span>();<br />
			<br />
			<span class="kommentar">&nbsp; // ... </span><br />
			}
			</p>
			<p>
			<br />
			Im Gegensatz zum herk&ouml;mmlichen SingletonProvider, wird im Rupf der Methode <span class="inline_code">GetInstance()</span> nun direkt nach der &Uuml;berpr&uuml;fung, ob bereits in der aktuellen Applikationsdom&auml;ne eine Instanz der Klasse existiert, ein neuer Mutex registriert, der als Namen die GUID, also eine absolut eindeutige ID der zu instanziierenden Klasse tr&auml;gt. Eine boolsche Variable <span class="inline_code">New </span>gibt hier an, ob dem System ein solcher Mutex bereits bekannt ist. Das n&auml;mlich ist genau dann der Fall, wenn bereits au&szlig;erhalb der Applikationsdom&auml;ne eine Instanz erstellt worden ist; der dort registrierte Mutex tr&auml;gt n&auml;mlich aufgrund der ID der Klasse den selben Namen. Jetzt wird &uuml;ber sogenannte Ipc Channels ein Remote-Proxy auf dieses Objekt geholt, so dass das bestehende Objekt quasi &quot;ferngesteuert&quot; werden kann. Als Resultat dieser Hintergrundarbeit k&ouml;nnen Sie auf dem Objekt arbeiten, als h&auml;tten Sie es in Ihrer Applikationsdom&auml;ne erzeugt (Achtung: Das hei&szlig;t nicht, dass sie auf dem Objekt arbeiten k&ouml;nnen, als h&auml;tten Sie es im gleichen Thread erzeugt. Beachten Sie Thread&uuml;bergreifende Vorg&auml;nge!), alle Aufrufe werden in Wahrheit allerdings transparent weitergereicht. Kann im Gegensatz dazu der Mutex beim System neu registriert werden, l&auml;sst das darauf schlie&szlig;en, dass es sich um eine neue Instanz der Klasse handelt. Auch in diesem Fall wird ein Ipc Kanal bereitgestellt und dar&uuml;ber das Objekt verf&uuml;gbar gemacht. Dieses Vorgehen bezeichnet man h&auml;ufig auch als Marshalling<a href="front_content.php?idart=29#fussnoten"><sup>2</sup></a>. Vorraussetzung f&uuml;r das Marshallen von Objekten ist allerings, dass diese Objekte von der Klasse <span class="inline_code">MarshalByRefObject</span> erben.
			</p>
			<p>
			Das folgende Listing zeigt nun die bisherigen Modifikationen an der herk&ouml;mmlichen <span class="inline_code">SingletonProvider</span>-Klasse, bereits bekannte Zeilen sind hier allerdings ausgegraut, damit deutlich wird, welche neuen Anweisungen unserem Vorhaben dienlich sind:
			</p>
			<p>
			<br />
			<span class="code"><span class="inaktiv">using System;<br />
			using System.Collections.Generic;<br />
			using System.Text;<br />
			using System.Collections;<br />
			using System.Reflection;<br />
			</span><span class="schluesselwort">using </span>System.Threading;<br />
			<span class="schluesselwort">using </span>System.Runtime.InteropServices;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels.Ipc;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization.Formatters;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization;<br />
			<br />
			<span class="inaktiv">
			public static class</span> <span class="objekt">GlobalSingletonProvider</span><br />
			<span class="inaktiv">
			{<br />
			&nbsp; private static Hashtable Selfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new Hashtable();<br />
			</span>&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>ApplicationMutexes = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			<span class="inaktiv">
			&nbsp; private static object Lock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new Object();<br />
			<br />
			&nbsp; public static T GetInstance&lt;T&gt;(out bool New)<br />
			&nbsp;&nbsp;&nbsp; where T: </span>
			<span class="objekt">MarshalByRefObjekt </span><span class="inaktiv">// Jede Klasse ist erlaubt</span><span class="kommentar">, die von MarshalByRefObjekt erbt</span><br />
			&nbsp; <span class="inaktiv">{<br />
			&nbsp;&nbsp;&nbsp; // Auf &ouml;ffentlichen Konstruktor pr&uuml;fen<br />
			&nbsp;&nbsp;&nbsp; ConstructorInfo checkCtor = (typeof(T)).GetConstructor(Type.EmptyTypes);<br />
			&nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; /*<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Falls es einen solchen Konstruktor gibt,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* schmei&szlig;en wir einen Fehler, da es dem <br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Charakter eines Singleton widerspricht.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
			&nbsp;&nbsp;&nbsp; if (checkCtor != null)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new InvalidOperationException(&quot;Singleton means that you don't have any public constructors&quot;);<br />
			<br />
			&nbsp;&nbsp;&nbsp; // Threadsynchronisation<br />
			&nbsp;&nbsp;&nbsp; lock (Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; if (Selfs.ContainsKey(typeof(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Instanz existiert bereits<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = false;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (T)Selfs[typeof(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }</span>
			<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Mittels Mutex &uuml;berpr&uuml;fen, ob bereits eine Instanz existiert<br />
			</span>
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationMutexes.Add(<span class="schluesselwort">typeof</span>(T).GUID, <span class="schluesselwort">new </span><span class="objekt">Mutex</span>(<span class="schluesselwort">true</span>, <span class="schluesselwort">typeof</span>(T).GUID.ToString(), <span class="schluesselwort">out </span>New));<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ipc Kanal deklarieren</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">IpcChannel </span>_Channel;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(!New)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Falls in einer anderen Applikationsdom&auml;ne eine Instanz existiert,<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * muss diese nun als Remote-Proxy bereitgestellt werden, dazu<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * wird zun&auml;chst ein Ipc Channel registriert.<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapServerFormatterSinkProvider </span>_ServProv = <span class="schluesselwort">new </span><span class="objekt">SoapServerFormatterSinkProvider</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ServProv.TypeFilterLevel = <span class="objekt">TypeFilterLevel</span>.Full;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapClientFormatterSinkProvider </span>_ClientProv = <span class="schluesselwort">new </span><span class="objekt">SoapClientFormatterSinkProvider</span>();<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Zur Serialisierung wird der Soap-Formatter verwendet</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Channel = <span class="schluesselwort">new </span><span class="objekt">IpcChannel</span>(<span class="schluesselwort">null</span>, _ClientProv, _ServProv);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">ChannelServices</span>.RegisterChannel(_Channel, <span class="schluesselwort">false</span>);<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Nun wird die Instanz &uuml;ber diesen Kanal geholt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T _Inst = (T)<span class="objekt">Activator</span>.GetObject(<span class="objekt">typeof</span>(T), <span class="zeichenfolge">&quot;ipc://localhost:9190/GlobalSingleton_&quot;</span> + <span class="schluesselwort">typeof</span>(T).GUID.ToString());<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Inst);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">else</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Es existiert keine Instanz, also wird eine neue Instanz erstellt,<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * der Mutex wird bei Applikationsende wieder freigegeben<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">AppDomain</span>.CurrentDomain.ProcessExit += <span class="schluesselwort">delegate</span>(<span class="schluesselwort">object</span> sender, <span class="objekt">EventArgs </span>e)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">try</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((<span class="objekt">Mutex</span>)ApplicationMutexes[<span class="schluesselwort">typeof</span>(T).GUID]).ReleaseMutex();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">catch </span>{ <span class="kommentar">/* Fehler ignorieren */</span> }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
			<br />
			<span class="inaktiv">&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Neue Instanz &uuml;ber Reflektion erstellen<br />
			&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; ConstructorInfo ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Gesch&uuml;tzte Konstruktoren auslesen<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ctorInfo = typeof(T).GetConstructor(<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BindingFlags.NonPublic | <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; BindingFlags.Instance,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; null,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; Type.EmptyTypes,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; null<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Konstruktor ohne Parameter aufrufen<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(new object[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Instanz der Hashtabelle zuf&uuml;hren<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Selfs.Add(typeof(T).GUID, _Instanz);<br />
			</span><br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ipc Kanal registrieren</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapServerFormatterSinkProvider </span>_ServProv = <span class="schluesselwort">new </span><span class="objekt">SoapServerFormatterSinkProvider</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ServProv.TypeFilterLevel = <span class="objekt">TypeFilterLevel</span>.Full;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapClientFormatterSinkProvider </span>_ClientProv = <span class="schluesselwort">new </span><span class="objekt">SoapClientFormatterSinkProvider</span>();<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Einstellungen f&uuml;r den Kanal werden in einer Hashtabelle abgelegt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">IDictionary </span>_Hashtable = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Hashtable[<span class="zeichenfolge">&quot;portName&quot;</span>] = <span class="zeichenfolge">&quot;localhost:9190&quot;</span>;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Zur Serialisierung wird der Soap-Formatter verwendet</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Channel = <span class="schluesselwort">new </span><span class="objekt">IpcChannel</span>(_Hashtable, _ClientProv, _ServProv);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">ChannelServices</span>.RegisterChannel(_Channel, false);<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Objekt via Ipc Kanal &quot;marshallen&quot;</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">RemotingServices</span>.Marshal((<span class="objekt">MarshalByRefObject</span>)Selfs[<span class="schluesselwort">typeof</span>(T).GUID], <span class="zeichenfolge">&quot;GlobalSingleton_&quot;</span> + <span class="schluesselwort">typeof</span>(T).GUID.ToString());<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			<br />
			<span class="inaktiv">
			&nbsp;&nbsp;&nbsp; &nbsp; return (T)Selfs[typeof(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; public static T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; where T:</span> <span class="objekt">MarshalByRefObject</span><br />
			<span class="inaktiv">
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; bool _Trash;<br />
			&nbsp;&nbsp;&nbsp; return GetInstance&lt;T&gt;(out _Trash);<br />
			&nbsp; }<br />
			}</span>
			<br />
			</span>
			</p>
			<p>
			<br />
			Die Klasse <span class="inline_code">GlobalSingletonBase </span>unterscheidet sich kaum von der Klasse <span class="inline_code">SingletonBase</span>, mit Ausnahme, dass die neue Klasse nun von <span class="inline_code">MarshalByRefObject </span>erbt, so dass schlussendlich folgender Quelltext genau die Funktionalit&auml;t bietet, die in der Einleitung erw&auml;hnt wurde:
			</p>
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<span class="schluesselwort">using </span>System.Threading;<br />
			<span class="schluesselwort">using </span>System.Runtime.InteropServices;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels.Ipc;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization.Formatters;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization;<br />
			<br />
			<span class="schluesselwort">
			public static class </span><span class="objekt">GlobalSingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>Selfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>ApplicationMutexes = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp; <span class="schluesselwort">private static object </span>Lock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span><span class="objekt">Object</span>();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static </span>T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: 
			<span class="objekt">MarshalByRefObjekt </span><span class="kommentar">// Jede Klasse ist erlaubt, die von MarshalByRefObjekt erbt</span><br />
			&nbsp; {<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp; // Auf &ouml;ffentlichen Konstruktor pr&uuml;fen</span><br />
			&nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>checkCtor = (<span class="schluesselwort">typeof</span>(T)).GetConstructor(<span class="objekt">Type</span>.EmptyTypes);<br />
			&nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Falls es einen solchen Konstruktor gibt,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* schmei&szlig;en wir einen Fehler, da es dem <br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Charakter eines Singleton widerspricht.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;*/</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(checkCtor != <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">throw new</span> <span class="objekt">InvalidOperationException</span>(<span class="zeichenfolge">&quot;Singleton means that you don't have any public constructors&quot;</span>);<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp; // Threadsynchronisation<br />
			</span>
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }
			<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Mittels Mutex &uuml;berpr&uuml;fen, ob bereits eine Instanz existiert<br />
			</span>
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationMutexes.Add(<span class="schluesselwort">typeof</span>(T).GUID, <span class="schluesselwort">new </span><span class="objekt">Mutex</span>(<span class="schluesselwort">true</span>, <span class="schluesselwort">typeof</span>(T).GUID.ToString(), <span class="schluesselwort">out </span>New));<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ipc Kanal deklarieren</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">IpcChannel </span>_Channel;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(!New)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Falls in einer anderen Applikationsdom&auml;ne eine Instanz existiert,<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * muss diese nun als Remote-Proxy bereitgestellt werden, dazu<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * wird zun&auml;chst ein Ipc Channel registriert.<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapServerFormatterSinkProvider </span>_ServProv = <span class="schluesselwort">new </span><span class="objekt">SoapServerFormatterSinkProvider</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ServProv.TypeFilterLevel = <span class="objekt">TypeFilterLevel</span>.Full;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapClientFormatterSinkProvider </span>_ClientProv = <span class="schluesselwort">new </span><span class="objekt">SoapClientFormatterSinkProvider</span>();<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Zur Serialisierung wird der Soap-Formatter verwendet</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Channel = <span class="schluesselwort">new </span><span class="objekt">IpcChannel</span>(<span class="schluesselwort">null</span>, _ClientProv, _ServProv);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">ChannelServices</span>.RegisterChannel(_Channel, <span class="schluesselwort">false</span>);<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Nun wird die Instanz &uuml;ber diesen Kanal geholt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T _Inst = (T)<span class="objekt">Activator</span>.GetObject(<span class="objekt">typeof</span>(T), <span class="zeichenfolge">&quot;ipc://localhost:9190/GlobalSingleton_&quot;</span> + <span class="schluesselwort">typeof</span>(T).GUID.ToString());<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Inst);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">else</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Es existiert keine Instanz, also wird eine neue Instanz erstellt,<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * der Mutex wird bei Applikationsende wieder freigegeben<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">AppDomain</span>.CurrentDomain.ProcessExit += <span class="schluesselwort">delegate</span>(<span class="schluesselwort">object</span> sender, <span class="objekt">EventArgs </span>e)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">try</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((<span class="objekt">Mutex</span>)ApplicationMutexes[<span class="schluesselwort">typeof</span>(T).GUID]).ReleaseMutex();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">catch </span>{ <span class="kommentar">/* Fehler ignorieren */</span> }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Neue Instanz &uuml;ber Reflektion erstellen</span><br />
			&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			<span class="kommentar">
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Gesch&uuml;tzte Konstruktoren auslesen</span><br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ctorInfo = <span class="schluesselwort">typeof</span>(T).GetConstructor(<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">BindingFlags</span>.NonPublic | <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">BindingFlags</span>.Instance,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span>,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">Type</span>.EmptyTypes,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span><br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			<span class="kommentar">
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Konstruktor ohne Parameter aufrufen<br />
			</span>
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(<span class="schluesselwort">new </span><span class="schluesselwort">object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			<span class="kommentar">
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Instanz der Hashtabelle zuf&uuml;hren</span><br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Instanz);<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ipc Kanal registrieren</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapServerFormatterSinkProvider </span>_ServProv = <span class="schluesselwort">new </span><span class="objekt">SoapServerFormatterSinkProvider</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ServProv.TypeFilterLevel = <span class="objekt">TypeFilterLevel</span>.Full;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapClientFormatterSinkProvider </span>_ClientProv = <span class="schluesselwort">new </span><span class="objekt">SoapClientFormatterSinkProvider</span>();<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Einstellungen f&uuml;r den Kanal werden in einer Hashtabelle abgelegt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">IDictionary </span>_Hashtable = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Hashtable[<span class="zeichenfolge">&quot;portName&quot;</span>] = <span class="zeichenfolge">&quot;localhost:9190&quot;</span>;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Zur Serialisierung wird der Soap-Formatter verwendet</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Channel = <span class="schluesselwort">new </span><span class="objekt">IpcChannel</span>(_Hashtable, _ClientProv, _ServProv);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">ChannelServices</span>.RegisterChannel(_Channel, false);<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Objekt via Ipc Kanal &quot;marshallen&quot;</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">RemotingServices</span>.Marshal((<span class="objekt">MarshalByRefObject</span>)Selfs[<span class="schluesselwort">typeof</span>(T).GUID], <span class="zeichenfolge">&quot;GlobalSingleton_&quot;</span> + <span class="schluesselwort">typeof</span>(T).GUID.ToString());<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			<span class="schluesselwort">
			&nbsp; public static</span> T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="objekt">MarshalByRefObject</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}
			<br />
			<br />
			<br />
			<span class="schluesselwort">public abstract class</span> <span class="objekt">GlobalSingletonBase</span>&lt;T&gt; : <span class="objekt">MarshalByRefObject</span><br />
			&nbsp; <span class="schluesselwort">where </span>T: <span class="objekt">GlobalSingletonBase</span>&lt;T&gt;<br />
			{<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span><span class="objekt">GlobalSingletonProvider</span>.GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>New);<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span>
			<p>
			&nbsp;<br />
			Auf diesem Weg kann nun &uuml;ber Vererbung ein systemweiter Singleton genutzt werden. Das folgende Beispiel zeigt die Verwendung in der Praxis:
			</p>
			<p class="code">
			<span class="schluesselwort">public class</span> <span class="objekt">Start </span>: <span class="objekt">GlobalSingletonBase</span>&lt;<span class="objekt">Start</span>&gt;<br />
			{<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">public </span><span class="objekt">Form </span>WinForm;<br />
			<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">private </span>Start()<br />
			&nbsp;&nbsp;&nbsp; { }<br />
			<br />
			&nbsp;&nbsp;&nbsp; [<span class="objekt">STAThread</span>]<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">static void</span> Main(<span class="schluesselwort">string</span>[] args)<br />
			&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span class="schluesselwort">bool </span>Created;<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">Start </span>MainProcedure = <span class="schluesselwort">Start</span>.GetInstance(<span class="schluesselwort">out </span>Created);<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Applikation starten, falls es sich um die erste Instanz handelt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(Created)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MainProcedure.WinForm = <span class="schluesselwort">new </span><span class="objekt">HauptFormular</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MainProcedure.WinForm.Show();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">Application</span>.Run();<br />
			&nbsp; &nbsp; &nbsp; }<br />
			&nbsp; &nbsp; &nbsp; <span class="schluesselwort">else</span><br />
			&nbsp; &nbsp; &nbsp; {<br />
			&nbsp; &nbsp; &nbsp; &nbsp; <span class="kommentar">// Applikation l&auml;uft bereits, also in den Vordergrund holen</span><br />
			&nbsp; &nbsp; &nbsp; &nbsp; MainProcedure.WinForm.WindowState = <span class="objekt">FormWindowState</span>.Maximized;<br />
			&nbsp; &nbsp; &nbsp; &nbsp; SetForegroundWindow(MainProcedure.WinForm.Handle);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; [<span class="objekt">DllImport</span>(<span class="zeichenfolge">&quot;user32.dll&quot;</span>)]<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">public static extern bool</span> SetForegroundWindow(<span class="objekt">IntPtr </span>Handle);<br />
			}<br />
			<br />
			<span class="schluesselwort">public class </span><span class="objekt">HauptFormular </span>: System.Windows.Forms.<span class="objekt">Form</span><br />
			{<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// ...</span><br />
			}
			</p>
			<br />
			<p>
			An dieser Stelle m&ouml;chte ich mich f&uuml;r's lesen bedanken und hoffe, Ihnen an der ein oder anderen Stelle weitergeholfen zu haben. Dennoch bin ich mir bewusst dar&uuml;ber, dass einfach viele Dinge in diesem Artikel als bekannt vorrausgesetzt werden, daf&uuml;r m&ouml;chte ich mich entschuldigen. Sicher haben Sie Verst&auml;ndnis daf&uuml;r, dass es sich nur um einen kurzen Abriss dessen handelt, was m&ouml;glich ist und nicht um ein Handbuch und ich hoffe, dass bei Unklarheiten die Codebeispiele selbsterkl&auml;rend sind. Ohne Programmierkenntnisse f&auml;llt es sicherlich schwer, alle Gedanken auf anhieb zu verstehen, ich kann Ihnen daher nur empfehlen, diese Beispiele schrittweise nachzuvollziehen.
			</p>
			<p>
			&nbsp;
			</p>
			<hr />
			<a title="fussnoten" name="fussnoten"></a>
			<div style="float: right">
			<a href="front_content.php?idart=37&amp;idcat=4&amp;lang=1&amp;client=1"><img src="upload/grafiken/gplv3-88x31.gif" alt="GPLv3" border="0" /></a>
			</div>
			<sup>1</sup> <a href="http://de.wikipedia.org/wiki/Mutex" target="_blank">Mutex: Wikipedia</a><br />
			<sup>2</sup> <a href="http://de.wikipedia.org/wiki/Marshalling" target="_blank">Marshalling: Wikipedia</a>
			 ]]></description>
		</item>
		<item>
			<title>Implementierung eines Singleton in C#</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,implementierung-des-singleton.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=23</guid>
			<pubDate>Wed, 21 Nov 2007 09:59:24 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Es gibt Situationen, in denen man als Entwickler sicherstellen m&ouml;chte, dass von einer Klasse nur ein Objekt instanziiert werden kann. F&uuml;r diesen Anwendungsfalls gibt es bereits einen L&ouml;sungsansatz: Das Singleton-Pattern<a href="front_content.php?idart=23#fussnoten"><sup>1</sup></a>. Das Prinzip dieses Ansatzes ist recht simpel und beruht unter anderem auf der Nutzung statischer Felder und Methoden. Diese sogenannten statischen Member einer Klasse unterscheiden sich von den Instanzmembern in sofern, als dass sie genutzt werden k&ouml;nnen, ohne explizit ein Objekt zu instanziieren.
			</p>
			<p>
			Am Beispiel C# (Mircosoft .NET Framework 2.0) m&ouml;chte ich an dieser Stelle in zwei Schritten eine Art systemweiten Singleton implementieren, dieser Artikel befasst sich allerdings zun&auml;chst mit dem ersten Schritt: der Implementierung des herk&ouml;mmlichen Singleton. Die Erweiterung einer bestehenden Klasse zum Singleton funktioniert in C# wie folgt:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public class</span> <span class="objekt">Beispiel</span><br />
			{<br />
			&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp; * Dieses statische Feld h&auml;lt unsere Instanz der<br />
			&nbsp;&nbsp; * Klasse<br />
			&nbsp;&nbsp; */<br />
			</span>&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Beispiel</span> _Instanz;<br />
			&nbsp; <br />
			&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp; * Konstruktor der Klasse wird &uuml;ber den Zugriffsmodifizierer<br />
			&nbsp;&nbsp; * &quot;private&quot; gesch&uuml;tzt, um eine Instanziierung der Klasse von<br />
			&nbsp;&nbsp; * au&szlig;en zu unterbinden.<br />
			&nbsp;&nbsp; */<br />
			</span>&nbsp; <span class="schluesselwort">private</span> Beispiel()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// TODO: Implementieren Sie Ihren Konstruktor hier<br />
			</span>&nbsp; }<br />
			&nbsp; <br />
			&nbsp;<span class="kommentar"> /*<br />
			&nbsp;&nbsp; * Statische Methode, die die Instanz der Klasse zur&uuml;ck gibt.<br />
			&nbsp;&nbsp; */<br />
			</span>&nbsp; <span class="schluesselwort">public static</span> <span class="objekt">Beispiel</span> GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp; if (_Instanz == <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp; _Instanz = <span class="schluesselwort">new</span> Beispiel();<br />
			<br />
			&nbsp;&nbsp; <span class="schluesselwort">return</span> _Instanz;<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Anhand dieses Beispiels sehen Sie, dass nur eine Instanz der Klasse Beispiel erzeugt wird und zwar &uuml;ber die statische Methode <span class="inline_code">GetInstance()</span>:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public static void</span> main(<span class="schluesselwort">string</span>[] args)<br />
			{<br />
			&nbsp;<span class="objekt">Beispiel</span> BeispielInstanz = <span class="objekt">Beispiel</span>.GetInstance();<br />
			}<br />
			</span><br />
			<p>
			Der direkte Aufruf von <span class="inline_code">BeispielInstanz = new Beispiel()</span>; ist unzul&auml;ssig, da der Konstruktor der Klasse privat ist.
			</p>
			<p>
			Um auf einfachem Wege ihren Quelltext wiederverwenden zu k&ouml;nnen, lagern wir nun diesen Code in eine Bibliothek aus. Dieses Vorhaben allerdings erscheint nur auf den ersten Blick einfach: &uuml;ber Vererbung. Allerdings kann aus der Basisklasse nicht ohne Weiteres auf die abgeleitete Klasse zugegriffen werden, dies widerspr&auml;che auch dem Sinn von Vererbung, so dass folgendes Vorhaben <u><b>nicht</b></u> funktioniert:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public abstract class</span> <span class="objekt">Singleton</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Singleton</span> _Instanz;<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">private</span> Singleton()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// TODO: Implementieren Sie Ihren Konstruktor hier</span><br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> <span class="objekt">Singleton</span> GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp; if (_Instanz == <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Hier m&uuml;sste die Kindklasse instanziiert werden</span><br />
			&nbsp;&nbsp;&nbsp; _Instanz = <span class="schluesselwort">new</span> ?();<br />
			<br />
			&nbsp;&nbsp; <span class="schluesselwort">return</span> _Instanz;<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Abgesehen von diesem Problem kann eine abgeleitete Klasse so nicht instanziiert werden, da die Basisklasse durch die Verwendung des Schl&uuml;sselwortes <span class="inline_code">private</span> den Konstruktor sch&uuml;tzt, ein Zugriff auf diesen Konstruktor durch Reflektion &uuml;ber die Basisklasse ist allerdings auch nicht m&ouml;glich<a href="front_content.php?idart=23#fussnoten"><sup>2</sup></a>.
			</p>
			<p>
			Das Zauberwort an dieser Stelle lautet Generika<a href="front_content.php?idart=23#fussnoten"><sup>3</sup></a>, denn generische Klassen erlauben es dem Entwickler, Typdefinitionen f&uuml;r ganze Klassen oder Methoden offen zu lassen. Wir entwickeln unser Singleton-Pattern also weiter zu einer statischen Klasse, also einer Klasse, die selbst nicht instanziiert werden kann, die aber unsere Singleton-Objekte verwaltet. Diese Klasse soll den Namen <span class="inline_code">SingletonProvider </span>bekommen. Damit k&uuml;nftig einfach entschieden werden kann, ob es sich um eine neue Instanz handelt oder nicht, erweitern wir gleich unsere Methode <span class="inline_code">GetInstance()</span> um einen boolschen Wert:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">
			public static class</span> <span class="objekt">SingletonProvider</span><br />
			{<br />
			&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp; * Die Hashtabelle Selfs h&auml;lt unsere Instanz-<br />
			&nbsp;&nbsp; * objekte intern im Speicher.<br />
			&nbsp;&nbsp; */</span><br />
			&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Hashtable </span>Selfs = <span class="schluesselwort">new </span>Hashtable();<br />
			&nbsp; <br />
			&nbsp; <span class="kommentar">// Dieses Objekt wird zur Threadsynchronisation verwendet</span><br />
			&nbsp; <span class="schluesselwort">private static object</span> Lock&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span>Object();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">new</span>()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Threadsynchronisation</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * &Uuml;berpr&uuml;fen, ob bereits eine Instanz<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * des generischen Typen T existiert.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * Als Schl&uuml;ssel f&uuml;r die Hashtabelle verwenden<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * wir die GUID des Typen.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; */</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="kommentar">// Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Neue Instanz erstellen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, <span class="schluesselwort">new </span>T());<br />
			&nbsp;&nbsp;&nbsp; &nbsp; New = <span class="schluesselwort">true</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Durch diese Klasse k&ouml;nnen nun auf einfachem Wege Singleton-Objekte erzeugt werden:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public static void</span> main(<span class="schluesselwort">string</span>[] args)<br />
			{<br />
			&nbsp;<span class="schluesselwort">bool</span> neueInstanz;<br />
			&nbsp;<span class="objekt">Beispiel</span> MeinBeispiel = <span class="objekt">SingletonProvider</span>.GetInstance&lt;<span class="objekt">Beispiel</span>&gt;(<span class="schluesselwort">out</span> neueInstanz);<br />
			} <br />
			</span><br />
			<p>
			Die Variable MeinBeispiel enth&auml;lt nun eine neue Instanz der Klasse Beispiel, die Variable neueInstanz ist wahr, falls der SingletonProvider ein neues Objekt erzeugt hat. Der Typ Beispiel ist genau der &quot;L&uuml;ckenf&uuml;ller&quot; f&uuml;r unseren generischen Typen T im Beispiel oben. Einzige Bedingung: Es muss sich um eine Klasse handeln, die einen parameterlosen, &ouml;ffentlichen Konstruktor besitzt (siehe <span class="inline_code">where T: new()</span>). Dies allerdings widerspricht wiederum dem Singleton-Gedanken, denn nun kann wieder eine Instanz der Klasse von Au&szlig;en erzeugt werden: <span class="inline_code">MeinBeispiel = new Beispiel();</span> Der Singleton ist somit ausgehebelt.
			</p>
			<p>
			Wir modifizieren an dieser Stelle unseren SingletonProvider, so dass ausschlie&szlig;lich Klassen mit gesch&uuml;tzten Konstruktoren verwendet werden k&ouml;nnen. Au&szlig;erdem &uuml;berladen wir unsere GetInstance-Methode der Einfachheit halber wie folgt:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">public static class</span> <span class="objekt">SingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Hashtable </span>Selfs = <span class="schluesselwort">new</span> Hashtable();<br />
			&nbsp; <span class="schluesselwort">private static object</span> Lock&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span>Object();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static </span>T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where</span> T: <span class="schluesselwort">class </span><span class="kommentar">// Jede Klasse ist erlaubt</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Threadsynchronisation</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="kommentar">// Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Neue Instanz &uuml;ber Reflektion erstellen</span><br />
			&nbsp; &nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Gesch&uuml;tzte Konstruktoren auslesen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; ctorInfo = <span class="schluesselwort">typeof</span>(T).GetConstructor(<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">BindingFlags</span>.NonPublic | <br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">BindingFlags</span>.Instance,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span>,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">Type</span>.EmptyTypes,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Konstruktor ohne Parameter aufrufen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(<span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Instanz der Hashtabelle zuf&uuml;hren</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Instanz);<br />
			&nbsp;&nbsp;&nbsp; &nbsp; New = <span class="schluesselwort">true</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp; * F&uuml;r den Fall, dass es egal ist,<br />
			&nbsp;&nbsp; * ob es sich um ein neues Objekt handelt<br />
			&nbsp;&nbsp; */</span><br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Nun wird der private parameterlose Konstruktor zur Instanziierung verwendet. Als n&auml;chstes verbieten wir ausdr&uuml;cklich &ouml;ffentliche Konstruktoren und schmei&szlig;en andernfalls einen Fehler:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">public static class</span> <span class="objekt">SingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Hashtable </span>Selfs = <span class="schluesselwort">new </span>Hashtable();<br />
			&nbsp; <span class="schluesselwort">private static object</span> Lock&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span>Object();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class </span><span class="kommentar">// Jede Klasse ist erlaubt</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Auf &ouml;ffentlichen Konstruktor pr&uuml;fen</span><br />
			&nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>checkCtor = (<span class="schluesselwort">typeof</span>(T)).GetConstructor(<span class="objekt">Type</span>.EmptyTypes);<br />
			&nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Falls es einen solchen Konstruktor gibt,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* schmei&szlig;en wir einen Fehler, da es dem <br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Charakter eines Singleton widerspricht.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;*/</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(checkCtor != <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">throw new</span> InvalidOperationException(<span class="zeichenfolge">&quot;Singleton means that you don't have any public constructors&quot;</span>);<br />
			<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Threadsynchronisation</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="kommentar">// Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Neue Instanz &uuml;ber Reflektion erstellen</span><br />
			&nbsp; &nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Gesch&uuml;tzte Konstruktoren auslesen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; ctorInfo = <span class="schluesselwort">typeof</span>(T).GetConstructor(<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">BindingFlags</span>.NonPublic | <br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">BindingFlags</span>.Instance,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span>,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">Type</span>.EmptyTypes,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Konstruktor ohne Parameter aufrufen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(<span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Instanz der Hashtabelle zuf&uuml;hren</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Instanz);<br />
			&nbsp;&nbsp;&nbsp; &nbsp; New = <span class="schluesselwort">true</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Mit Hilfe der obigen Implementierung der SingletonProvider-Klasse lassen sich nun beliebige Singleton-Objekte verwalten:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public class</span> <span class="objekt">Beispiel</span><br />
			{<br />
			<br />
			<span class="schluesselwort">&nbsp;private </span>Beispiel()<br />
			&nbsp;{<br />
			&nbsp; <span class="objekt">Console</span>.WriteLine(<span class="zeichenfolge">&quot;Klasse instanziiert&quot;</span>);<br />
			&nbsp;}<br />
			&nbsp;<br />
			&nbsp;<span class="schluesselwort">public static void</span> main(<span class="schluesselwort">string</span>[] args)<br />
			&nbsp;{<br />
			&nbsp; <span class="objekt">Beispiel </span>MeinBeispiel&nbsp; = <span class="objekt">SingletonProvider</span>&lt;<span class="objekt">Beispiel</span>&gt;.GetInstance();<br />
			&nbsp; <span class="objekt">Beispiel </span>MeinBeispiel2 = <span class="objekt">SingletonProvider</span>&lt;<span class="objekt">Beispiel</span>&gt;.GetInstance();<br />
			&nbsp;}<br />
			}<br />
			</span><br />
			<p>
			Dieses Beispiel erzeugt auf der Konsole einmalig die Ausgabe &quot;Klasse instanziiert&quot;, da der erste Aufruf von <span class="inline_code">GetInstance()</span> eine Instanz erzeugt. Der zweite Aufruf hingegen liefert ganz im Sinne des Singleton das selbe Objekt. Eine Instanz von Au&szlig;en &uuml;ber <span class="inline_code">MeinBeispiel = new Beispiel();</span> ist durch den gesch&uuml;tzten Konstruktor &uuml;brigens nicht mehr m&ouml;glich.
			</p>
			<p>
			M&ouml;chte man nun eine Klasse schreiben, um andere Klassen von dieser &quot;Singleton-Basis&quot; erben zu lassen, bedienen wir uns der oben bereits implementierten Klasse SingletonProvider, der Singleton selbst soll hier allerdings nicht instanziiert werden und ist deshalb abstrakt:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public abstract class</span> <span class="objekt">SingletonBase</span>&lt;T&gt;<br />
			&nbsp; <span class="schluesselwort">where </span>T: <span class="objekt">SingletonBase</span>&lt;T&gt;<br />
			{<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span><span class="objekt">SingletonProvider</span>.GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>New);<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Da, wie oben bereits gesagt, die Elternklasse allerdings nicht auf die Kindklasse schlie&szlig;en kann, werwenden wir f&uuml;r die Anweisung <span class="inline_code">where T: SingletonBase&lt;T&gt;</span>, um den Typen zu &quot;ermitteln&quot;. Dies ist zwar in gewisser Hinsicht eine Redundanz, da eigentlich bereits durch die Vererbung klar ist, dass eine Instanz von &quot;Beispiel&quot; erzeugt werden soll, leider gibt es meiner Ansicht nach aber derzeit keine wesentlich elegantere L&ouml;sung dieses Problems. Das .NET Framework 3.5 l&auml;sst allerdings bereits heute auf sch&ouml;nere Ans&auml;tze hoffen...
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public sealed class</span> <span class="objekt">Beispiel </span>: <span class="objekt">SingletonBase</span>&lt;<span class="objekt">Beispiel</span>&gt;<br />
			{<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">private </span>Beispiel()<br />
			&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;<span class="kommentar">// Konstruktor</span><br />
			&nbsp;&nbsp;&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Instanzen der Klasse k&ouml;nnen nun einfach via <span class="inline_code">Beispiel.GetInstance()</span> geholt werden, eine eigene Instanziierung durch Verwendung des Schl&uuml;sselwortes <span class="inline_code">new()</span> ist nicht mehr m&ouml;glich. Ein Haken allerdings bleibt: Die Klasse sollte versiegelt sein, so dass von ihr nicht weiter geerbt werden kann, denn
			</p>
			<br />
			<span class="code"><span class="schluesselwort">class </span><span class="objekt">GeerbtesBeispiel </span>: <span class="objekt">Beispiel</span><br />
			{ }<br />
			</span><br />
			<p>
			bietet nun auch die statische Methode <span class="inline_code">GetInstance()</span>, die allerdings nach wie vor die Basisklasse Beispiel instanziiert, nicht jedoch GeerbtesBeispiel.&nbsp;
			</p>
			<p>
			Damit nun dieser Artikel nicht noch l&auml;nger wird, als er bisher schon ist, m&ouml;chte ich dieses Beispiel beim n&auml;chsten Mal zu einem systemweiten Singleton ausbauen. Mit Hilfe dieser Methode l&auml;sst sich beispielsweise einfach realisieren, dass eine Anwendung nur einmal gestartet werden kann und jeder weitere Programmstart das bereits ge&ouml;ffnete Fenster in den Vordergrund holt. Dazu allerdings erst beim n&auml;chsten Mal mehr.
			</p>
			<p>
			Abschlie&szlig;end bleibt mir eigentlich nur noch zu sagen, dass es sich bei diesem Artikel lediglich um ein Beispiel einer M&ouml;glichkeit der Umsetzung handelt. Es gibt noch unz&auml;hlige weitere Implementierungen des Singleton, sehen Sie es also als eine Art Inspiration f&uuml;r Ihre Projekte, ich hoffe ich konnte Ihnen jedoch ein wenig bei der L&ouml;sung Ihres Problemes weiterhelfen.
			</p>
			<hr />
			<p>
			<a title="fussnoten" name="fussnoten" id="fussnoten"></a>
			</p>
			<div style="float: right">
			<a href="front_content.php?idart=37&amp;idcat=4&amp;lang=1&amp;client=1"><img src="upload/grafiken/gplv3-88x31.gif" alt="GPLv3" border="0" /></a>
			</div>
			<sup>1</sup> <a href="http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29" target="_blank">Singleton (Entwurfsmuster): Wikipedia
			</a><br />
			<sup>2</sup> <a href="http://msdn2.microsoft.com/de-de/library/cs01xzbk%28VS.80%29.aspx#remarksToggle" target="_blank">Type.GetConstructor-Methode: Microsoft</a><br />
			<sup>3</sup> <a href="http://de.wikipedia.org/wiki/Generischer_Typ" target="_blank">Generische Typen: Wikipedia</a>
			<p>
			&nbsp;
			</p>
			<br />
			<p>
			<b>Siehe auch:</b><br />
			<a href="http://de.wikipedia.org/wiki/Sprachelemente_von_C-Sharp" target="_blank">Sprachelemente von C-Sharp (Wikipedia)</a>
			</p>
			 ]]></description>
		</item>
	</channel>
</rss>