Archive

Posts Tagged ‘visual studio’

Eine professionelle Entwicklungsinfrastruktur für (fast) lau (Teil 2 von 5) – IDE

November 28th, 2007 No comments

Mit knapp 2 Monaten Verspätung folgt nun also der zweite Teil dieser kleinen Serie :-)

Die IDE ist das meist täglich gebrauchte Werkzeug eines jeden Entwicklers. Unter .NET ist das mit Abstand am meisten verbreitete Exemplar dieser Gattung Visual Studio in den verschiedenen Ausprägungen. Wie bereits in Teil 1 geschrieben, erachte ich die Wahl der IDE als sekundär, Hauptsache der Entwickler findet sich damit zu Recht – also vergleichbar mit den Kochmessern eines Küchenchefs :-)

Dieser Artikel wird zeigen, wie man mittels Visual Studio 2008 seine Projekte mit UnitTests testet. UnitTests sollten genauso ein Selbstverständnis für einen Entwickler sein, wie auch alle anderen Punkte dieser Serie. Ich möchte hier nicht ins Detail gehen, das machen andere schon sehr gut – trotzdem aber die wichtigsten Punkte, um was es beim Unit-Testing geht. Zuerst also etwas Theorie.

Definition

Für ne schlaue Definition muss wiedermal Wikipedia herhalten:

“(…) unit testing is a procedure used to validate that individual units of source code are working properly. A unit is the smallest testable part of an application.”

Also – man testet den kleinst-möglichen testbaren Teil einer Applikation – und das ist per Definition in einer OO-Anwendung natürlich die Methode. Dieser scheinbar unspektakuläre Satz, beeinhaltet schon einige der Grundsätze von Unit Tests.

  • Jeder Unit-Test testet genau eine Methode, nicht mehr und nicht weniger. Es werden also keine ganzen Abläufe (z.B. Abfolge von Method-Calls) getestet.
  • Das Resultat eines Unit-Tests sagt aus, ob die Methode (und nur genau die) gemäss dem definierten Testfall korrekt funktioniert.

Unit-Tests sollten immer möglichst einfach gehalten werden, dies reduziert das Risiko von Fehler im Test selbst.

Test-Driven Development

Im Zusammenhang mit Unit-Tests wird oftmals von Test-Driven Development (TDD) gesprochen. Wie der Name schon sagt, geht es dabei darum, mittels Tests zur eigentlichen Implementation zu kommen. Neue Funktionen werden stets gegen die zuvor definierten Testfälle implementiert und getestet. Eine Funktion gilt dann als implementiert, wenn diese alle für sie definierten Testfälle erfolgreich durchlaufen kann. In diesem Zusammenhang ebenfalls wichtige Konzepte sind

  • KISS – Keep it simple, stupid
  • YAGNI – You ain’t gonna need it

Wichtiger Punkt im TDD ist also, nur genau das zu implementieren, was auch gefordert wird – und alles was gefordert wird, muss als Testfall hinterlegt sein. Jede Funktion die zusätzlich implementiert wird, quasi als gutgemeinten Bonus, ist nicht getestet (zumindest durch Unit-Tests) und stellt daher eine Verletzung dieser Prinzipien dar.

Die Regeln des Test-Driven Development

Der Ablauf beim TDD erscheint vielen Entwicklern anfangs etwas umständlich und gewöhnungsbedürftig. Auch scheinen die Regeln teils etwas überbestimmt. Trotzdem hat jede dieser Regeln ihre Berechtigung.

  1. Schreibe den Test
    Hier werden viele bereits stutzig. Den Test vor der eigentlichen Methode schreiben? Genau! Denn die Methode soll ja vom Test abhängen und nicht umgekehrt. Andersrum besteht immer die Gefahr, dass der Test um die Methode gebaut wird. Man testet das, was man weiss das die Methode kann – und nicht was sie können sollte.
  2. Implementiere die Methode so, dass sie (und der zuvor definierte Test) gerade mal kompiliert, der Test aber fehlschlägt
    Dieser Punkt wird oft ignoriert, da er so trivial erscheint. Der Punkt, dass der Test aber immer zuerst fehlschlagen soll, ist sehr zentral, da auch ein Test – wie jedes andere Stück Software auch – prinzipiell Fehler enthalten kann. Das heisst, der Test könnte immer erfolgreich sein, obwohl der Case gar nicht erfüllt ist. Dieser Punkt ist also quasi der Test des Tests.
  3. Implementiere die Methode so, dass sie den Testfall besteht
    Nun gehts also ans Eingemachte, die Methode soll ihre Implementation erhalten, und zwar so, dass sie den zuvor geschriebenen Test erfolgreich durchläuft. Wichtig dabei ist, dass hier noch nicht die ultimative Super-Lösung gebaut werden soll. Es soll in erster Linie mal einfach funktionieren. Nachdem in Punkt 2 ja getestet wurde, dass der Test fehlschlägt wenn er soll, muss jetzt ja auch mal gezeigt werden, dass er zu einer funktionierenden Methode auch sein “OK” gibt.
  4. Refactor
    Nun wird die laufende Lösung von Punkt 4 mittels Refactoring “verschönert”. Der Test muss danach natürlich immer noch korrekt durchlaufen werden.
  5. Starte wieder bei Punkt 1
    Eine Methode hat in den seltensten Fällen nur einen Testfall. Da die Fälle sehr einfach gehalten werden sollen, gibt es hier meist ein ganzes Set von Tests pro Funktion. Dieser Punkt streicht den iterativen Ansatz dieser Methodik hervor. Die Implementation wächst also iterativ mit jedem Testfall, und ist genau dann fertig, wenn keine weiteren Fälle mehr zu definieren sind und alle definierten Fälle erfolgreich abgeschlossen werden können.

Wieso denn nun das ganze? Die Vorteile die aus dieser Vorgehensweise entstehen sollten für sich sprechen:

  • Fehlerfreie Software?
    Nicht ganz – aber man weiss zumindest, und kann auch jederzeit nachprüfen, dass eine Funktion mit den definierten Testfällen klar kommt. Natürlich heisst das noch lange nicht, dass damit die Software korrekt funktioniert oder gar fehlerfrei ist. Jedoch kann man von einem gewissen Grad an Korrektheit ausgehen. Sollten trotzdem Fehler auftreten, waren die Testfälle nicht ausreichend.
  • Entspannte Änderungen
    Jeder kennt das, man muss an einer Software etwas ändern und man ist sich vielleicht nicht ganz 100%ig über die Konsequenzen im Klaren. Side-Effects treten ja meist an den Stellen auf, an denen man sie am wenigsten vermutet. Kann der Entwickler jedoch nach seiner Änderung auf eine Fülle von erfolgreich abgearbeiteten Testfälle blicken, wird das sein Vertrauen merklich steigern. Auch hier gilt aber natürlich Vorsicht, die Änderung kann trotzdem Fehler verursachen! Evtl. müssen für die Änderung auch neue Tests eingeführt werden.
  • Dokumentation
    Auch diese Situation ist wohl den meisten bekannt – man hat eine Methode vor sich und kann irgendwie nicht so greifen, was diese überhaupt genau macht. Die “erklärenden” Sätze in den Kommentaren machen das ganze auch nicht einfacher. Die Testfälle hingegen zeigen mit sehr übersichtlichem und einfachem Code, was die Methode zu erfüllen hat.
  • Lose Kopplung
    Dies kommt praktisch gratis mit TDD mit. Denn wer so vorgeht, wird automatisch wenig Abhängigkeiten erzeugen. Abhängigkeiten sind immer irgendwo problematisch beim testen – da wird man sich also hüten.

Die Krux mit den Abhängigkeiten

Wie bereits geschrieben, sind Abhängigkeiten ein grundsätzliches Problem beim Unit-Testing. Man stelle sich zum Beispiel vor, man möchte eine Methode einer Datenbankzugriffsklasse testen. Beim schlichten Aufruf dieser Methode wird automatisch auch die Datenbank aufgerufen. Was test man so nun? Funktioniert das Db-Statement? Ist die Datenbank erreichbar? Oder doch nur ob die Funktion korrekt funktioniert? Ja genau – alles zusammen, und doch wieder nichts. Wenn was schief geht, ist nicht klar warum. Daraus ergeben sich einige Grundregeln, die man beim Schreiben der Tests beachten sollte:

Ein Unit-Test sollte nie

  • I/O-Funktionalität aufrufen (Filesysteme, Datenbanken, Netzwerk… alles tabu)
  • auf ein Konfigurations-File angewiesen sein
  • von anderen Unit-Tests abhängig sein. Jeder Test muss für sich allein funktionieren.

Solche Abhängigkeiten werden mit Hilfe von Mock-Objekten nachgebaut. Hierzu wird nächstens ein eigener kleiner Artikel folgen.

Wer all dies berücksichtigt – wird glücklich mit TDD – da leg ich meine Hand ins Feuer :-)

TDD mit Visual Studio 2008

Das neue Visual Studio (wie auch das alte :-) ) bietet alles, was man zu TDD benötigt. Zur Veranschaulichung ziehen wir mal so ein Szenario durch. Als Beispiel dient uns eine Applikation, die beliebige Zeichenketten durch verschiedene Sortieralgorithmen sortieren kann – so zum Beispiel mit QuickSort, ein beliebter “Divide and Conquer”-Algorithmus.

Als Ausgangslage dient uns folgender Aufbau der Applikation:

Ansicht Projektstruktur

Program.cs beinhaltet etwas Code zur Verarbeitung der Eingabe sowie die schlussendliche Ausgabe des Resultates. ISortAlgorithm ist ein Interface, welches die Schnittstellen eines Sortieralgorithmus’ vorgibt – nämlich:

public interface ISortAlgorithm
{
  string Sort(string toSort);
}

Nun haben wir ja vorhin einen schönen Ablauf definiert, also sehen wir mal ob der was taugt:

Punkt 1 – Test schreiben:

An dieser Stelle erlaube ich mir bereits die erste kleine Abweichung obiger Regel. Und zwar erstelle ich mir jeweils aus Bequemlichkeit bereits die Klasse sowie den Methodenrumpf bevor ich den Test schreibe. Das hat den Vorteil, das man beim Test schreiben auf IntelliSense zurückgreifen kann und nicht alles komisch rot unterstrichen erscheint. Ausserdem kann man sich das Gerüst für die Tests gleich in Visual Studio generieren lassen.

Ich erstelle also die Klasse QuickSortAlgorithm und implementiere das obige Interface ISortingAlgorithm. Das ist’s dann aber auch schon. Danach genügt ein Rechtsklick ins Fenster zum Erstellen des Test-Projektes.

Testprojekt erstellen

Testprojekt erstellen Dialog

In dem generierten File findet sich dann eine Methode SortTest. Dies ist nun also unser Test, dessen Logik wir nun noch zu definieren haben.

       [TestMethod()]
       public void SortTest()
       {
            QuickSortAlgorithm target = new QuickSortAlgorithm(); // TODO: Initialize to an appropriate value
            string toSort = string.Empty; // TODO: Initialize to an appropriate value
            string expected = string.Empty; // TODO: Initialize to an appropriate value
            string actual;
            actual = target.Sort(toSort);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method.");
        }

Das TestMethod-Attribut gibt an, dass es sich bei der Methode um einen Test handelt. Dies ist notwendig, damit Visual Studio damit zu Recht kommt.

Um dies zu tun, muss man sich natürlich über die Anforderungen im Klaren sein. Unit-Tests sind WhiteBox-Tests – der Entwickler weiss also von der Implementation, dies ist auch nötig, wie wir später noch sehen werden. Also die Anforderung ist, dass wir der Methode einen String übergeben können und dieser sortiert zurück kommt. Entsprechend passen wir den Test an:

        [TestMethod()]
        public void SortTest()
        {
            QuickSortAlgorithm target = new QuickSortAlgorithm();
            string toSort = "bda";
            string expected = "abd";
            string actual;
            actual = target.Sort(toSort);
            Assert.AreEqual(expected, actual);
        }

Sehr schlicht und einfach also das ganze. Gut – und nun zu Punkt 2.

Punkt 2 – Methode implementieren, dass der Test fehlschlägt

Einfach, aber wichtig – also, wir geben einen Wert zurück, der den Test dazu veranlassen müsste, fehlzuschlagen – also zum Beispiel einen Leerstring.

Nun lassen wir den Test ein erstes Mal laufen um zu schauen, ob das Erwartete auch wirklich eintrifft. Ein Weg den Test zu starten ist wiederum über das Kontextmenü der Testmethode:

Tests starten

Und erhält folgendes Resultat:

Testresultate

Wenn das Resultat hier auf “Passed” wäre, wüsste man nun, dass der Test noch fehlerhaft ist, da er offensichtlich falsche Daten also korrekt klassifizierte.

Auf die restlichen Punkte muss hier nicht genauer eingegangen werden. Nun geht es einfach noch darum, die Implementation korrekt zu machen, und weitere Testfälle zu definieren, die sicherstellen, dass der Algorithmus korrekt funktioniert.

Weitere Testfälle wären zum Beispiel:

  • weitere Strings die korrekt sortiert werden müssen (spezielle Daten!), erwartet korrekt sortierte Rückgaben
  • ein Leerstring als Übergabe, erwartet einen Leerstring als Rückgabe
  • null als Übergabe, erwartet eine NullReferenceException
  • usw.

Das Beispiel mit einigen definierten Testfällen gibt’s zum Download.

Code Coverage

Die Code Coverage gibt an, wieviel Prozent der Code-Statements durch einen Test abgedeckt werden. Dieser Wert sagt zwar prinzipiell nicht sehr viel aus, man sollte die Coverage aber dennoch immer etwas im Auge behalten. Ziel sollte ein Wert jenseits der 90%-Marke sein.

Mit Visual Studio lässt sich die Code Coverage sehr einfach messen. Hierzu müssen aber zuerst die Assemblies ausgewählt werden, auf denen die Messung stattfinden soll. Das entsprechende Menu findet man hier:

Code Coverage Konfiguration

Code Coverage Konfiguration

Danach kann man, nachdem die Tests durchgeführt wurden, das Code Coverage-Fenster öffnen und sich die Resultate zu Gemüte führen.

Coverage anzeigen

In dem Fenster kann man sich dann auch gleich anzeigen lassen, welche Zeilen durch einen Test abgedeckt werden und welche nicht. So kann man seine Testfälle optimieren.

Coverage Resultate

Dies zeigt nun auch, wieso Unit-Tests eben WhiteBox-Tests sein müssen. Damit die Testfälle alle Verzweigungen einer Methode berücksichtigen kann, muss der Entwickler des Testfalls wissen, wie die Methode implementiert ist.

Natürlich sagt eine CodeCoverage von 100% nicht sonderlich viel aus – es ist weder ein Qualitätsmerkmal für den Code noch für die Testfälle. Es geht dabei mehr darum, zu entdecken, ob gewisse Code-Teile nicht getestet werden.

Fazit

Unit Tests und TDD sind ein grosses und wichtiges Thema. Visual Studio ermöglicht einen komfortablen Einsatz. Seit der 2008-Version, weden Unit-Tests bereits in der Professional-Variante unterstützt. Allerdings geht es auch ohne – Tools hierfür gibt es wie Sand am Meer. Erwähnt seien hier NUnit, NCover und TestDriven.Net (kostenpflichtig).

Viel braucht es also nicht, um Test-Driven entwickeln zu können. Trotzdem stellt sich der Anfang als eher harzig heraus, da es doch eine etwas andere Denk- und Vorgehensweise erfordert. Die Vorteile überwiegen aber doch klar, und wer sich einmal daran gewöhnt hat, wird es nicht mehr missen wollen.

Und hier noch das Beispiel-Programm zum Download:
StringSort.zip (57.99 KB)

Referenzen

Literatur

Eine professionelle Entwicklungsinfrastruktur für (fast) lau (Teil 1 von 5) – Überblick

September 19th, 2007 1 comment

In dieser Artikelserie möchte ich aufzeigen, was man benötigt um eine (meiner Meinung nach) professionelle Entwicklungsinfrastruktur aufzusetzen. Nun, wahrscheinlich hat jeder so seine eigenen Vorstellungen davon, was unter professionell zu verstehen ist. Gut möglich auch, dass einiges was der eine als professionell auffasst, der andere als unnötig oder übetrieben erachtet. Nichtsdestotrotz gibt es wohl den einen oder anderen Stützpfeiler in der Software-Entwicklung, der sich etabliert und eine gewisse Daseinsberechtigung erarbeitet hat.

Was ist also eine professionelle Entwicklungsinfrastruktur bzw. welche Ziele sollten bei der Einrichtung einer solchen verfolgt werden?

  • Geht es einfach darum dem Entwickler Freude zu bereiten, ihm ein “gutes Gefühl” zu vermitteln?
  • Dem Projektleiter und Kunden ein Gefühl von Sicherheit zu vermitteln?
  • Oder einfach nur das Projekt rechtzeitig und gemäss Anforderungen abzuschliessen?

Richtig – idealerweise werden alle diese Punkte (und noch einige weitere) erreicht.
Eine gut funktionierende und unterstützende Infrastruktur ist zwar nicht die Garantie für all das, aber zumindest bietet sie einem das Werkzeug und die Hilfsmittel, diese Ziele zu erreichen.

Ich werde in diesem Artikel einen Überblick über die Komponenten aufzeigen, die aus meiner Sicht in eine Entwicklungsinfrastruktur gehören – also nicht “wäre noch nett”-Komponenten, sondern “ohne die mach ich keinen Fingerzeig”-Komponenten. Die nächsten Artikel werden dann jeweils detaillierter auf die einzelnen Komponenten eingehen. Die vorgestellten Tools habe ich dabei rein subjektiv ausgewählt. Wer bessere oder einfach andere Altnernativen bzw. Ergänzungen hat, ist angehalten diese per Kommentar mitzuteilen.

Die IDE

“An integrated development environment (IDE), also known as integrated design environment and integrated debugging environment, is a type of computer software that assists computer programmers in developing software.” (Wikipedia)

Die IDE (=Integrated Development Environment) ist wohl das Tool, womit die meisten von uns am meisten Zeit verbringen. Und doch ist es für die Erreichung unserer Ziele wahrscheinlich das unkritischste von allen. Ob der Entwickler nun mit einer “echten” IDE wie VS 2005 oder einfach nur mit einem simplen Texteditor wie Notepad arbeitet, ist letztendlich seinen Angewohnheiten und Vorlieben überlassen. Für das Projektresultat ist die Wahl der IDE bzw. des Editors also insofern wichtig, dass der Entwickler mit seiner IDE quasi harmoniert und sie auch handhaben kann.

Vertreter dieser Kategorie: Visual Studio, SharpDevelop, Eclipse, IntelliJ, JBoss, etc.

In dieser Serie werde ich Visual Studio 2005 TS einsetzen.

Der Artikel zur IDE wird sich auf die Entwicklung von UnitTests mit VS 2005 beschränken.

Versionskontrolle

“Revision control (also known as version control (system) (VCS), source control or (source) code management (SCM)) is the management of multiple revisions of the same unit of information. It is most commonly used in engineering and software development to manage ongoing development of digital documents like application source code, art resources such as blueprints or electronic models and other critical information that may be worked on by a team of people.” (Wikipedia)

Die SCC ist ein absolutes Muss für jeden der auch nur halbwegs professionell Software entwickelt. Erfreulicherweise ist der Einsatz eines entsprechenden Systems auch die Regel – aber leider bestätigen natürlich auch hier die Ausnahmen selbige. Eine gute SCC bietet neben des impliziten BackUps der lokalen Kopie, vorallem auch den Vorteil der Versionierung. Weiter sollte es möglich sein, Source Code auf verschiedenen Zweigen (= Branches) voranzutreiben bzw. Tags oder Labels vom Code zu erstellen. Was das genau ist und wie man damit umgeht, wird in Teil 3 dieser Serie besprochen.

SCC-Systeme werden meist mit Diff- und Merging-Tools ergänzt, da dies natürlich Funktionalitäten sind, die sich bei der täglichen Arbeit mit einer SCC notwendigerweise ergeben.

Die Wahl der SCC ist auch hier eher unbedeutend und sollte halt einfach die jeweiligen Bedürfnisse und Vorlieben abdecken.

Auch hier, einige Vertreter dieser Kategorie: CVS, Subversion, Visual SourceSafe, Sourcegear Vault

In der Serie wird Subversion eingesetzt.

Build-Script

Build automation is the act of scripting or automating the process of compiling computer source code into binary code. This automated build is in contrast to a manual build process where a person has to perform multiple, often tedious and error prone tasks. (Wikipedia)

Ein Build-Script ist keine eigentliche Software-Komponente, sondern halt nur ein Script. Was das Script dann schlussendlich tun soll, ist abhängig von den Wünschen und Anforderungen der Projektteilnehmer. Was es aber grundsätzlich natürlich immer kann bzw. können sollte, ist das schlichte kompilieren des Codes. Als erweiterte Möglichkeiten wären zum Beispiel folgende Punkte denkbar:

  • Erstellung der Datenbank
  • IIS Automatisierung (virt. Directories erstellen, Konfigurationen vornehmen etc.)
  • Umgebungsabhängige Konfigurations-Dateien erstellen (Stichwort: ConnectionString)
  • Automatisierte Test-Durchführung (z.B. UnitTests)
  • SCC-Operationen
  • und und und…

Seit .NET 2.0 haben .NET Entwickler die grosse Erleichterung, dass jedes Solution- bzw. Projektfile von Visual Studio 2005 selbst bereits ein MSBuild-Skript darstellt, welches zumindest mal die Solution oder das Projekt durch einen simplen Kommandozeilen-Aufruf von “msbuild mysolution.sln” kompilieren kann. Damit ist bereits die wichtigste Funktion eines BuildScripts abgedeckt, mit der auch schon einiges erreicht werden kann (z.B. automatische Kompilierung über Scheduled Tasks).

Vertreter dieser Kategorie sind zum Beispiel das eben genannte MSBuild, (n)ant oder auch die klassischen make-Files.

In dieser Serie werden wir auf MSBuild setzen.

Build-Server / Continuous Integration Server

Continuous integration is the name that emerged in the Extreme Programming community for the software engineering practice of immediately committing every change, no matter how small, to a revision control system. Other developers should always work with the latest version of the codebase.” (Wikipedia)

Build-Server im eigentlichen Sinne sind eigentlich heutzutage recht out.In aller Munde hingegen ist Continuous Integration oder kurz CI. Wo genau die Unterschiede sind, wird im entsprechenden Artikel behandelt – wobei der Schwerpunkt klar auf CI-Servern gelegt wird.

Vertreter dieser Kategorie sind Cruise Control (.NET), Team Foundation Server, TeamCity, Bamboo

Wir werden uns mit Cruise Control .NET beschäftigen.

Dies war mal so ein kleiner Überblick über die Themen dieser Serie. Jeder der folgenden Artikel wird dann ein einzelnes dieser Themengebiete genauer beleuchten.

Um nochmals auf die eingangs erwähnten Fragestellungen zurückzukommen:

  • Geht es einfach darum dem Entwickler Freude zu bereiten, ihm ein “gutes Gefühl” zu vermitteln?
    Der Entwickler wird automatisch ein gutes Gefühl erhalten. Automatisch ausgeführte Builds, Tests etc. werden ihm stets das Gefühl verleihen, dass das Programm auf gutem Weg ist. Allein schon die morgendliche Nachricht, dass der Nightlybuild ohne Fehler durchgelaufen ist, wirkt hier Wunder. Im Artikel über CI werden wir aber noch einiges weiter gehen (Nightlybuilds != CI)
  • Dem Projektleiter und Kunden ein Gefühl von Sicherheit zu vermitteln?
    Durch den Einsatz von CI können wir ein stets lauffähiges System vorweisen (das heisst nicht das alle Funktionen bereits vollständig implementiert sind etc.). Es gibt doch nichts Schlimmeres, als wenn der Kunde etwas sehen möchte und der Entwickler ihn mit lauter kryptischen (aber im Entwicklungsprozess) normalen Fehlermeldungen konfrontiert.
  • Oder einfach nur das Projekt rechtzeitig und gemäss Anforderungen abzuschliessen?
    Hierfür brauchts natürlich noch einiges mehr, als eine gute Infrastruktur – aber ein erster Schritt ist damit getan.

Alle verwendeten Komponenten bis auf Visual Studio sind frei erhältlich, der Kostenpunkt sollte also zumindest was die Lizenzkosten anbelangt keinen Grund darstellen, auf diese wichtigen Komponenten zu verzichten – wie es mit dem Aufwand aussieht, werden die nächsten Artikel zeigen.

Regionerate

June 27th, 2007 No comments

Regionerate ist ein interessantes kleines Tool mit dem man C#-Code per Mausklick nach einem definierten Template umformatieren kann (zB. Fields, Properties, Methoden etc. in Regions trennen). So kann man sicherstellen, dass der Code immer gleich formatiert ist.

Dieser Screencast gibt einen guten Einblick in die Funktionen des Tools.

Das ganze funktioniert in VS 2005, Orcas und SharpDevelop.

VS 2005 unter Vista

February 1st, 2007 No comments

Ich habe heute meinen Arbeitsrechner auf Vista umgestellt und bin da doch auf die eine oder andere Hürde gestossen. Vorallem die ASP.NET-Entwicklung unter IIS 7 braucht doch ein zwei Handgriffe, bis das ganze rennt.

Hier eine kleine Übersicht über die Schwierigkeiten (und entsprechende Lösungen) die ich hatte. Vielleicht hilft es ja dem ein oder anderen :-)

VS 2005

  • Wie wohl alle schon mitgekriegt haben, gibts mittlerweile das SP 1 für VS 2005. Dieses muss installiert werden. Für Vista gibt’s noch einen Patch auf das SP drauf, der allerdings noch Beta ist. Mein Rat: Solangs nicht nötig ist, auch nicht installieren (bei mir läuft alles rund ohne).
  • Falls Probleme beim Debuggen auftreten, sollte VS als Administrator gestartet werden

ASP.NET / IIS 7

  • Bei der Installation des IIS 7 muss die Option “IIS 6 Management Compatibility” aktiviert werden.
    iis.PNG
  • Auf den eigentlichen Web-Verzeichnissen müssen die User IIS_IUSRS und NETWORK SERVICE Leserechte erhalten. Ich musste ausserdem für CSS-Dateien sowie auf allen WebServices zusätzlich noch dem IUSR Leserechte gewähren; hab dafür noch keine wirkliche Erklärung gefunden – wer also eine hat… :-)
  • Wenn der neue Integrated Pipeline Modus des IIS 7 verwendet werden soll, müssen eventuell noch änderungen an den web.configs vorgenommen werden, und zwar bei der Registrierung von HttpHandlern bzw. Modulen. Dafür gibts aber netterweise ein fix-fertiges Tool:
    %systemroot%system32inetsrvAPPCMD.EXE migrate config “Default Web Site/myapp”

Mit diesen Schritten konnte ich mein System soweit zum laufen bringen, dass mehr oder weniger alles so funktioniert wie es sollte. Eine sehr umfassende Übersicht, über die Probleme die Visual Studio noch mit Vista hat, findet sich hier.

Ach ja, für die Leute die TortoiseSVN verwenden: Der aktuelle Release scheint den Windows Explorer unter Vista krachen zu lassen. Ich hab dann den aktuellen ReleaseCandidate verwendet (1.4.2.8593), und tut seine Dienste bis jetzt ohne murren.

Ein kleines Stück Heimat…

July 3rd, 2006 No comments

… mitten in VS.NET 2005

Swiss Breakpoint

Das tut einem Fussball-gebeutelten Schweizer Herz gut… :-D

Btw: Erreicht wird diese Darstellung wenn für einen Breakpoint erweiterte Eigenschaften (z.B. Conditions) festgelegt werden.

Cool Commands für VS 2005

April 2nd, 2006 No comments

Ein wiedermal wirklich nettes AddIn für VS 2005, mit vielen kleinen hilfreichen Funktionen, unter anderem:

  • Copy ‘n’ Paste References – Projektreferenzen einfach von einem Projekt kopieren und im andern einfügen
  • Schriftgrösse mit dem Mausrad ändern
  • Builden mit Rechtsklick

Mehr Infos und Download gibts bei Gaston Milano

Sharing Buttons by Linksku