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

<channel>
	<title>AB-WebLog.com&#187; .NET</title>
	<atom:link href="http://www.ab-weblog.com/de/schlagwort/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ab-weblog.com/de</link>
	<description>Andreas Breitschopp</description>
	<lastBuildDate>Mon, 23 Nov 2015 08:51:46 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>DevExpress XPO: Teure SQL-Abfrage beim Aufruf von XPCollection.EndInit()</title>
		<link>http://www.ab-weblog.com/de/devexpress-xpo-teure-sql-abfrage-beim-aufruf-von-xpcollection-endinit/</link>
		<comments>http://www.ab-weblog.com/de/devexpress-xpo-teure-sql-abfrage-beim-aufruf-von-xpcollection-endinit/#comments</comments>
		<pubDate>Sat, 10 Nov 2012 11:04:23 +0000</pubDate>
		<dc:creator>Andreas Breitschopp</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[DevExpress]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[XPO]]></category>

		<guid isPermaLink="false">http://www.ab-weblog.com/de/?p=655</guid>
		<description><![CDATA[Für Projekte in .NET verwende ich sehr gerne die Steuerelemente von DevExpress (Englisch). Darüber hinaus ist DevExpress XPO als Datenbank-Abstraktionsebene sehr nützlich. Jedoch stieß ich in einem aktuellen Projekt auf ein sehr seltsames Problem: Bei einigen Formularen (seltsamerweise nicht bei allen) &#8230; <a href="http://www.ab-weblog.com/de/devexpress-xpo-teure-sql-abfrage-beim-aufruf-von-xpcollection-endinit/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Für Projekte in .NET verwende ich sehr gerne die Steuerelemente von <a title="DevExpress Website" href="http://www.devexpress.com" target="_blank">DevExpress</a> (Englisch). Darüber hinaus ist DevExpress XPO als Datenbank-Abstraktionsebene sehr nützlich.</p>
<p>Jedoch stieß ich in einem aktuellen Projekt auf ein sehr seltsames Problem:</p>
<p>Bei einigen Formularen (seltsamerweise nicht bei allen) wurde eine sehr teure SQL-Abfrage an das Datenbank-Backend gesendet während das Formular geladen wurde. Es war im Prinzip eine SQL-Abfrage, die sämtliche (und ich meine wirklich alle) Datenzeilen von der Datenbank lud, was offensichtlich keine besonders gute Idee ist. Aber wie geschrieben war das nicht für alle Formulare der Fall: Bei den anderen Formularen wurde erwartungsgemäß nur das aktuelle Datenobjekt (die aktuelle Zeile der Tabelle) geladen.</p>
<p>Natürlich kontaktierte ich zunächst den immer sehr schnellen und hilfreichen DevExpress-Support. Sie haben untersucht, was die Datenabfrage auslöst und festgestellt, dass die Eigenschaft XPCollection.Count von dem CurrencyManager nach dem Methodenaufruf Control.UpdateBindings angefordert wird. Da dies etwas innerhalb des .NET Frameworks ist, konnten sie daran leider nichts ändern.</p>
<p>Sie schlugen vor die XPCollection nicht zur Design-Zeit zu setzen. Dies hätte jedoch bedeutet, dass ich die Formulare nicht mehr mit dem Windows-Formular-Designer erstellen könnte. Das wäre ganz schlecht, da ich viele große Formular in diesem Projekt habe, die ich sicherlich nicht alle im Quelltext erstellen möchte.</p>
<p>Ich fand jedoch einen andere Weg – ich nenne das nicht eine Lösung, nur ein Work-Around –, um den Designer weiterhin verwenden zu können:</p>
<p>Hierzu habe ich einfach zwei Batch-Dateien (unter Verwendung des Kommandozeilen-Ersetzungstools namens <a title="Webseite von FART" href="http://fart-it.sourceforge.net" target="_blank">FART</a> (Englisch)) geschrieben: Eine, die ausgeführt wird bevor das Build beginnt und sicherstellt, dass keine XPCollection innerhalb der Methode InitializeComponent initialisiert wird (und dabei einfach die Quelltextzeilen auskommentiert), und eine zweite, die nach dem Build läuft und die Änderungen wieder rückgängig macht.</p>
<p>Hier ist der Inhalt der Pre-Build-Batch-Datei:</p>
<pre>%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;this.xpKern = new DevExpress.Xpo.XPCollection(this.components);&quot; &quot;\x2f\x2fthis.xpKern = new DevExpress.Xpo.XPCollection(this.components);&quot;
%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;((System.ComponentModel.ISupportInitialize)(this.xpKern)).BeginInit();&quot; &quot;\x2f\x2f((System.ComponentModel.ISupportInitialize)(this.xpKern)).BeginInit();&quot;
%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;this.xpKern.ObjectType = typeof(Administration.Daten.Kern);&quot; &quot;\x2f\x2fthis.xpKern.ObjectType = typeof(Administration.Daten.Kern);&quot;
%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;this.xpKern.Session = this.unitOfWork;&quot; &quot;\x2f\x2fthis.xpKern.Session = this.unitOfWork;&quot;
%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;((System.ComponentModel.ISupportInitialize)(this.xpKern)).EndInit();&quot; &quot;\x2f\x2f((System.ComponentModel.ISupportInitialize)(this.xpKern)).EndInit();&quot;

@exit 0</pre>
<p>Und die Post-Build-Datei, welche die Änderungen wieder rückgängig macht:</p>
<pre>%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;\x2f\x2fthis.xpKern = new DevExpress.Xpo.XPCollection(this.components);&quot; &quot;this.xpKern = new DevExpress.Xpo.XPCollection(this.components);&quot;
%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;\x2f\x2f((System.ComponentModel.ISupportInitialize)(this.xpKern)).BeginInit();&quot; &quot;((System.ComponentModel.ISupportInitialize)(this.xpKern)).BeginInit();&quot;
%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;\x2f\x2fthis.xpKern.ObjectType = typeof(Administration.Daten.Kern);&quot; &quot;this.xpKern.ObjectType = typeof(Administration.Daten.Kern);&quot;
%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;\x2f\x2fthis.xpKern.Session = this.unitOfWork;&quot; &quot;this.xpKern.Session = this.unitOfWork;&quot;
%1Tools\fart.exe -r -C &quot;%1*.designer.cs&quot; &quot;\x2f\x2f((System.ComponentModel.ISupportInitialize)(this.xpKern)).EndInit();&quot; &quot;((System.ComponentModel.ISupportInitialize)(this.xpKern)).EndInit();&quot;

@exit 0</pre>
<p>Das <code>@exit 0</code> am Ende dieser ist wichtig, da ansonsten ein Code 2 zurückgegeben wird (warum auch immer) und das Visual-Studio-Build-System sich bei jedem Build darüber beschwert.</p>
<p>Nun müssen Sie nur doch diese Batch-Dateien in den Visual-Studio-Buildereignissen mit</p>
<pre>$(ProjectDir)Tools\PreBuild.bat $(ProjectDir)</pre>
<p>beziehungsweise</p>
<pre>$(ProjectDir)Tools\PostBuild.bat $(ProjectDir)</pre>
<p>aufrufen.</p>
<p>Ich weiß, dass dies keine besonders gute &#8220;Lösung&#8221; ist, aber das war die einzige Idee, die ich hatte, dass ich weiterhin den Formular-Designer verwenden kann und trotzdem diese teuren SQL-Anfragen vermeide.</p>
<p><em>Hatten Sie bereits einmal dieses Problem und vielleicht sogar eine bessere Lösung dafür? Ich freue mich über jeden anderen Vorschlag zu diesem Thema!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ab-weblog.com/de/devexpress-xpo-teure-sql-abfrage-beim-aufruf-von-xpcollection-endinit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spartakiade-Konferenz in Berlin</title>
		<link>http://www.ab-weblog.com/de/spartakiade-konferenz-in-berlin/</link>
		<comments>http://www.ab-weblog.com/de/spartakiade-konferenz-in-berlin/#comments</comments>
		<pubDate>Wed, 09 May 2012 09:23:29 +0000</pubDate>
		<dc:creator>Andreas Breitschopp</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Intel AppUp]]></category>
		<category><![CDATA[AppUp]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Intel]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Vortrag]]></category>

		<guid isPermaLink="false">http://www.ab-weblog.com/de/?p=490</guid>
		<description><![CDATA[Ich wurde eingeladen bei der Spartakiade-Konferenz in Berlin als Trainer teilzunehmen. Dort werde ich eine Session über &#8220;Intel AppUp &#8211; Deine HTML5-/.NET-App im App-Store&#8221; anbieten: Möchte man als Entwickler sein Produkt an die Frau oder den Mann bringen, so ist &#8230; <a href="http://www.ab-weblog.com/de/spartakiade-konferenz-in-berlin/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich wurde eingeladen bei der <a title="Webseite der Spartakiade-Konferenz" href="http://spartakiade.org/2012/MainPage.ashx" target="_blank">Spartakiade-Konferenz</a> in Berlin als Trainer teilzunehmen.</p>
<p>Dort werde ich eine Session über &#8220;Intel AppUp &#8211; Deine HTML5-/.NET-App im App-Store&#8221; anbieten:</p>
<blockquote><p>Möchte man als Entwickler sein Produkt an die Frau oder den Mann bringen, so ist jeder neue Vertriebsweg willkommen. Einer davon ist der von Intel betriebene App-Store AppUp, der auf vielen heute verkauften Notebooks (z. B. von notebooksbilliger.de) bereits vorinstalliert ist. In dieser Session zeigt Andreas Breitschopp wie eine vorhandene HTML5- oder .NET-App fit für AppUp gemacht wird. Gerne dürfen die Teilnehmer auch eigene Produkte mitbringen, die dann gemeinsam zur Veröffentlichung auf AppUp vorbereitet werden.</p></blockquote>
<p>Natürlich gibt es bei der Konferenz auch andere interessante Themen und die Teilnahme ist kostenlos.</p>
<p><em>Daher würde ich mich freuen auch Sie dort zu treffen!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ab-weblog.com/de/spartakiade-konferenz-in-berlin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RemotingException bei Verwendung von IPC mit .NET</title>
		<link>http://www.ab-weblog.com/de/remotingexception-bei-verwendung-von-ipc-mit-net/</link>
		<comments>http://www.ab-weblog.com/de/remotingexception-bei-verwendung-von-ipc-mit-net/#comments</comments>
		<pubDate>Sat, 12 Nov 2011 23:14:12 +0000</pubDate>
		<dc:creator>Andreas Breitschopp</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Dienst]]></category>
		<category><![CDATA[IPC]]></category>
		<category><![CDATA[Remoting]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>

		<guid isPermaLink="false">http://www.ab-weblog.com/de/?p=369</guid>
		<description><![CDATA[In einem Projekt verwende ich IPC (Inter Process Communication) zur gemeinsamen Benutzung von Objekten eines Windows-Dienstes mit einer Client-Anwendung. Das funktioniert stets problemlos, wenn die Client-Anwendung das erste Mal startete und die Objekte des Windows-Dienste aufrief. Aber nachdem die Client-Anwendung &#8230; <a href="http://www.ab-weblog.com/de/remotingexception-bei-verwendung-von-ipc-mit-net/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In einem Projekt verwende ich IPC (Inter Process Communication) zur gemeinsamen Benutzung von Objekten eines Windows-Dienstes mit einer Client-Anwendung.</p>
<p>Das funktioniert stets problemlos, wenn die Client-Anwendung das erste Mal startete und die Objekte des Windows-Dienste aufrief. Aber nachdem die Client-Anwendung einige Minuten später neu gestartet wurde (ohne den Dienst neu zu starten), kam es zu einer <em>RemotingException</em> mit dieser seltsamen Fehlermeldung:</p>
<pre class="brush: text; gutter: false">Fehler beim Schreiben auf einen IPC-Port. Die Pipe wird gerade geschlossen.</pre>
<p>Es hat eine ganze Weile gedauert bis ich das Problem gefunden habe:<br />
Da es für meinen Dienst sehr wichtig ist wirklich nur eine Instanz des Remote-Objektes für die gesamte Lebensdauer des Dienstes zu haben, verwendete ich <em>RemotingServices.Marshal</em>, um ein zuvor instanziiertes Objekt zu registrieren. Jedoch wusste ich nicht, dass bei der Registrierung mit dieser Methode die Objekte standardmäßig nur eine sehr kurze Zeit (eine Minute) gültig bleiben.</p>
<p>Um das zu korrigieren, muss die Methode <em>MarshalByRefObject.InitializeLifetimeService</em> innerhalb des Remote-Server-Objektes wie folgt überschrieben werden:</p>
<pre class="brush: csharp; gutter: true">public override Object InitializeLifetimeService()
{
	ILease lease = (ILease)base.InitializeLifetimeService();
	if (lease.CurrentState == LeaseState.Initial)
	{
		lease.InitialLeaseTime = TimeSpan.FromDays(365);
		lease.SponsorshipTimeout = TimeSpan.FromDays(365);
		lease.RenewOnCallTime = TimeSpan.FromDays(365);
	}
	return lease;
}</pre>
<p>Und hier dasselbe für Entwickler mit VB .NET:</p>
<pre class="brush: vbnet; gutter: true">Public Overrides Function InitializeLifetimeService() As Object
	Dim lease As ILease = CType(MyBase.InitializeLifetimeService(), ILease)
	If lease.CurrentState = LeaseState.Initial Then
		lease.InitialLeaseTime = TimeSpan.FromDays(365)
		lease.SponsorshipTimeout = TimeSpan.FromDays(365)
		lease.RenewOnCallTime = TimeSpan.FromDays(365)
	End If
	Return lease
End Function</pre>
<p>OK, 365 Tage sind vielleicht etwas übertrieben, aber so können Sie sicher sein, dass Ihre Remote-Objekte so schnell nicht verfallen werden. <img src='http://www.ab-weblog.com/de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Haben Sie diese Problem selbst auch schon einmal gehabt?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ab-weblog.com/de/remotingexception-bei-verwendung-von-ipc-mit-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio Formular-Designer mit von abstrakten Klassen abgeleiteten Formularen verwenden</title>
		<link>http://www.ab-weblog.com/de/visual-studio-formular-designer-mit-von-abstrakten-klassen-abgeleiteten-formularen-verwenden/</link>
		<comments>http://www.ab-weblog.com/de/visual-studio-formular-designer-mit-von-abstrakten-klassen-abgeleiteten-formularen-verwenden/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 13:31:24 +0000</pubDate>
		<dc:creator>Andreas Breitschopp</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Formular-Designer]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.ab-weblog.com/de/?p=327</guid>
		<description><![CDATA[Für ein aktuelles Projekt wollte ich eine abstrakte Formular-Basisklasse erstellen. Dadurch kann einiges an allgemeiner Funktionalität von allen Formularen geerbt und Schnittstellenmethoden können definiert werden. Das Ergebnis war jedoch folgende Fehlermeldung, sobald ich versuchte eine meiner abgeleiteten Formularklassen in dem &#8230; <a href="http://www.ab-weblog.com/de/visual-studio-formular-designer-mit-von-abstrakten-klassen-abgeleiteten-formularen-verwenden/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Für ein aktuelles Projekt wollte ich eine abstrakte Formular-Basisklasse erstellen. Dadurch kann einiges an allgemeiner Funktionalität von allen Formularen geerbt und Schnittstellenmethoden können definiert werden.</p>
<p>Das Ergebnis war jedoch folgende Fehlermeldung, sobald ich versuchte eine meiner abgeleiteten Formularklassen in dem Formular-Designer des Visual Studios zu öffnen:</p>
<pre class="brush: text; gutter: false">Der Designer kann keine Instanz des Typs &lt;Typname&gt; erstellen, da dieser als abstrakt deklariert ist.</pre>
<p>Daraufhin suchte ich eine Lösung im Internet und es scheint als wäre ich nicht der Einzige, der die Idee hatte einige Formularklassen von einer abstrakten Basisklasse abzuleiten. Um das Problem zu lösen, erstellte ich eine Dummy-Implementierung von meiner abstrakten Basisklasse und leitete die Formularklassen von dieser Dummy-Implementierung ab. Dadurch konnten die Formularklassen wieder im Visual Studio Formular-Designer angezeigt werden.</p>
<p>In C# sehen die Klassen nun so aus:</p>
<pre class="brush: csharp; gutter: true">public abstract partial class BaseForm : Form
{
  // Methoden der abstrakten Basisklasse...
}

#if DEBUG
public class BaseFormImpl : BaseForm
{
  // Dummy-Implementierung der abstrakten BaseForm-Klasse.
}
#endif

#if DEBUG
public partial class RealForm : BaseFormImpl
#else
public partial class RealForm : BaseForm
#endif
{
  // Eins der Formular, das das Basis-Formular erweitert.
}</pre>
<p>Und für Entwickler mit VB .NET sieht es so aus:</p>
<pre class="brush: vbnet; gutter: true">Public MustInherit Partial Class BaseForm
  Inherits Form
  ' Methoden der abstrakten Basisklasse...
End Class

#if DEBUG
Public Class BaseFormImpl
  Inherits BaseForm
  ' Dummy-Implementierung der abstrakten BaseForm-Klasse.
End Class
#endif

Public Partial Class RealForm
#if DEBUG
  Inherits BaseFormImpl
#else
  Inherits BaseForm
#endif
  ' Eins der Formular, das das Basis-Formular erweitert.
End Class</pre>
<p>Nun sind Ihnen sicherlich die Compiler-Anweisungen aufgefallen: Natürlich wären diese nicht erforderlich, damit die Formulare wieder korrekt im Formular-Designer funktionieren. Jedoch mag ich keinen unnötigen Quelltext im veröffentlichten Produkt (und diese Dummy-Implementierung der abstrakten <em>BaseForm</em>-Klasse ist wirklich nutzlos). Daher habe ich diese bedingten Compiler-Anweisungen verwendet, um sicherzustellen, dass diese Dummy-Klasse wirklich nur im Debug-Modus verwendet wird.</p>
<p><em>Sind Sie selbst auch bereits einmal auf dieses Problem gestoßen?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ab-weblog.com/de/visual-studio-formular-designer-mit-von-abstrakten-klassen-abgeleiteten-formularen-verwenden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formel-Parser für .NET</title>
		<link>http://www.ab-weblog.com/de/formel-parser-fuer-dotnet/</link>
		<comments>http://www.ab-weblog.com/de/formel-parser-fuer-dotnet/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 15:54:49 +0000</pubDate>
		<dc:creator>Andreas Breitschopp</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Mathematik]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>

		<guid isPermaLink="false">http://www.ab-weblog.com/de/?p=1</guid>
		<description><![CDATA[Für ein neues Softwareprojekt war ich auf der Suche nach einem guten Formel-Parser für .NET. Neben dem Parsen und Auswerten von Formeln mit allen gängigen mathematischen Funktionen (wie Sinus, Cosinus, Logarithmus, &#8230;) sollte es auch möglich sein Variablen in den &#8230; <a href="http://www.ab-weblog.com/de/formel-parser-fuer-dotnet/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Für ein neues Softwareprojekt war ich auf der Suche nach einem guten Formel-Parser für .NET.</p>
<p>Neben dem Parsen und Auswerten von Formeln mit allen gängigen mathematischen Funktionen (wie Sinus, Cosinus, Logarithmus, &#8230;) sollte es auch möglich sein Variablen in den Formeln zu verwenden.</p>
<p>Die beste Lösung, die ich fand, ist diese hier:<br />
<a href="http://www.lundin.info/mathparser.asp" target="_blank">http://www.lundin.info/mathparser.asp</a> (Englisch)</p>
<p>Die Verwendung ist sehr einfach; hier ein Beispiel-Code in C#:</p>
<pre class="brush: csharp; gutter: true">// Parser instanziieren
ExpressionParser parser = new ExpressionParser();

// Erstellen einer Hashtable für die Werte
Hashtable h = new Hashtable();

// Variablen und Werte zur Hashtable hinzufügen
h.Add("x", 1.ToString());
h.Add("y", 2.ToString());

// Parsen und Ergebnis holen
double result = parser.Parse("xcos(y)", h);</pre>
<p>Und für diejenigen, die Visual Basic .NET bevorzugen:</p>
<pre class="brush: vbnet; gutter: true">' Parser instanziieren
Dim parser As New ExpressionParser()

' Erstellen einer Hashtable für die Werte
Dim h As New Hashtable()

' Variablen und Werte zur Hashtable hinzufügen
h.Add("x", 1.ToString())
h.Add("y", 2.ToString())

' Parsen und Ergebnis holen
Dim result As Double
result = parser.Parse("xcos(y)", h)</pre>
<p>Es ist wichtig, dass die Werte dabei stets als String zur Hashtable der Variablen hinzugefügt werden. Der Grund dafür ist, dass diese intern einfach in die Formel eingefügt werden, bevor diese geparst wird &#8211; entsprechend müssen sie natürlich vom Typ String sein.</p>
<p>Die kostenlose Bibliothek is Open-Source und unter der LGPL lizensiert. Dadurch kann sie auch in kommerziellen Projekten eingesetzt werden, solange sie dynamisch als externe Bibliothek eingebunden wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ab-weblog.com/de/formel-parser-fuer-dotnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einfacher Sinus-Generator für .NET</title>
		<link>http://www.ab-weblog.com/de/einfacher-sinus-generator-fuer-net/</link>
		<comments>http://www.ab-weblog.com/de/einfacher-sinus-generator-fuer-net/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 12:08:56 +0000</pubDate>
		<dc:creator>Andreas Breitschopp</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[Mathematik]]></category>
		<category><![CDATA[Sinus]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>

		<guid isPermaLink="false">http://www.ab-weblog.com/de/?p=125</guid>
		<description><![CDATA[In diesem Artikel möchte ich zeigen, wie man einen einfachen Sinus-Generator in .NET erstellen kann. Zunächst ein Quelltextausschnitt, danach erkläre ich, was es damit aufsich hat: const double frequency = 1000; const double amplitude = 20000; const long sampleRate = &#8230; <a href="http://www.ab-weblog.com/de/einfacher-sinus-generator-fuer-net/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In diesem Artikel möchte ich zeigen, wie man einen einfachen Sinus-Generator in .NET erstellen kann.</p>
<p>Zunächst ein Quelltextausschnitt, danach erkläre ich, was es damit aufsich hat:</p>
<pre class="brush: csharp; gutter: true">const double frequency	= 1000;
const double amplitude	= 20000;
const long sampleRate	= 44100;
const int durationSec	= 5;

long sampleCount = sampleRate * durationSec;

double timeStep = 1.0 / (double)sampleRate;

double time = 0;
int[] values = new int[sampleCount];
for (long i = 0; i &lt; sampleCount; i++) {
	values[i] = (int)(amplitude * Math.Sin(2 * Math.PI * frequency * time));
	time = time + timeStep;
}</pre>
<p>Gut, nun also ein paar Erklärungen:</p>
<ul>
<li>Zeilen 1-4: Einige Konstanten, die geändert werden können, um z. B. die Frequenz anzupassen.<br />
<em>Hinweis:</em> Die Frequenz kann maximal die Hälfte der Abtastrate betragen.</li>
<li>Zeile 6: Berechnung der Anzahl an Abtastpunkten.</li>
<li>Zeile 8: Berechnung der Zeit zwischen zwei Abtastpunkten.</li>
<li>Zeilen 10-11: Ein paar Variablen-Initialisierungen.</li>
<li>Zeilen 12-15: Hier wird schlussendlich der Wert für jeden Abtastpunkt berechnet.</li>
</ul>
<p>Und nun noch der entsprechende Quelltext für Visual Basic .NET:</p>
<pre class="brush: vbnet; gutter: true">const frequency as double		= 1000
const amplitude as double		= 20000
const sampleRate As Long		= 44100
const durationSec As Integer	= 5

Dim sampleCount As Long
sampleCount = sampleRate * durationSec

Dim timeStep As Double
timeStep = 1.0 / sampleRate

Dim time As Double = 0
Dim values(0 To sampleCount - 1) As Integer
For i As Long = 0 To sampleCount - 1
	values(i) = amplitude * Math.Sin(2 * Math.PI * frequency * time)
	time = time + timeStep
Next i</pre>
<p>Um das Ganze abzuspielen, kann man nun entweden einen API-Aufruf wie <em>PlaySound</em> (von <em>winmm.dll</em>) oder die Lösung <a title="Article about .NET sound class" href="http://www.codeproject.com/KB/audio-video/CPIAudio.aspx" target="_blank">dieses super Artikels</a> (Englisch) verwenden.</p>
<p>Haben Sie auch bereits einmal einen Sinus in .NET generieren müssen?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ab-weblog.com/de/einfacher-sinus-generator-fuer-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entwicklung einer Browser-Toolbar: Microsoft Internet Explorer (3/5)</title>
		<link>http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-microsoft-internet-explorer/</link>
		<comments>http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-microsoft-internet-explorer/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 15:00:19 +0000</pubDate>
		<dc:creator>Andreas Breitschopp</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASPects]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Toolbar]]></category>
		<category><![CDATA[Veröffentlichung]]></category>

		<guid isPermaLink="false">http://www.ab-weblog.com/de/?p=295</guid>
		<description><![CDATA[Diese Artikelserie ist die deutsche Übersetzung meines Artikels &#8220;Developing a Browser Toolbar&#8221;, der in den ASPects (Englisch) im Januar 2010 (Jahrgang 23, Ausgabe 1), ein Magazin der Association of Shareware Professionals (ASP; Englisch), veröffentlicht wurde. Die erste zu treffende Entscheidung &#8230; <a href="http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-microsoft-internet-explorer/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em><em>Diese Artikelserie ist die deutsche Übersetzung meines Artikels &#8220;Developing a Browser Toolbar&#8221;, der in den <a title="Webseite von ASPects" href="http://www.asp-shareware.org/about/aspects.asp" target="_blank">ASPects</a> (Englisch) im Januar 2010 (Jahrgang 23, Ausgabe 1), ein Magazin der <a title="Webseite der Association of Shareware Professionals" href="http://www.asp-shareware.org/" target="_blank">Association of Shareware Professionals</a> (ASP; Englisch), veröffentlicht wurde.</em></em></p>
<p>Die erste zu treffende Entscheidung ist die Programmiersprache, welche Sie für die Entwiclung der Internet-Explorer-Toolbar verwenden möchten. Bei meinen Recherchen im Internet fand ich Beispiele für C++, Visual Basic 6 und .NET. Es scheint einige Visual-Style-Probleme zu geben, wodurch die Toolbar bei System mit Windows Vista und Windows 7 nicht sonderlich gut aussieht, wenn C++ verwendet wird. Und nachdem ich wirklich keine Lust hatte noch in Visual Basic 6 zu entwickeln, entschied ich mich für .NET. Der einzige Nachteil dieser Entscheidung war, dass der Benutzer das .NET Framework 2.0 (oder neuer) auf seinem System installiert haben muss. Damit kann ich jedoch leben, da es bereits sehr verbreitet ist.</p>
<p>Aufgrund dessen, dass fast alle meine Produkte in .NET entwickelt sind, hatte ich bereits Visual Studio 2008 auf meinem Computer installiert. Falls Sie das nicht haben, benötigen Sie zumindest die <a title="Webseite der Microsoft Visual Studio Express Edition" href="http://www.microsoft.com/germany/express/" target="_blank">Express Edition</a> (Version 2005 sollte auch ausreichen) für die nächsten Schritte. Ich entschied die Toolbar in C# zu entwickeln, aber mit Visual Basic .NET ginge das selbstverständlich auch.</p>
<p>Als ein guter Ausgangspunkt fand ich <a title="Explorer-Erweiterung mit Band Objects unter Verwendung von .NET und Windows Forms" href="http://www.codeproject.com/KB/shell/dotnetbandobjects.aspx" target="_blank">diesen</a> (Englisch) und <a title="Internet-Explorer-Toolbar-Erstellung" href="http://www.codeproject.com/KB/shell/IEToolbar.aspx" target="_blank">diesen</a> (Englisch) Artikel auf der Code-Project-Webseite. Falls Sie mehr über die COM-Komponente wissen möchten, können Sie auch das <a title="Internet Explorer Toolbar (Deskband) Tutorial" href="http://www.codeproject.com/KB/shell/ietoolbartutorial.aspx" target="_blank">C++-Tutorial</a> (Englisch) lesen, aber das ist nicht unbedingt erforderlich. Unter Verwendung der Beispiel-Quelltexte dieser beiden Artikel, sollten Sie eine funktionierende Toolbar erhalten – zumindest auf einem Windows-XP-System. Jedoch stieß ich auf einige Probleme, die behoben werden mussten und die ich daher im Folgenden näher beschreiben werde:</p>
<h2>Sicherstellen, dass die Toolbar auf sämtlichen Betriebssystemen korrekt angezeigt wird</h2>
<p>Mit dem Demo-Quelltext der oben erwähnten Artikel habe ich die Toolbar ziemlich schnell auf meinem Windows-XP-Testrechner zum Laufen bekommen. Naiverweise ging ich davon aus, dass die Toolbar, die auf Windows XP mit Internet Explorer 8 korrekt funktioniert, auch auf Windows Vista und Windows 7 mit derselben Internet-Explorer-Version funktionieren würde. Aber tatsächlich musste ich lernen, dass dies absolut nicht der Fall ist! Sie wurde entweder überhaupt nicht dargestellt oder soweit auf der rechten Seite, dass man sie nur mit einer horizontalen Auflösung von mindestens 2.000 Pixel sehen konnte. Somit musste ich nach einer Lösung suchen, jedoch die meisten Quelltextänderungen führten nur dazu, dass die Toolbar entweder auf dem einen oder dem anderen Betriebssystem beziehungsweise der einen oder anderen Browserversion funktionierte. Nach einigen Stunden frustrierendem Testen, habe ich die <em>GetBandInfo</em>-Funktion der <em>BandObjectsLib</em>-Klasse wie folgt geändert. Obwohl ich nach wie vor nicht ganz sicher bin weswegen, so funktioniert es nun auf allen Betriebssysteme problemlos:</p>
<pre class="brush: csharp; gutter: true">public virtual void GetBandInfo(UInt32 dwBandID, UInt32 dwViewMode, ref DESKBANDINFO dbi)
{
    if ((dbi.dwMask &amp; DBIM.MINSIZE) != 0)
    {
        dbi.ptMinSize.X = this.MinimumSize.Width;
        dbi.ptMinSize.Y = this.MinimumSize.Height;
    }

    if ((dbi.dwMask &amp; DBIM.MAXSIZE) != 0)
    {
        dbi.ptMaxSize.X = this.MaximumSize.Width;
        dbi.ptMaxSize.Y = this.MaximumSize.Height;
    }

    if ((dbi.dwMask &amp; DBIM.ACTUAL) != 0)
    {
        dbi.ptActual.X = this.Size.Width;
        dbi.ptActual.Y = this.Size.Height;
    }

    if ((dbi.dwMask &amp; DBIM.BKCOLOR) != 0)
    {
        dbi.dwMask &amp;= ~DBIM.BKCOLOR;
    }

    dbi.dwModeFlags = DBIMF.BREAK;
}</pre>
<h2>Hübschere Darstellung auf Windows XP und neuer</h2>
<p>Wenn Sie den folgenden Ereignis-Handler in der <em>BandObjectsLib</em>-Klasse nicht hinzufügen, wird Ihre Toolbar zwar dennoch funktionieren, aber einfach nicht sonderlich schön auf Windows XP und neuer aussehen. Die <em>if</em>-Anweisung in der Ereignisfunktion stellt dabei sicher, dass die Toolbar auch auf älteren Betriebssystemen wie Windows 98, 2000 und ME nach wie vor funktioniert. Ansonsten würde es zu einer Ausnahme auf diesen Betriebssystemen kommen. Hier ist der Quelltext, den ich verwendet habe, um es auf sämtliche Betriebssystem korrekt zum Laufen zu bringen:</p>
<pre class="brush: csharp; gutter: true">[DllImport("uxtheme", ExactSpelling = true)]
public extern static Int32 DrawThemeParentBackground(IntPtr hWnd, IntPtr hdc,
                                                     ref Rectangle pRect);

protected override void OnPaintBackground(PaintEventArgs e)
{
    if (System.Environment.OSVersion.Platform &gt;= PlatformID.Win32NT &amp;&amp;
           (Environment.OSVersion.Version.Major == 5 &amp;&amp;
            Environment.OSVersion.Version.Minor &gt;= 1 ||
            Environment.OSVersion.Version.Major &gt;= 6) &amp;&amp;
           this.BackColor == Color.Transparent)
    {
        // Only if operating system is Windows XP or higher
        IntPtr hdc = e.Graphics.GetHdc();
        Rectangle rec = new Rectangle(e.ClipRectangle.Left,
            e.ClipRectangle.Top, e.ClipRectangle.Width, e.ClipRectangle.Height);
        DrawThemeParentBackground(this.Handle, hdc, ref rec);
        e.Graphics.ReleaseHdc(hdc);
    }
    else
    {
        base.OnPaintBackground(e);
    }
}</pre>
<h2>Keine Serialisierung erlaubt</h2>
<p>Bei der Entwicklung einer Firefox-Toolbar können Sie den Mozilla-Preferences-Dienst verwenden, um benutzerdefinierte Werte direkt innerhalb Firefox abzuspeichern und zu laden. Da es im Internet Explorer kein Gegenstück dazu gibt und ich XML-Serialisierung in vielen anderen .NET-Produkten verwende, wollte ich diese in dem Toolbar-Projekt ebenfalls verwenden. Auf den ersten Blick funktionierte das auch einwandfrei, aber wenn im Internet Explorer 8 der <em>Protected Mode</em> aktiviert ist (und das ist er standardmäßig, zumindest seit Windows Vista), bekommt der Benutzer ein hässliches Warnungsfenster jedes Mal angezeigt, wenn die Toolbar initialisiert wird. Den Grund dafür werde ich nun nicht im Detail erläutern; verwenden Sie einfach keine Serialisierung in Internet-Explorer-Toolbars. Sie können benutzerdefinierte Werte entweder ohne Serialisierung im Dateisystem unterhalb des lokalen Anwendungsdatenverzeichnisses abspeichern oder einfach die Registry verwenden.</p>
<h2>Automatisches Online-Update</h2>
<p>Wie in der Firefox-Version, wollte ich auch, dass die Internet-Explorer-Toolbar eine automatische Update-Funktion beinhaltet. Da es jedoch kein Update-System für Toolbars wie im Firefox gibt, musste ich ein eigenes implementieren. Dies ist jedoch relativ einfach, zumal man – wie auch in anderen .NET-Anwendungen – einfach die <em>WebClient</em>-Klasse verwenden kann, um zunächst eine HTTP-Anfrage zu machen, ob ein Update verfügbar ist, und um danach die Update-Datei herunterzuladen, falls erforderlich. Auf der Serverseite nutze ich eine kleines PHP-Skript, das sich um die Update-Anfrage kümmert. Die Update-Datei, die heruntergeladen wird, ist die normale Setup-Datei, welche einfach sämtliche Dateien mit neuen überschreibt. Das Einzige, auf was Sie achten müssen, ist die Art und Weise, wie Sie die ausführbare Setup-Datei nach dem Download aufrufen, da ansonsten ein Dialog der Benutzerkontensteuerung (UAC) angezeigt wird. Ich habe folgende Prozedur geschrieben, die Sie verwenden können, um eine Datei aus der Toolbar heraus auszuführen, ohne dass irgendeine Warnung dem Benutzer angezeigt wird:</p>
<pre class="brush: csharp; gutter: true">private void startProcess(string fileName, string arguments)
{
    System.Diagnostics.ProcessStartInfo startInfo =
        new System.Diagnostics.ProcessStartInfo();
    startInfo.UseShellExecute = true;
    startInfo.WorkingDirectory = Environment.CurrentDirectory;
    startInfo.FileName = fileName;
    if (Environment.OSVersion.Platform &gt;= PlatformID.Win32NT &amp;&amp;
            Environment.OSVersion.Version.Major &gt;= 6)
        // Only if operating system is Windows Vista or higher
        startInfo.Verb = "runas";
    else
        startInfo.Verb = "open";
    startInfo.Arguments = arguments;
    startInfo.ErrorDialog = true;
    try
    {
        System.Diagnostics.Process process = System.Diagnostics.Process.Start(startInfo);
        process.WaitForExit();

        MessageBox.Show(objToolbarData["msg.restartBrowserText"],
                        objToolbarData["msg.restartBrowserTitle"],
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        if (debugMode) MessageBox.Show(ex.ToString());
    }
}</pre>
<h2>Deinstallationsschaltfläche innerhalb der Toolbar</h2>
<p>Das war das Einzige, was im Internet Explorer einfacher zu implementieren war als im Firefox; es muss lediglich das Deinstallationsprogramm (wieder mit der <em>startProcess</em>-Prozedur von oben) des Installationssystems (siehe nächster Post###) ausgeführt werden, um die Toolbar wieder zu deinstallieren. Nach einem Browser-Neustart wird sie dann nicht mehr angezeigt (wie auch beim Firefox).</p>
<p>Geschafft; die Internet-Explorer-Version von unserer Toolbar ist nun auch fertig! Sie wird mit Internet Explorer 6 oder neuer auf Windows 98 oder neuer mit installiertem .NET Framework 2.0 funktionieren.</p>
<p>Im <a title="Entwicklung einer Browser-Toolbar: Installationssystem (4/5)" href="http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-installationssystem/">nächsten Artikel</a> werde ich erklären, wie die Toolbars installiert werden.</p>
<h2>Inhalt der Artikelserie &#8220;Entwicklung einer Browser-Toolbar&#8221;:</h2>
<ul>
<li><a title="Entwicklung einer Browser-Toolbar: Einführung (1/5)" href="http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-einfuehrung/">Einführung</a></li>
<li><a title="Entwicklung einer Browser-Toolbar: Mozilla Firefox (2/5)" href="http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-mozilla-firefox/">Mozilla Firefox</a></li>
<li>Microsoft Internet Explorer</li>
<li><a title="Entwicklung einer Browser-Toolbar: Installationssystem (4/5)" href="http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-installationssystem/">Installationssystem</a></li>
<li><a title="Entwicklung einer Browser-Toolbar: Zusammenfassung (5/5)" href="http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-zusammenfassung/">Zusammenfassung</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ab-weblog.com/de/entwicklung-einer-browser-toolbar-microsoft-internet-explorer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->