Visual Web Developer Failed to load

Gestern hatte ich beim Starten meiner Entwicklungsumgebung “Visual Studio 2008” eine seltsame Fehlermeldung. Genauer gesagt bekam ich folgende Meldung vorgehalten :

“package ‘Visual Web Developer HTML SourceEditor Package has failed to load properly (GUID={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}}”.

Diese Meldung hatte zur Folge, dass ich im Entwicklungsfenster von Aspx Seiten weder Syntaxcoloring noch Intellisense zur Verfügung hatte. Ebenso wenig konnte ich auf den Designer für Aspx Seiten zugreifen. Einige Zeit später hatte ich jedoch eine funktionierende Lösung des Problems parat und will sie euch nicht vorenthalten.

1. Visual Studio öffnen und Dialog “Extras -> Optionen” bzw. “Tools -> Options” öffnen
2. Wenn deaktiviert, dann aktivieren sie “anzeigen aller Einstellungen”
3. Tab “Umgebung -> Internationale Einstellungen” bzw. “Environment -> International Settings” aufrufen
4. Die Dropdown Box kurz ändern
5. Visual Studio schließen
6. Visual Studio mit diesem Parameter starten -> “/resetskippkgs

Eigene ObservableCollection

In meinem aktuellen Projekt des ArmyGen arbeite ich viel mit ObserveableCollections, da ich viele Abläufe und Änderungen überwachen muss und ggf. andere Objekte davon informiert werden müssen. Eine sehr schicke Sache die Microsoft da mit dem .NET 3.0 eingeführt hat. Jedes mal wird man automatisch benachrichtigt, wenn einer Collection ein Element hinzugefügt, entfernt, bewegt, ersetzt oder sogar die ganze Collection gecleared wird.

Das schöne ist auch, dass in den Eventargs beim hinzufügen und entfernen von Elementen gesagt wird welche Elemente genau behandelt wurden. Einen Haken jedoch gibt es trotzdem. Beim Clear() der Collection wird in den Eventargs keine Angabe darüber gemacht welche Elemente alle verschwunden sind. Wie ich finde eine sehr ärgerliche Sache denn ich nutze oft Clear().

Microsoft wird wohl Gründe für die Entscheidung gehabt haben (vermutlich aus Performance-/Speichergründen), jedoch ist es für mich ein wichtiges Feature auch bei einem Clear() zu erfahren was vorher in der Liste gesteckt hat. Darum habe ich ich meine eigene ObserveableCollection entworfen, bzw. die bestehende modifiziert.

Desweiteren habe ich bei der .NET ObservableCollection eine AddRange() Methode vermisst welche ich ebenfalls in meiner Collection mit eingebaut habe.

Update : Ich habe ganz vergessen eine RemoveRange(IEnumerable) Methode mit einzubauen. Diese habe ich grade noch nachträglich mit eingebaut !

Meine : tww.Util.Collections.ObservableCollection

Do’s and Don’ts #2 Clone()

do's don'tsIn diesem zweiten Beitrag zum Thema “Do’s and Don’ts” möchte ich ein Szenario ansprechen, welches mich erst vor kurzem in meinem ArmyGen Projekt beschäftigt hat. Es geht um das “Klonen” von Objekten. Das .NET Framework bietet nur ein Interface, welches sich “IConeable” nennt, an um das Klonen von Objekten einzubinden. Unglücklicherweise besagt die einzige Methode in diesem Interface (“Clone()“) nicht um welche Art des Klonens es sich dabei handelt.

Man unterscheidet nämlich zwischen dem “DeepClone” und dem “ShallowClone”. Beim Deepclone soll eine Kopie des Objektes entstehen und hinzu sollen alle referenzierten Objekte in diesem Objekt ebenfalls rekursiv kopiert werden. Beim ShallowClone hingegen soll lediglich ein Teil des Objektes kopiert werden und der Rest sollen vorhandene Referenzen sein. Also :

DON’T !

public MyClass : ICloneable
{
    public void Clone()
    {
        //logik
    }
}

Den ganzen Beitrag lesen »

Do’s and Don’ts #1 Compare()

do's don'tsUnter dieser neuen Kategorie möchte ich in Zukunft regelmäßig einige Fragen aufzeigen die im Alltag eines Programmierers, oder zumindest bei mir, öfters auftauchen. Es geht um Kontrukte, bei denen man sich manchmal nicht sicher ist wie es nun in der Praxis “richtig” geschrieben wird. Ich habe mich im letzten halben Jahr sehr oft gefragt welche schreibweise verschiedener Konstrukte wohl am üblichsten ist, was am besten lesbar ist, welches Naming wohl am verständlichsten ist, oder sogar welche Konstrukte möglicherweise Fehleranfällig sind.

In diesem ersten Beitrag zum Thema “Do’s and Don’ts” möchte ich direkt auf ein Szenario stoßen, welches ich gestern in dem Blog von Coding Horror gefunden habe. Es geht um die weitverbreitete Implementierung der CompareTo() Methode (wichtig z.B. bei Sortierungen). Einige Leute wollen besonders viel aus ihrer Optimierung herausholen und versuchen beispielsweise folgenden Ansatz …

DON’T !

public int CompareTo( int valueA, int valueB )
{
    return valueA - valueB
}

Auf den ersten Blick macht das ganze vielleicht Sinn, denn sollten beide wirklich gleich groß sein wird 0 zurückgegeben und ansonsten halt ein Wert der entweder >0 oder <0 ist. Gar nicht mal so schlecht denn man spart sich ein paar If Konstrukte innerhalb der Methode. Stellt euch jedoch einmal vor man würde die Methode folgendermaßen aufrufen :

Den ganzen Beitrag lesen »

Das Observer Pattern

ObserverHeute möchte ich euch gerne das Observer Pattern aus der Familie der Behavioral Patterns vorstellen. Es ist, zumindest nach meiner Einschätzung, eines der wichtigsten und meist genutzten Patterns und gehört, wie ich finde, zum Grundwissen eines guten Programmierers dazu. Einige werden möglichweise sagen, dass es man es an sich so heute gar nicht mehr selbst schreiben braucht, grade in Zeiten von Java und .NET welche über delegates und/oder events verfügen. Recht habt ihr ! Jedoch finde ich es wichtig eine Technologie von Grund auf zu verstehen und somit biete ich hier einen kleinen Crashkurs für Einsteiger.

Zum aufwärmen ein kleines Anwendungsbeispiel:
Stellen wir uns vor wir sitzen in einer Zentrale und müssen den Standort von Zügen überwachen. Was wäre das für ein unglaublicher Aufwand ständig nachzufragen wo sich ein Zug gerade befindet nicht wahr ? Warum also den Spieß nicht einfach umdrehen ? Sollen mir die Züge doch einfach bescheid geben wenn sich ihre aktuelle Position verändert hat. Dazu müsste ich diesen lediglich bescheid sagen : “Hey gib mir absofort deine Position durch wenn sich diese verändert hat“. Das hat außerdem den Vorteil, dass wenn meine Kollegen ebenfalls die Position dieses Zuges abfragen möchten, sie diesen nur bescheid zu geben brauchen.

Den ganzen Beitrag lesen »