Lustiges in .Net

Dim converter As TypeConverter = TypeDescriptor.GetConverter(GetType(Long))

If Not converter.CanConvertFrom(GetType(Long)) then
    Return False
Else
    Return True
End If

Dieser Schnipsel zeigt eine lustige Eigenheit in .Net. Wenn man sich über den TypeDescriptor einen Converter für beispielsweise Long holt und diesen fragt, ob er in den selben Typ (Long) umwandeln kann, dann gibt die Funktion CanConvertFrom False zurück. Etwas seltsam, denn Konvertieren kann man das ja, bzw. einfach zuweisen ohne zu konvertieren. Ich finde diesen Rückgabewert etwas verwunderlich!

Advertisements

Windows CommandLine in Eclipse

Für Node.js wollte ich eine Windows Commandozeile in Eclipse haben.

Dieser Link: http://www.avajava.com/tutorials/lessons/how-do-i-open-a-windows-command-prompt-in-my-console.html führte zum schnellen Erfolg!

Als zusätzlicher Tip: Über den Button „Variables“ in der Konfiguration kann man auch Variablen, wie beispielsweise den Workspace einfügen.

Node.js mit Eclipse einrichten

Ich möchte einen Server für Fehlermeldungen erstellen. Dieser soll sehr dynamisch sein und deshalb werde ich Node.js und MongoDB oder eine andere NoSQL-Datenbank verwenden. Hier möchte ich festhalten, welche Schritte ich unternommen habe, um den Server zu entwickeln. Zunächst die Einrichtung von Node.js auf der Entwicklermaschine (Windows). Node.js von nodejs.org herunterladen. Ausführen. Fertig! Das war einfach.

Jetzt zur IDE. Ich möchte Eclipse benutzen, da dies, wenn auch manchmal etwas unhandlich, mir bis jetzt gute Dienste geleistet hat. Ich lade also die Eclipse Java Version von eclipse.org runter. Entpacken und den Workspace einstellen.

Als nächstes lade ich die Javascript Development Tools für Eclipse runter. Unter Help -> Install New Software kann man diese, wenn man „All available Sites“ auswählt, als Unterpunkt von Programming Languages finden. Anhaken und durchklicken. Fertig!

Nun noch schnell ein Javascript-Projekt mit den Standardoptionen erstellen. Dazu noch eine Javascript Source File im Projekt erstellen und folgendes eintragen:

console.log("Hello World!");

Jetzt möchte ich dies Debuggen. Dazu brauche ich den Eclipse Debugger für Googles V8 von http://code.google.com/p/chromedevtools/
I
n Eclipse wird einfach wieder Help -> Install new Software aufgerufen und als Site  http://chromedevtools.googlecode.com/svn/update/dev/ hinzugefügt.
Ausgewählt habe ich die Punkte „Chromium JavaScript Remote Debugger“ und „Chromium JavaScript Debugger Bridge to JSDT“ für die Javascript Development Tools.

Einen Link zur Einrichtung ist dieser: https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger

Viel Spaß damit. Ich probiere den Inhalt des Links jetzt selbst aus.

Entity Framework bremst Visual Studio aus

Screenshot des Programms Process Monitor

Seit ein paar Tagen öffnete sich mein Visual Studio WPF Designer (XAML View) nur noch nach einer langen Wartezeit, oder manchmal auch gar nicht. Endloses Warten, ohne Aussicht auf Besserung.
Nach mehreren langen Web-Such-Sessions fand ich heute den entscheidenden Hinweis. Man sollte doch mit dem Tool Process Montitor von Windows SysInternals mal nachsehen, was Visual Studio während der Ladezeit macht.

Kaum gelesen, schon war das Tool runtergeladen und lief. Das Tool ist verständlich und kann bei fremden Programmen wirklich viel helfen. Es gibt ein Fadenkreuz, welches man auf ein Fenster des zu beobachtenden Prozesses zieht. Anschließend sind die Meldungen so gefiltert, dass nur die Meldungen des gewünschten Prozesses zu sehen sind. Ich habe das Tool parallel laufen lassen und konnte relativ schnell eine interessante Beobachtung machen. Wie im Screenshot zu sehen führte devenv.exe (VS2010) ca. 30 UDP Send Operationen aus. Auffällig ist dabei, das man in der Spalte Path sehen kann, wie der Port entsprechend hochgezählt wird. 000000.000 ist der entfernte Rechnername inklusive Domain. Visual Studio scheint nach einem passenden Port zu suchen. Nach ca. 1 – 2 Minuten stellt Visual Studio diese Suche dann ein und öffnet wie gewünscht den Editor. Was war geschehen?

Der Titel des Artikels verrät die Antwort. Das Entity Framework ist schuld. Ich habe einen Datencontext, welcher seinen Connection-String per Convention over Configuration aus der app.config bekommt. Dabei entspricht der Schlüssel des ConnectionStrings dem Namen des Contextes. Dieser Context wird im ViewModelLocator ins ViewModel injiziert. Nun lädt Visual Studio das ViewModel durch den ViewModelLocator aber auch wenn der Editor geöffnet wird. Dabei läuft der Code aber nicht mit der app.config meiner Anwendung, sondern mit der von Visual Studio. Hierdurch ist keine passende Konfiguration vorhanden und das Entity Framework begibt sich auf die Suche. Dabei wird unter anderem der Portscan durchgeführt, der sehr zeitaufwändig ist.

Die Lösung des Problems ist das Mvvm Light Toolkit, welches ich schon einsetzte. Dieses beinhaltet die Property ViewModelBase.IsInDesignModeStatic, welche angibt, ob der Code gerade im Designer läuft. Im ViewModelLocator kann man dann reagieren und statt des Context des Entity Frameworks einfache Objektdaten übergeben. Voraussetzung hierfür ist die Einführung einer Schnittstelle, welche vom Entity Framework und den Objektdaten implementiert wird. Jetzt lädt der Designer wieder schnell!

Das gezeigte Verhalten kann natürlich auch in richtigen Anwendungen zum Ärgernis werden, wenn die Konfigurationsdatei beispielsweise fehlt. Bevor eine Fehlermeldung kommt, würde einige Zeit vergehen, in der das Entity Framework nach einem passenden Server sucht. Ich habe allerdings noch nicht im Quellcode nachgesehen, der ja mittlerweile als Open Source vorliegt. Dies werde ich bei Gelegenheit nachholen.

Windows 8 Metro Enterprise Apps

Metro wurde von Microsoft ganz klar für Consumer konzipiert. Es geht um Unterhaltung, um Spiele, um Nachrichten und das möglichst attraktiv.

Enterprise Apps stehen da zunächst etwas zurück. Obwohl es Wege geben wird Apps im Unternehmen zu installieren, ohne über den Store zu gehen, hat Metro einige Einschränkungen. Eine davon ist, dass Metro-Apps und Desktop-Applikationen nicht direkt miteinander kommunizieren können. (Beispielsweise per API) Und das es erstmal nicht möglich ist direkt auf SQL Server zuzugreifen.

Einen möglichen Weg zur Kommunikation habe ich eben erfolgreich getestet. Da die Metro-Apps Internetzugriff haben, können sie mit Webservices interagieren. Die gute Nachricht: Es ist möglich einen Webservice in einer Desktop-Applikation laufen zu lassen, welcher auf einen bestimmten Port horcht und diesen dann aus der Metro App heraus über localhost abzufragen. Dadurch können, wenn auch umständlich, Metro Apps mit Desktop-Apps kommunizieren. Auch reines TCP soll möglich sein, was noch performanter sein könnte.

Zum Test habe ich mir Node.js runtergeladen und das Beispiel der Webseite mit Node.js ausgeführt. Dies ist ein Webserver, der „Hello World“ zurückliefert. Anschließend habe ich eine neue Grid App in VS 2012 erzeugt und dort in einen der Event-Handler folgenden Code eingefügt:

Dim client As HttpClient = New HttpClient()
Dim s As String = Await client.GetStringAsync("http://127.0.0.1:1337")
Debug.WriteLine(s)

Wichtig ist dabei noch, dass der Event-Handler das Keyword Async bekommen muss, damit Await funktioniert. Der HttpClient befindet sich unter System.Net.Http.
Ergebnis war, dass „Hello World“ ausgegeben wurde. Die Türe zwischen Desktop-Applikationen und Metro steht also offen.

Windows 8 Developer Day

Gestern besuchte ich den Windows 8 Developer Day: „Apps entwickeln mit C# und XAML“ von Microsoft.

Präsentiert wurde die Entwicklung und das Design von Windows 8 Metro Style Apps von Oliver Scheer (blog.the-oliver.com), der auch in den Pausen sehr gesprächsbereit war und das ganze zu einer insgesamt gelungenen kostenlosen Veranstaltung gemacht hat. Vielen Dank Oliver!

Themen waren unter anderem Windows 8 Features, Merkmale von Metro Style Apps und das Erstellen eigener Metro Style Apps. Es gibt weitere Termine (http://www.microsoft.com/germany/msdn/events/windows8/training.mspx) und ich kann die Veranstaltung nur empfehlen.

Mich persönlich hat dieser Tag motiviert, sodass ich mir Windows 8 auf meinem Laptop installiert habe und nun versuche meine erste eigene App zu schreiben. Ich muss sagen, Windows 8 ist gut benutzbar, auch ohne Touch. Ich vermisse das Startmenü im Moment noch nicht. Und die Kacheln machen irgendwie auch Spaß. Ich denke ich werde in den nächsten Tagen hier mehr über meine Erfahrungen mit Windows 8 und die Metro App Entwicklung berichten.