<?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>xscDevBlog - LastSharp &#38; Co. &#187; .net</title>
	<atom:link href="http://dev.xscheme.de/tag/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.xscheme.de</link>
	<description>Der xscheme-DevelopmentBlog</description>
	<lastBuildDate>Sun, 23 May 2010 11:40:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>BadImageFormatException auf Vista x64 (.NET)</title>
		<link>http://dev.xscheme.de/2008/12/badimageformatexception-vista-x64/</link>
		<comments>http://dev.xscheme.de/2008/12/badimageformatexception-vista-x64/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 01:10:48 +0000</pubDate>
		<dc:creator>xsc</dc:creator>
				<category><![CDATA[Fundstücke]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[64bit]]></category>
		<category><![CDATA[BadImageFormatException]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=470</guid>
		<description><![CDATA[Dank einer Support-Anfrage im Forum (hier) bin ich nun anscheinend endlich der Wurzel eines Problems auf der Spur, das einige LastSharp-User auf dieser Welt nervt: die &#8220;settings.ini&#8221; wird nicht gespeichert, die MP3-Wiedergabe funktioniert nicht, manches Mal kommen noch weitere &#8220;Symptome&#8221; hinzu.  In der gestern geposteten Fehlermeldung war nun also von einer &#8220;BadImageFormatException&#8221; die Rede &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Dank einer Support-Anfrage im Forum (<a href="http://devboard.xscheme.de/read.php?4,70">hier</a>) bin ich nun anscheinend endlich der Wurzel eines Problems auf der Spur, das einige LastSharp-User auf dieser Welt nervt: die &#8220;settings.ini&#8221; wird nicht gespeichert, die MP3-Wiedergabe funktioniert nicht, manches Mal kommen noch weitere &#8220;Symptome&#8221; hinzu.  In der gestern geposteten Fehlermeldung war nun also von einer &#8220;<strong>BadImageFormatException</strong>&#8221; die Rede &#8211; Grund genug, mich schlau zu machen.</p>
<p>Das irrKlang-Forum liefert sogleich den ersten Hinweis (<a href="http://www.ambiera.at/forum/Blah.pl?m-1229368915/">hier</a>):</p>
<p style="padding-left: 30px;">By default, a Visual Studio project is targeted for &#8220;Any CPU.&#8221; Unfortunately, when run on <strong>64-bit Vista</strong>, the default is a 64-bit application, which creates a conflict with the <strong>32-bit DLLs</strong>. Worse, this error only shows up at runtime, when the libraries bind to the executable.</p>
<p>Die Lösung wäre es unter Visual Studio, so wird weiter ausgeführt, die Projekteinstellungen zu öffnen und auf der Registerkarte &#8220;Erstellen&#8221; als Zielplattform &#8220;x86&#8243; auszuwählen. Blöd nur, dass die <a href="http://www.microsoft.com/germany/express/">Visual Studio Express Editions</a> diese Option gar nicht bieten&#8230;</p>
<p><strong>Erster Weg</strong></p>
<p>Ich folge dem Vorgehen von <a href="http://www.jenkz.org/2008/05/10/visual-c-2008-express/">jenkz.org</a> und editiere meine Projektdatei von Hand, indem ich in den zweiten PropertyGroup-Abschnitt die Zeile<code><span><span class="tag"> &lt;</span><span class="tag-name">PlatformTarget</span><span class="tag">&gt;</span><span>x86</span><span class="tag">&lt;/</span><span class="tag-name">PlatformTarget</span><span class="tag">&gt;</span></span> </code>einfüge.</p>
<p><strong>Zweiter Weg</strong></p>
<p>Ich nehme einen kleinen Umweg in Kauf und kann dann doch die Express Edition für diesen Zweck missbrauchen. Hierzu folge man den Instruktionen in <a href="http://wfrobozz.blogspot.com/2008/09/visual-c-2008-express-and-3264-bit.html">Frobozz&#8217;s Blog</a>.</p>
<p><strong>Fazit</strong></p>
<p><span style="text-decoration: line-through;">Ich bin gespannt, ob LastSharp damit 64-Bit-fähig wird&#8230;</span> LastSharp läuft damit auch auf Vista x64.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2008/12/badimageformatexception-vista-x64/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>LastFmLib.Net</title>
		<link>http://dev.xscheme.de/2008/09/howto-lastfmlibnet/</link>
		<comments>http://dev.xscheme.de/2008/09/howto-lastfmlibnet/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 15:38:29 +0000</pubDate>
		<dc:creator>xsc</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Fundstücke]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[lastfm]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=277</guid>
		<description><![CDATA[UPDATE 12.12.2008: Veränderungen in den Namespaces von LastFmLib.Net!
Ich habe mich in letzter Zeit viel mit Last.FM beschäftigt, nicht zuletzt wegen meinen beiden Programmen LastSharp und Lea. Aufgrund eines Problems mit letzterem (Tracks/Künstler mit Umlauten machen Schwierigkeiten) habe ich mich ein wenig umgesehen und bin auf eine (angeblich vollständige) Implementierung des Last.FM-APIs in .NET gestoßen: LastFmLib.Net.

Und [...]]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE 12.12.2008: Veränderungen in den Namespaces von LastFmLib.Net</strong>!</p>
<p>Ich habe mich in letzter Zeit viel mit <a href="http://www.last.fm">Last.FM</a> beschäftigt, nicht zuletzt wegen meinen beiden Programmen <strong>LastSharp</strong> und <strong>Lea</strong>. Aufgrund eines Problems mit letzterem (Tracks/Künstler mit Umlauten machen Schwierigkeiten) habe ich mich ein wenig umgesehen und bin auf eine (angeblich vollständige) Implementierung des Last.FM-APIs in .NET gestoßen: <strong><a href="http://lastfmlibnet.sourceforge.net/">LastFmLib.Net</a></strong>.</p>
<p><span id="more-277"></span></p>
<p>Und weil diese Bibliothek wirklich einzigartig einfach zu verwenden ist (obwohl auch hier die Umlaute noch nicht extra betrachtet werden), möchte ich meine Erfahrungen gerne teilen und eine winzige, deutschsprachige Erklärung zu ihrer Verwendung bzw. Anwendung auf das <a href="http://www.lastfm.de/api/intro">API 2.0</a> schreiben.</p>
<p><strong>Vorbereitung</strong></p>
<p>Jeder, der den Last.FM-Webservice verwenden will, benötigt zuallererst einen öffentlichen und einen dazugehörigen geheimen API-Schlüssel, den man <a href="http://www.lastfm.de/api/account">hier</a> beantragen kann. Da LastFmLib.Net eine Klassenbibliothek für das .NET-Framework ist, wird eine entsprechende Entwicklungsumgebung (z.B. <a href="www.microsoft.com/germany/Express/">Visual C# Express Edition</a>) benötigt, um damit arbeiten zu können.</p>
<p>Hat man einen öffentlichen und einen geheimen API-Schlüssel (Key und Secret) erhalten, so muss man LastFmLib.Net diese beiden mitteilen. Dies geschieht, indem man das <em>LastFmLib.API20.Settings.AuthData</em>-Objekt neu setzt, in C# beispielsweise:</p>
<pre>LastFmLib.General.MD5Hash key
    = new LastFmLib.General.MD5Hash(<strong>"APIKey</strong>", true, Encoding.UTF8);
LastFmLib.General.MD5Hash secret
    = new LastFmLib.General.MD5Hash(<strong>"APISecret"</strong>, true, Encoding.UTF8);
LastFmLib.API20.Settings20.AuthData
    = new LastFmLib.API20.Types.AuthData(key, secret, null);</pre>
<p>Hat man das nun erledigt, kann man (nach der Authentifizierung) auf die einzelnen API-Methoden zugreifen.</p>
<p><strong>Allgemein: Request schicken</strong></p>
<p>In LastFmLib.Net sind alle Anfragen an das API in Klassen gekapselt. Für jede Art von Anfrage (Request) erstellt man also ein entsprechendes Objekt, startet die Verarbeitung, überprüft ob die Anfrage erfolgreich war und verarbeitet das Ergebnis. Alle Requests befinden sich im Namespace <em>LastFmLib.API20.&lt;Art&gt;</em>, wobei &lt;Art&gt; die entsprechende Obergruppe einer Anfrage ist, z.B. &#8220;Auth&#8221;, &#8220;User&#8221;, &#8220;Playlists&#8221;, etc&#8230; Diese Obergruppen sieht man auf der <a href="http://www.lastfm.de/api/intro">API-Seite</a> fettgedruckt in der Spalte links.</p>
<p>In C# würde das also so aussehen:</p>
<pre>LastFmLib.API20.&lt;Art&gt;.&lt;Irgendeine Request&gt; req
    = new LastFmLib.API20.&lt;Art&gt;.&lt;Irgendeine Request&gt;(&lt;notwendige Parameter&gt;);
req.Start();
if (req.Succeeded) {
    // Mach etwas mit dem Ergebnis
} else {
    // Mach etwas mit dem Fehler (req.ErrorMessage)
}</pre>
<p><strong>Authentifizierung</strong></p>
<p>Alles beginnt mit der Anmeldung des Users. Bei Last.FM geht dies in drei Schritten vonstatten:</p>
<ol>
<li>Holen des sog. &#8220;Tokens&#8221;, der sozusagen das Passwort für alle nun kommenden Anfragen darstellt und nur eine begrenzte Zeit gültig ist. Dies geschieht mit der API-Methode <em>getToken()</em>:
<pre>LastFmLib.API20.Auth.AuthGetToken req
    = new LastFmLib.API20.Auth.AuthGetToken();
req.Start();
if (req.Succeeded) {
    // Token speichern
    LastFmLib.API20.Settings20.AuthData.Token = req.Result;
} else {
    // Mach etwas mit dem Fehler
}</pre>
</li>
<li>Zulassung des Programms für den eigenen Last.FM-Account. Hierfür wird der Browser geöffnet, sodass der User sich einloggen und die entsprechende Berechtigung vergeben kann. LastFmLib.Net stellt hierfür auch gleich eine Funktion bereit (1.Parameter: Anwendung unterbrechen, 2. Parameter: Timeout):
<pre>LastFmLib.API20.Settings.AuthData.AskUserToGrantPermissions(false, 0);</pre>
</li>
<li>Holen der Session-Informationen (Benutzername, Session-Key, Subscriber-Status) mit der Methode <em>getSession(token)</em>. Achten Sie darauf, dass dieser Schritt auch wirklich erst nach der Bestätigung im Browser ausgeführt wird, ansonsten klappt das Holen der Informationen nämlich nicht.
<pre>LastFmLib.API20.Auth.AuthGetSession sk =
    new LastFmLib.API20.Auth.AuthGetSession(LastFmLib.API20.Settings20.AuthData.Token, false);
sk.Start();
if (sk.Succeeded)
{
    // Session speichern
    LastFmLib.API20.Settings20.AuthData.Session = sk.Result;
}
else {
    // Mach etwas mit dem Fehler
}</pre>
</li>
</ol>
<p>Wenn diese drei Schritte erfolgreich ausgeführt wurden, kann man die eigentlichen Anfragen starten, immer nach dem oben genannten Muster.</p>
<p><strong>Beispiel: Playlisten eines Users holen</strong></p>
<pre>LastFmLib.API20.User.UserGetPlaylists req =
    new LastFmLib.API20.User.UserGetPlaylists(LastFmLib.API20.Settings20.AuthData.Session.Username);
gp.Start();
if (gp.Succeeded)
{
    foreach (LastFmLib.API20.Types.SimplePlaylist pl in gp.Result) {
        // Playliste verarbeiten
    }
} else {
    // Mach etwas mit dem Fehler
}</pre>
<p><strong>Anmerkungen</strong></p>
<p>Der Aktualität halber sollte man nicht die vorgefertigte DLL von der Website des Entwicklers laden, sondern die neuesten Quelldateien aus dem SVN-Verzeichnis, um daraus die letztendliche Bibliothek zu erstellen. Dies geht mithilfe von <a href="http://subversion.tigris.org/">Subversion</a> und dem Befehl:</p>
<p><code>svn co https://lastfmlibnet.svn.sourceforge.net/svnroot/lastfmlibnet lastfmlibnet</code></p>
<p>Eine entsprechende Dokumentation der Klassenbibliothek findet sich auch im SVN-Verzeichnis. Vor allem, wenn man keine Möglichkeit hat, über die Entwicklungsumgebung Informationen zu einzelnen Funktionen zu erhalten (Parametertypen/-anzahl, Rückgabetyp), sollte man sich darin vertiefen.</p>
<p>Mein Programm <em>Lea </em>(ab Version 1.2) ist dank LastFmLib.Net keine große Sache mehr, dafür (hoffentlich) um einiges stabiler und wartungsfreundlicher.</p>
<p>So, ich hoffe, dieses HowTo hat ein wenig geholfen. Weitere Informationen und natürlich auch Support gibt es auf der <a href="http://lastfmlibnet.sourceforge.net/">Website des Entwicklers</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2008/09/howto-lastfmlibnet/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
