Visual Studio 2010 SP1 enthält bereits die Silverlight Tools

June 8th, 2011

Hallo,

kürzlich wollte ich die SilverLight Tools installieren, um mich mit dieser Technologie etwas vertraut zu machen.

Obwohl der Rechner alle Voraussetzungen erfüllte, bekam ich bei der Installation der SilverLight Tools die Meldung:

Es muss eine Version von Visual Studio 2010, Visual Web Developer Express 2010 oder Visual Phone Developer Express 2010 installiert sein, die der Sprachversion von Silverlight Tools 4 entspricht, bevor die Installation von Silverlight Tools fortgesetzt werden kann. Andere Sprachversionen von Silverlight Tools sind unter folgender URL verfügbar: http://go.microsoft.com/fwlink/?LinkId=177432.
SilverlightToolsVoraussetzungen

Eine kurze Recherche brachte dann die Lösung: die Silverlight Tools sind in Visual Studio SP 1 bereits enthalten, siehe folgendes Zitat aus den release notes des SP1:

Silverlight-4-Unterstützung
Microsoft Silverlight 4 Tools für Visual Studio 2010 ist in Visual Studio 2010 SP1 enthalten.

Schade, dass Microsoft den Installer für die Silverlight Tools nicht an das SP1 für Visual Studio angepasst hat.

Viele Grüße,
Andreas

Technorati Tags: , ,

Tipps zur Arbeit mit mehrsprachigen SilverStripe-Websites

June 5th, 2011

Hallo,

ich benutze für eine Website, die ich betreue, das Content Management System SilverStripe. Im Großen und Ganzen bin ich damit zufrieden, aber die Dokumentation hat durchaus noch Verbesserungspotential. Kürzlich habe ich begonnen, für die erwähnte Website Unterstützung für mehrere Sprachen hinzuzufügen.

Dabei muss der Support für Übersetzungen auch für sog. “custom attributes” – quasi selbst definierte Felder zur Eingabe von strukturierter Information für Seiten eines bestimmten Typs – explizit hinzugefügt werden. Weder in der offiziellen Dokumentation noch im SilverStripe-Buch war dieses Vorgehen beschrieben.

Nach längere Internet-Recherche bin ich schließlich auf die sehr hilfreiche Seite http://www.balbus.tk/translatable/ gestoßen.

Dort findet man nicht nur einen Link auf die fehlende Dokumentation, sondern auch eine direkte Beschreibung der Lösung, im Abschnitt ‘Translatable fields – hints’.

Ganz generell enthält die Seite eine Menge nützlicher Informationen zum Arbeiten mit mehrsprachigen SilverStripe-Websites.

Viele Grüße,
Andreas

Technorati Tags: ,

Interfaces in C#

May 2nd, 2011

Hallo,

kürzlich habe ich zur Auffrischung meines C#-Wissens die neue Auflage von “Effective C#“  bestellt und begonnen, die einzelnen Items durchzuschauen. Das Item 23 “Understand How Interfaces differ from Virtual Methods” hat mich dann doch einigermaßen beeindruckt, gibt es doch einen Eindruck von der Fülle an Konzepten die zum Thema “Interfaces” in C# relevant sind. Beim Versuch eine Webpage oder Blog-posting zu finden, in dem ein mehr oder weniger vollständiger Überblick über dieses Thema gegeben wird, habe ich aber nichts brauchbares gefunden. Die meisten Fundstellen waren Einführungen in das Thema Interfaces im allgemeinen und begnügten sich damit, das Konzept vorzustellen und zu motivieren.

In diesem Posting versuche ich einen eher Referenz-artigen aber hoffentlich vollständigen Überblick über die Eigenheiten und Möglichkeiten von Interfaces in C# zu geben. Das Konzept an sich und die übliche Verwendung werde ich nicht weiter Erläutern.

Methoden in Interfaces sind per default nicht virtuell

Per default sind Methoden in Interfaces nicht virtuell. D.h. wenn eine Objektreferenz den Typ des Interfaces hat, wird immer die Methode der obersten Klasse in der Vererbungshierarchie gerufen, die die Methode implementiert. Die erneute Implementierung einer Interfaces-Methode in einer abgeleiteten Klasse ist überhaupt nur unter Verwendung des Schlüsselwortes new möglich,  was bereits auf das beschriebene Verhalten hinweist.

Interfaces können in verschiedenen Ebenen der Vererbungshierarchie implementiert werden

Wenn man von einer vorhandenen Klasse ableitet und mit deren Implementierung eines Interfaces nicht zufrieden ist, besteht die Möglichkeit, das Interface in der abgeleiteten Klasse erneut zu implementieren. Dazu erklärt man auch in der abgeleiteten Klasse, dass man das Interface definiert. In diesem Fall wird bei Verwendung einer Objektreferenz vom Typ des Interfaces die “tiefstmögliche” (bezogen auf die Vererbungshierarchie) Implementierung gerufen.

Dieses Vorgehen ist aber auch nicht ganz unproblematisch:

  • Die Verwendung des Schlüsselwortes new ist immer noch nötig
  • Es müssen alle Methoden des Interfaces implementiert werden, auch wenn man nur eine Teilmenge ersetzen will
  • Wenn man eine Referenz mit dem Typ einer direkten oder indirekten Superklasse zum Aufruf einer Methode verwendet, die Teil des Interfaces ist, wird die Implementierung des Klasse, die dem Typ der Referenz entspricht, gerufen. Dieses Verhalten ist bei virtuellen Methoden gerade nicht so.

Methoden in Interfaces können abstract definiert werden

Wenn eine Klasse als abstract definiert ist, dürfen auch Methoden aus Interfaces (die in einer Klasse, die ein Interface implementiert, eigentlich auch implementiert sein müssen) als abstract definiert sein. In diesem Fall müssen diese Methoden in der Basisklasse nicht implementiert werden. Die abgeleiteten Klassen müssen die Methode dann implementieren. Damit könnte man z.B. in einer gemeinsamen Basisklasse sinnvolle Default-Implementierungen einer Teilmenge der Interface-Member implementieren während man von den abgeleiteten Klassen erwartet, dass sie die restlichen Member des Interfaces selbst implementieren.

Methoden in Interfaces können virtuell sein

Wie bei normalen Methoden (die kein Bestandteil eines Interfaces sind) kann eine Methode als virtual deklariert werden und verhält sich dann entsprechend. D.h. es wird immer die Implementierung in der tiefsten Ebene der Vererbungshierarchie gerufen, egal welchen Typ die Referenz hat, über die man die Methode aufruft.
Dazu muss die Methode in der Interface-Definition nicht virtual sein.

Es ist möglich, mehrere Interfaces zu implementieren, die die gleichen Member haben

Grundsätzlich kann eine Klasse einen gegebenen Member nur einmal implementieren. Nun ist es nicht unrealistisch, dass man in einer Klasse mehrere Interfaces implementiert und die Gefahr identischer Member in zwei oder mehr Interfaces ist durchaus real. Dieses Problem lässt sich einfach lösen, indem vor jeder Implementierung eines Members der Interfaces-Name vorangestellt wird. Diese explizite Qualifizierung  muss dann auch beim Aufruf der Methode verwendet werden, sofern nicht eine Referenz vom Typ eines der Interfaces verwendet wird (sondern eine Referenz auf die konkrete Klasse).

Viele Grüße,
Andreas

Technorati Tags: ,

Der neue HelpViewer in Visual Studio 2010 Service Pack (SP) 1

April 25th, 2011

Hallo,

wie in meinem letzten Posting beschrieben, hat Microsoft mit dem Service Pack 1 endlich wieder einen “richtigen” HelpViewer bereitgestellt.

Das war dann auch der einzige Grund, warum ich das Service Package installiert habe.

Leider scheint mir der neue HelpViewer noch nicht optiomal in Visual Studio eingebunden, weshalb ich hier die Schritte zu einer sinnvollen Konfiguration dokumentieren möchte.

Zunächst muss die Hilfe so konfiguriert werden, dass die “lokale Hilfe” verwendet wird. Bleibt man bei der “Onlinehilfe”, ändert sich am Verhalten nichts, d.h. wenn Hilfe angefordert wird, wird der Browser gestartet und lädt eine mehr oder weniger passende Seite von der msdn-Website.

Um die lokale Hilfe auszuwählen, muss man den “Hilfebibliotheks-Manager” starten, z.B. über den Eintrag “Hilfeeinstellungen verwalten” im Menü Hilfe.

Dann klickt man auf “Onlinehilfe oder lokale Hilfe auswählen” und wählt anschließend “Ich möchte die lokale Hilfe verwenden”.

Lokale Hilfe auswählen

Lokale Hilfe auswählen

Danach ist man aber noch nicht viel weiter, da (zumindest bei meiner Installation) noch keine lokalen Inhalte für die Hilfe vorliegen. Diese müssen nun durch Klick auf “Inhalt von Online-Speicherort installieren” lokal installiert werden.
Der Hilfebibliotheksmanager lädt dann eine Liste mit abrufbaren Inhalten und zeigt diese in einer baumartigen Sicht an. Dort klickt man nun für jedes gewünschte Paket auf den Link ‘Hinzufügen’.

In folgendem Beispiel wurde als letztes die Hilfe für “Visual C#” ausgewählt:

Auswahl einzelner Hilfepakete

Auswahl einzelner Hilfepakete

Die Aktualisierung der geschätzten Downloadgröße nach der Aus- oder Abwahl eines Paketes dauert einen Moment. Nach einem Klick auf “Aktualisieren” werden die Hilfeinhalten dann geladen und lokal installiert.

Nach dem der äußerst langsamen Download (ca. 200 KBit/s) wollte ich dann ein Gefühl für die Qualität der Suche bekommen.

Die Eingabe des Suchbegriffes std::vector brachte als Ergebnisse “Implementing an STL based collection”, “checked_array_iterator Class” usw. Kein einziger der zwanzig Treffer hatte etwas mit der gewünschten Klasse, welche eine essentielle Klasse der C++ Standardbibliothek ist, zu tun. Wenig überraschend wurde das Ergebnis nicht besser, wenn man den Namensraum std:: wegläßt. Das ist ein sehr schwaches Ergebnis und disqualifiziert den HelpViewer als direktes Frontend für Suchen in der Hilfe.

Eine weitere wichtige Frage besteht darin, ob der HelpViewer effizient Hilfe für Begriffe aus einem Quelltext anzeigt. Immerhin kennt die IDE den genauen Typ jedes Tokens und hat damit alle Informationen, die benötigt werden, um eine eindeutige und korrekte Hilfe anzuzeigen.
Leider wird diese Hoffnung nicht erfüllt, wie man an diesem kleinen Beispiel sieht:

if (getElements().size() != rhs->getElements().size())

getElements() liefert eine Instantiierung von std::map zurück. Die IDE “weiß” das auch, wie man an dem tooltip für das token ’size’ sieht oder auch den Möglichkeiten, die die “member completion” anbietet.

Der HelpViewer zeigt allerdings die Seite für hash_set::size() an, was nicht korrekt ist. Die Hilfe für Schlüsselwörter, die eindeutig sind (z.B. auto_ptr) wird korrekt angezeigt, was aber auch keine große Leistung ist.

Insgesamt bleibt ein enttäuschender Eindruck. Zumindest für C++-Entwickler die viel mit der C++ Standard-Bibliothek arbeiten, stellt der HelpViewer keine Verbesserung dar.

Viele Grüße,
Andreas

Technorati Tags: , ,

Neues Hilfesystem für Visual Studio 2010 mit Service Pack 1

February 20th, 2011

Hallo,

in einem früheren Posting habe ich mein Unverständnis ausgedrückt, dass Microsoft die Hilfe-Funktion in Visual Studio 2010 quasi abgeschafft hat. Auch in Zeiten des Internet und der Suchmaschinen ist eine gute Hilfe-Funktion wichtig.

Nachdem diese Klage ja sehr verbreitet  war, scheint Microsoft ein Einsehen zu haben, und bringt mit dem Service Pack (SP) 1 für Visual Studio 2010 wieder eine richtige Hilfe-Funktion.
Ich bin sicher, dass der lokale Help-Viewer eine Verbesserung gegenüber der aktuellen Situation darstellt.

An der fehlenden Intellisense-Funktion für managed C++/CLI (managed C++), die ja auch viele Benutzer vermissen, scheint sich nichts getan zu haben. Microsoft scheint hier auch einen der Nachteile einer ‘buy’-Lösung zu erfahren: die fehlende Möglichkeit der individuellen Anpassung. Vermutlich lässt sich der hinzugekaufte Compiler der Edison Design Group, der ja in Visual Studio 2010 für die Bereitstellung der Intellisense-Fetaures in C++ verwendet wird, nicht ohne weiteres so erweitern, dass er mit den Spracherweiterungen von C++/CLI vernünftig umgeht.

Auf der anderen Seite muss man sagen, dass der Intellisense-Support für Standard C++ in Visual Studio 2010 viel besser ist als in älteren Versionen von Visual Studio und die Produktivität spürbar steigert. Insbesondere, dass Fehler direkt beim Tippen angezeigt werden, ist eine große Hilfe (man könnte auch sagen, dass dieses Feature langsam überfällig war).

Viele Grüße,
Andreas

Technorati Tags:

Bessere Suchergebnisse mit dem “Google-Code”

January 16th, 2011

Hallo,

kürzlich bin ich beim Stöbern in der Buchhandlung auf das kleine Büchlein “Der Google-Code” (Untertitel: Das Geheimnis der besten Suchergebnisse)  von Henk van Ess gestoßen.

Da ein effiziente Nutzung von Suchmaschinen für Wissensarbeiter aller Art – und insbesondere für Softwareentwickler – eine erhebliche Effizienz-Verbesserung bedeutet, habe ich es mir angeschaut und spontan gekauft. Das Buch ist sehr kompakt, flüssig zu lesen und gibt einige nützliche Tipps zum Umgang mit Google.

Die Kernpunkte sind:

  • Google ist nicht perfekt
  • Es gibt auch noch andere Suchmaschinen als Google
  • Die nützlichsten Operatoren für die Suche (site:, inurl: bestimmte Begriffe erfordern oder vermeiden mit ‘+’ und ‘-’, die Möglichkeit Intervalle für Zahlen oder Datumswerte einzugeben, Einschränkung auf bestimmte Dateitypen)
  • Bei der Formulierung der Anfrage Teile der Antwort vor wegnehmen
  • Wie kann man die Zuverlässigkeit von Suchergebnissen überprüfen

Insgesamt ein sehr empfehlenswertes Buch, das weder viel Geld noch viel Zeit kostet.

Viele Grüße,
Andreas

MSDN-Tourbus

January 10th, 2011

Hallo zusammen,

Microsoft probiert eine witzige Idee, um seine Produkte besser zu promoten: ein Spezialbus fährt durch Deutschland und hält an vordefinierten Orten, kann aber auch individuell bestellt werden.

Im Bus gibt es die Möglichkeit bis zu zwei Vorträge gleichzeitig anzubieten und Software auszuprobieren. Der Bus ist ab 26.01.2011 unterwegs und startet in München. Es gibt auch ein Blog dazu.

Ein wenig schade ist nur, dass bisher kein Tagesplan bekannt ist. Man kann der Website zwar entnehmen, an welchen Tagen und zu welchen Zeiten der Bus an einem bestimmten Ort ist, aber (noch)  nicht, welche Vorträge bzw. andere Veranstaltungen zu welchen Zeiten geplant sind.

Viele Grüße,
Andreas

More C++ Idioms

August 2nd, 2010

Hallo,

wer sich für C++ interessiert und seinen Horizont erweitern will sollte mal auf die Seite “More C++ Idioms” auf wikibooks.org anschauen.

Dabei kann man nicht nur bekannte C++ Pattern wie Empty Base Class Optimization oder Copy-and-swap wiederholen sondern sich auch interessante neue Ideen aneignen, wie z.B. Safe bool.

Aber Achtung: im Gegensatz zu der Angabe auf der Seite würde ich die Anforderungen an die Leser nicht als “intermediate” sondern als “advanced” einstufen.

Viele Grüße,
Andreas

Technorati Tags: ,

Einschränkungen beim Debuggen mit mixed moded Anwendungen im 64-Bit Modus

June 27th, 2010

Hallo,

kürzlich bekam ich vom Visual Studio 2010 Debugger beim Starten einer Anwendung folgende Fehlermeldung:

—————————
Microsoft Visual Studio
—————————
Fehler beim Ausführen des Projekts: Das Programm “…\unittest\bin\Debug\unittest.exe” kann nicht gestartet werden.

Das Debuggen im gemischten Modus für x64-Prozesse wird nur bei Verwendung von Microsoft .NET Framework vor Version 4 unterstützt.
—————————
OK   Hilfe
————————–

Die Konstellation war dabei folgende:

  • Ein reines C#-Programm referenziert eine Assembly, die mit managed C++ erstellt war. Diese Assembly bindet auch native code ein (mixed mode).
  • Als Compiler wurde der vc90 verwendet.
  • Als Targetversion für das .NET-Framework wurde für alle Komponenten 2.0 verwendet.
  • Alle Anwendungen waren als 32-Bit-Anwendungen in Visual Studio 2008 erstellt und wurden von Visual Studio 2010 zur Version 2010 konvertiert.

Für die in C# erstellte (reine .NET) Anwendung war in den Einstellungen als Zielplattform “Any CPU” eingetragen, wie bereits in der Vorgängerversion:

AnyCPU

Nach der Umstellung auf X86 konnte die Anwendung erfolgreich im Debugger gestartet werden.

X86

Die Fehlermeldung ist grundsätzlich ziemlich irreführend. Alle beteiligten Komponenten waren ja explizit für .NET 2.0 konfiguriert.

Oder ist sie gar falsch?

Auf dieser Seite findet man folgendes Zitat:

Debugging im gemischten Modus (Aufrufe von systemeigenem Code bis zu verwalteten Codes, oder umgekehrt) wird für x64-Prozesse unterstützt, wenn der verwaltete Code Microsoft .NET Framework, Version 4 oder höher, verwendet.

Debugging im gemischten Modus wird nicht für IA64-Prozesse oder x64-Prozesse unterstützt, die frühere .NET Framework-Versionen als 4 verwenden.

was ja ein klarer Gegensatz zur oben zitieren Fehlermeldung ist.

Grundsätzlich ist es schon etwas unschön, wenn man für die reine .NET-Komponent nicht mehr “Any CPU” wählen kann, nur weil sie eine mixed mode Assembly nutzt, die im 32-Bit Modus erstellt wurde.

Eine Rolle könnte auch spielen, dass ich inzwischen Windows 7 x64 benutze, während ich zuvor Windows XP X86 verwendet habe.

Viele Grüße,
Andreas

Technorati Tags: , ,


Visual C++ 2010 kann nur für das .NET Framework 4.0 Code erzeugen

June 20th, 2010

Hallo,

vor einiger Zeit bin ich zu dem Schluss gekommen, meine Entwicklungsumgebung auf Basis von Windows 7 und Visual Studio 2010 neu aufzusetzen. Nach der Konvertierung der C++ Projekte wurde in einer Solution mit C# und C++ Projekten folgende Warnung ausgegeben:

Warnung    2    Auf das Projekt “xxx” kann nicht verwiesen werden.  Das Projekt, auf das verwiesen wird, hat eine höhere Frameworkversion (”4.0″) als Ziel.

In der ursprünglichen Solution war für alle Projekt das .NET Framework 2.0 als Targetversion eingetragen. Das war aus gutem Grund so, da die erstellte Anwendung für den Download über das Internet bereit gestellt wird und auf möglichst vielen Computern ohne weitere Vorbereitungen eingesetzt werden soll.

Eine Erklärung für die implizite Erhöhung der Targetversion für Managed C++ Projekte finden sich in diesem Blog-Eintrag mit einem “Visual Studio 2010 C++ Project Upgrade Guide”:

After conversion, managed C++ projects will target the 4.0 Framework by default.  The reason behind this design is that the VS2010 compiler cannot target Framework 2.0, 3.0 or 3.5. The VS2008 compiler must be used to target 2.0, 3.0 or 3.5. To make the converted C++ application build out of box, we decided to move the TargetFrameWorkVersion to 4.0 by default for C++ applications.

Oops! Mit Visual Studio 2010 können keine Managed C++ Anwendungen für .NET Framework Versionen < 4.0 erstellt werden!

Dagegen hilft nur eines:

The VS2008 compiler must be used to target 2.0, 3.0 or 3.5.

D.h. man ist gezwungen, Visual C++ 2008 zusätzlich zu installieren, wenn man Managed C++ Komponenten erstellen will, die .NET Frameworks < 4.0 als Target haben. Die Änderung der Zielversion geht noch nicht mal in der IDE sondern nur durch Änderung der Projektdateien in einem Editor.

Ich betrachte das als erhebliche Einschränkung, da man in diesem Fall Visual Studio 2008 zusätzlich installieren (und ggf. kaufen) muss, sondern dann auch die schönen neuen C++ Features des Compilers nicht mehr nutzen kann.

Generell habe ich den Eindruck, dass Microsoft sich mit Visual Studio 2010 etwas übernommen hat, und irgendwann einfach die Produktfreigabe beschlossen hat, obwohl es noch viele Probleme und Einschränkungen gab (z.B. wie im obigen Blog-Eintrag beschrieben, oder das Fehlen von Intellisense für Managed C++ oder die unscharfe Erscheinung der Default-Fonts auf manchen Betriebsystemen oder der erhöhte Speicherbedarf  oder das aus nicht nachvollziehbaren Gründen umgestellte Hilfesystem, das jetzt eigentlich unbrauchbar ist.).

Auf der Haben-Seite steht für mich ganz klar der neu implementierte Support für Intellisense (bei native C++ Projekten). Das funktioniert jetzt viel besser als mit Visual C++ und verbessert die Produktivität spürbar.

Viele Grüße,
Andreas

Technorati Tags: