Telerik: „Error creating Control“ in Visual Studio 2008
Bei jedem Update der Telerik Controls hat sich Visual Studio geweigert, die Controls im Design Mode ordentlich darzustellen. Einfache und notwendige Arbeitsschritte wie beispielsweise das Registrieren eines spezifischen Handlers in web.config wurden dadurch mühsam. Im Netz kursieren recht viele nutzlose Anleitungen zu diesem Thema, nun habe ich aber einen reproduzierbaren Weg gefunden, das Problem zu lösen.
1. Die neuen Telerik Controls downloaden (Scripts + DLL), nach C:\Programme\Telerik\ kopieren
2. In der Toolbox einen neuen Tab hinzufügen, über Choose Items die neuen Controls hinzufügen
3. Neues Projekt erstellen
4. Control aus Toolbox auf Form ziehen
Wenn der Fehler hier auftaucht, wie folgt vorgehen:
1. Solution speichern und Visual Studio schliessen
2. Alle temporären Verzeichnisse und Dateien unter „C:\Windows\Microsoft.NET\Framework\v.2.0.50727\Temporary Asp.net Files\root“ löschen
3. Alle temporären Verzeichnisse und Dateien unter „C:\Users\((username))\AppData\Local\Microsoft\VisualStudio\9.0\ProjectAssemblies“ löschen
4. Visual Studio 2008 starten mit dem vorher angelegten Projekt. Die referenzierte Assembly Telerik.Web.UI entfernen.
5. Die DLL „Telerik.Web.UI.dll“ manuell ins Projekt kopieren und die Assembly zu den Referenzen hinzufügen.
Nun sollte das Problem gelöst sein und im Design Mode das Control richtig angezeigt werden. Startet man nun ein weiteres leeres Projekt, können die Controls aus der Toolbox via Drag&Drop platziert werden ohne Probleme.
Virtual PC 2007 + Host Key
Für Legacy-Projekte, welche mit dem .net Framework 1.1 erstellt wurden, läuft auf unseren Vista PCs Microsoft Virtual PC mit XP Pro und dem Visual Studio 2003. Standardmässig ist in VPC 2007 AltGr als Host Key definiert. Der Host Key ermäglicht es, diverse Steuerungsbefehle innerhalb der VM an den Host zu senden. Dumm nur, dass beim Schreiben von Code regelmässig Sonderzeichen wie {}, [], # oder @ benötigt werden, die auf CH-Tastaturen via AltGr eingegeben werden müssen (ausser man ist ein Freund von direkten Ascii-Code Eingaben
).
Die Lösung ist total simpel: in den Optionen der VPC Konsole kann unter „Tastatur“ der Host Key neu definiert werden (z.Bsp. die linke ALT-Taste). Wichtig: die Option existiert nur in der VPC Konsole und nicht in den Eigenschaften der VM! Happy coding!
Visual Studio 2008 SP1 Intellisense Problem
Ein überaus lästiges Verhalten (tönt irgendwie schöner als „Bug“..) in Visual Studio 2008 SP1 hatte uns das Leben schwer gemacht. In einigen Projekten hat plötzlich die Intellisense Unterstützung komplett versagt, auch das automatische Source-Code Formatieren von Web Forms hat nicht mehr funktioniert. Das Projekt blieb aber zu jedem Zeitpunkt kompilierbar und lief einwandfrei. Im Telerik Blog wurde das Entfernen von diversen temporären Dateien empfohlen, das hat das Problem bei uns aber nicht gelöst. Auch das mehrfache Öffnen und Schliessen oder die Bearbeitung von Forms bei gleichzeitig geöffneter Masterpage hatte keinerlei Effekt.
Die einzige Lösung, die sich auf allen Maschinen bewährt hat: wenn Intellisense nicht mehr funktioniert, einfach ein beliebiges Telerik Control aus der Toolbox auf die Form ziehen. Vorher muss sichergestellt werden, dass der „bin“ Ordner nicht im Projekt inkludiert wurde! Visual Studio 2008 SP1 Intellisense funktionierte danach wieder einwandfrei in allen Forms und Controls. Microsoft sollte dringend einen Hotfix für dieses Problem nachschieben, da es offensichtlich ziemlich viele Entwickler betrifft.
’sys’ undefined mit Telerik AJAX Framework auf IIS7/W2008
Beim Rollout einer kleinen Webapplikation auf einen Windows 2008 Server mit IIS7 funktionierte das client-seitige AJAX Framework nicht, ein Javascript Error ’sys is undefined’ sorgte dafür, dass die App unbrauchbar wurde. Mit dem in VisualStudio 2008 integrierten Development Server klappte alles prima und sämtliche Tests auf allen möglichen Browsern liefen sauber durch.
Ich vermutete ein Problem mit dem Handler und setzte den verwalteten Pipelinemodus des Application Pools im IIS7 auf Classic und voilà: der Fehler tauchte nicht mehr auf. Ein bisschen Recherche im Netz brachte dann die Lösung: im integrierten Modus muss manuell ein verwalteter Handler angelegt werden. Das funktioniert so:
+ Klick auf die App
+ Klich auf Handlerzuordnungen
+ Verwalteten Handler hinzufügen
+ Pfad: Telerik.Web.UI.WebResource.axd
+ Typ: Telerik.Web.UI.WebResource
+ Name: Telerik.Web.UI.WebResource
Nachdem der Handler nun manuell registriert wurde, funktionierte die App reibungslos!
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
Opera Unite: oder, der Feind rückt näher
Nachdem der Opera Browser auf allen Plattformen Marktanteile an die jeweiligen Platzhirsche abgeben musste, melden sich die Entwickler nun mit einer frischen Idee zurück. Die neue Software Opera Unite (noch im Entwicklungsstadium) bietet einen integrierten Webserver im Browser. „Webserver auf dem eigenen Rechner“ tönt für uns Entwickler nicht so spektakulär, aber Opera Unite geht ein ganzes Stück weiter..
Integrierte Applikationen ermöglichen es, diverse Dienste auf dem eigenen Rechner auszuführen. So kann ich im Büro die Musik ab dem heimischen Rechner hören, Freunde können sich (freigegebene) Files direkt ab meiner Kiste ziehen, Fotos können ohne Umweg über Flickr oder ähnliche Dienste präsentiert werden, ich kann eine Website ohne Know-how selber hosten, an einem „Fridge“ können Freunde Nachrichten hinterlassen und es gibt sogar eine Lounge mit Chatfunktion. Wow, eine ganze Menge Funktionalität!
Das tönt alles sehr lecker. Allerdings funktioniert das ganze nur mit dem Opera Browser und irgendwie habe ich da doch ein paar Sicherheitsbedenken. Bei allfälligen Exploits (und die wird es garantiert geben..) ist die letzte Hürde zu den privaten Daten sehr schnell gefallen. Wenn man bedenkt, wieviele User bereits jetzt massiv überfordert sind (WLAN Schutz, Facebook Privatsphäreneinstellungen, Konfiguration von Firewalls/Routern et cetera) tut sich da ein ganz neues Tummelfeld auf..
Dass der eigene Rechner die ganze Zeit laufen muss und die Bandbreite mehr oder weniger unnötig belastet wird ist ein weiterer Nachteil. Aber immerhin wird dann der ganze Schrott, der bislang auf Facebook und Flickr landete, in einem privateren Rahmen bleiben.
Lytebox: Lyteframe ohne Frameborder
Beim Einsatz von Lytebox in einem Asp.net Projekt trat ein offensichtlich bekanntes Problem mit dem Lyteframe auf. Das Einbinden von Lytebox an und für sich war kein Problem, das Entfernen des hässlichen iFrame Borders hingegen schon. Offensichtlich ist das Problem zwar bekannt und Tipps zur Lösung gibt es en masse – nur haben bei mir die ersten 30 Versuche nicht gefruchtet..
Hier aber eine mögliche Lösung, die zumindest auf IE7 und FF3 prima funktioniert.
var objIframe = this.doc.createElement("iframe"); objIframe.setAttribute('id','lbIframe'); objIframe.setAttribute('name','lbIframe'); objIframe.style.display = 'none'; objIframeContainer.appendChild(objIframe);
Diesen Abschnitt in Lytebox.js suchen und mit dem folgenden ersetzen:
var objIframe = this.doc.createElement("iframe"); objIframe.setAttribute('id','lbIframe'); objIframe.setAttribute('name','lbIframe'); objIframe.style.display = 'none'; //add the following line to remove the frameborder objIframe.setAttribute('frameBorder','0'); objIframeContainer.appendChild(objIframe);
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).