C# goes iPhone!
Gemäss neuesten Berichten arbeitet das Team um Mono (eine open source Implementation des .net Frameworks) daran, eine Implementation für das iPhone zu veröffentlichen. Speziell daran: es wird nicht wie üblich aus C# Code CIL Code generiert, der vom JIT Compiler zur Laufzeit übersetzt wird. Der Compiler erstellt nun direkt native code für das iPhone. Die Technologie dazu heisst AOT „Ahead Of Time“-Compilation.
Notwendig ist dies, weil Apple mit Sicherheit keinen JIT Compiler auf dem iPhone sehen will. Dies würde einige Sicherheitsprobleme mit sich bringen sowie das Approval-Verfahren von Apple unterlaufen. Mit diesem etwas undurchsichtigen Verfahren überprüft Apple jede Applikation vor der Veröffentlichung im App Store auf Schadcode, anstössige (..) Inhalte et cetera.
Natürlich hat dies aber ein paar Einschränkungen zur Folge. So können beispielsweise keine Generics verwendet werden und dynamischer Code wird ebenfalls nicht unterstützt.
Das Konzept tönt trotzdem interessant, da nicht jeder Entwickler Lust hat, sich für eine zusätzliche iPhone Version seiner Applikation in Objective-C einzuarbeiten. Ob der Compiler hochwertigen native code schreibt und wie gut die Performance ist, wird sich zeigen..
Microsoft Web Platform Installer
Jeder Entwickler kennt das Problem, dass das Aufsetzen eines Entwicklungsrechners einiges an Zeit benötigt. Microsoft hat nun eine recht komfortable Lösung parat: den Web Platform Installer.
In einem einzigen Installer befinden sich der aktuelle IIS, SQL Server 2008 Express inkl. Management Studio, der Visual Web Developer (für Hobby Developer ohne VS2008) und diverse Tools.
Gute Idee! Das beschleunigt den Setup-Prozess und erspart das Suchen der einzelnen Komponenten.
ABCPdf.net – Cache Problem gelöst!
Zur Erzeugung von dynamischen PDFs aus unseren Applikationen setzen wir die WebSupergoo Komponente ABCPdf.net 6.0 ein. Das Teil erfüllt bislang die meisten unserer Anforderungen ganz gut, nur mit dem Cache hatten wir schon öfters so unsere Probleme. Der Cache kann zwar disabled werden, das hilft aber nur bedingt weiter.
Folgende Situation: ein Button feuert einen Event und löst eine Methode aus, welche ein neues MemoryStream Objekt erzeugt. ABCPdf.AddImageUrl(url) schreibt nun den Inhalt einer Url direkt in den MemoryStream, dieser wird nun über einen Buffer mit Response.BinaryWrite direkt an den Browser geschickt als downloadbares PDF. Um einen eindeutigen Request zu erstellen (Caching Workaround #1) wird an den übergebenen Url Parameter eine guid (globally unique identifier) angehängt. Anstelle von beispielsweise „http://dotlab.wordpress.com“ lautet der Request nun „http://dotlab.wordpress.com/?guid=95e23081-ee88-464c-8a9c-d6553964793d“. Das hat bis gestern ausgezeichnet funktioniert, als sich aber einige Bildobjekte auf der Ziel-Url veränderten, hat ABCPdf.net die Veränderung nicht bemerkt und weiterhin Bilder aus einem Cache in das PDF geschrieben.
Die Lösung war sehr simpel: auf der Ziel-Url werden die dynamisch geladenen Bilder nun ebenfalls mit einer guid als Parameter geladen. Beispiel:
myImage.ImageUrl = "Image1.jpg?guid=95e23081-ee88-464c-8a9c-d6553964793d";
Das scheint dann auch ABCPdf davon zu überzeugen, dass neue Daten gerendert werden wollen
Destruktoren in C#
Beim Umschreiben einer DataAccessHelper Klasse von VB nach C# bin ich auf das folgende Problem gestossen: in VB ist es ohne weiteres möglich, die Finalize() Methode zu überschreiben, wie in folgendem Beispiel:
' Destructor
Protected Overrides Sub Finalize()
Dispose()
End Sub
In C# ist dies so nicht möglich, aber es gibt eine andere elegante Methode, einen eigenen Destruktor zu erstellen:
class TestClass
{
// Dispose Method
void Dispose()
{
//Dispose Statements
}
// Destructor
~TestClass
{
Dispose();
}
}
Zu beachten gilt es, dass eine Klasse nur einen Destruktor besitzen darf und dieser nicht vererbt oder überladen werden kann. Ein direkter Aufruf eines Destruktors ist nicht geplant, für das gibt’s den GC (Garbage Collector).
Lokalisierung mit Cultures
Um ein .Net Webprojekt zu lokalisieren, wurden bis anhin bei uns sämtliche Elemente in separaten Strings übersetzt gehalten und zur Laufzeit mittels Select/Case (abhängig von der ausgewählten Sprache) ausgelesen und den Objekten zugeordnet. Ein Relikt aus alten Projekten..
Dass dies auch eleganter geht, zeigt das folgende Beispiel. Nachdem eine .aspx Seite aufgebaut wurde (inkl. Code-behind File), kann in Visual Studio 2005 unter „Tools“ der Punkt „Generate Local Resource“ ausgewählt werden. Es wird automatisch im Projekt ein Ordner App_LocalResources angelegt mit dem Namen der Webform und dem Zusatz .apsx.resx. In dem File finden sich sämtliche verwendeten Elemente der .aspx Seite wieder, zu jedem Element existiert ein String mit dem angezeigten Text. Die Liste kann manuell beliebig erweitert werden, falls neue Buttons oder was auch immer zur Seite hinzugefügt werden. Nun kann das .resx File kopiert und umbenannt werden, beispielsweise „Default.aspx.de-CH.resx“ oder „Default.aspx.en-US.resx“. Der Filenamen enthält nun bereits die Sprachspezifikation. Die einzelnen Strings in den Files können bequem übersetzt werden, Visual Studio stellt dafür einen kleinen Editor zur Verfügung.
Zur Laufzeit kann nun innerhalb der Webform „CurrentCulture“ und „CurrentUICulture“ gesetzt werden, aufgrund dieser Auswahl wird das entsprechende .resx File eingelesen und die Strings automatisch auf die Objekte gemappt. Natürlich können die Strings aber auch manuell ausgelesen werden. Hier ein Codesample:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;
using System.Globalization;
public partial class _Default : System.Web.UI.Page
{
// Methode um manuell ein ResouceObject auszulesen
public string G(string sKey)
{
return GetLocalResourceObject(sKey).ToString(); ;
}
// Init
protected override void InitializeCulture()
{
base.InitializeCulture();
string selectedLanguage = "de-CH";//""en-US";
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
}
// Einem ASP Button einen String manuell zuweisen
protected void Page_Load(object sender, EventArgs e)
{
Button1.Text = G("Button1Resource1.Text");
}
}
Add-In für VisualStudio 2008, Support für SQL Server 2008
Microsoft hat ein Add-In zur Verfügung gestellt für alle glücklichen Entwickler, die bereits mit dem VisualStudio 2008 unterwegs sind. Letzteres verursachte bislang Probleme im Zusammenspiel mit einem SQL Server 2008. Das Add-In ist gerade mal knapp 4mb gross und kann HIER runtergeladen werden.
Guter Ersatz für das XAMLpad
Wer sich bereits mit Silverlight und XAML rumschlägt, ist sicher einmal über das XAMLpad gestolpert. Das Stück Software von Microsoft war bislang nicht unbedingt der Hammer, weswegen es wohl niemand wirklich einsetzt.Eine gute Alternative ist nun mit Kaxaml verfügbar. Die Freeware kann auf der offiziellen Website http://www.kaxaml.com/ runtergeladen werden.Einizge Voraussetzung: Windows XP oder Vista mit dem .net Framework 3.0, da das Tool auf WPF setzt.