Wie bereits vor einiger Zeit im Blog berichtet, habe ich für unseren internen Produktionsablauf ein Tool geschrieben, das es ermöglicht eine Quellcodeversionsverwaltung (z.B. VSS, SVN oder Team Foundation Server) direkt in Dynamics NAV zu integrieren. Jetzt habe ich mir mal die Mühe gemacht, die wichtigsten Funktionen in einem kleinen Screencast zu dokumentieren. (Dies ist jedoch erstmal nur eine Vorabversion des Videos.)Â
Das Schöne an diesem Tool ist, dass man aus beiden Blickrichtungen alle nötigen Informationen zu einer Version bekommt. Ich sehe also an der Datei die Änderungshistorie mit den entsprechenden ChangeRequests oder Ticketnummern und kann auch rückwärts an einer Aufgabe sehen, welche Änderungen dafür konkret am Quellcode gemacht wurden und von wem.
Für Visual Studio-Nutzer ist das natürlich nichts neues, aber gerade im ERP-Bereich wird oft (mangels fehlender Tools) auf eine Quellcodeverwaltung verzichtet.
Kurz nachdem ich mir Visual Studio 2008 installiert habe, wollte ich ein kleineres Datenbank-Projekt komplett auf LINQ2SQL umstellen. Insgesamt muss ich sagen, dass dies erstaunlich leicht von der Hand ging und der Quellcode nun wesentlich schöner und aufgeräumter aussieht.
Allerdings habe ich immer noch zwei riesige Probleme:
1. Die VSS-Integration in Visual Studio 2008 buggt
Leider ist das Update 1 für VisualSourceSafe 2005 nicht rechtzeitig zum Release von Visual Studio 2008 fertig geworden. Es gibt zwar eine CTP, aber nur für die englische Version (die ich natürlich gerade nicht habe). Da ich aber vermeiden wollte unser gesamtes VSS in eine instabile Lage zu versetzen, habe ich notgedrungen die SourceSafeIntegration meines Projektes abgeschaltet. Jetzt kopiere ich mir Sicherungen – was für ein Rückschlag!
2. ReSharper 3.x kann mit C# 3.0 nichts anfangen
Offenbar ist auch JetBrains vom Release von VS2008 etwas überrollt wurden. Mein Lieblingsplugin ReSharper versteht leider kein C# 3.0 und insbesondere auch kein LINQ. Also markiert er den gesamten LINQ-Code als fehlerhaft und blockiert auch das IntelliSense. Auch dies ist ein äußerst unbefriedigender Zustand – zumal C# 3.0 Support offenbar erst für ReSharper 4.0 geplant ist. Momentan habe ich jedoch die Hoffnung, dass kurzfristig wenigstens ein paar Features eingebaut werden, die selektiv für einige Files ReSharper abschalten können.Â
Filed under: C#,Visual Studio — Steffen Forkmann at 11:17 Uhr
Ich habe eben bei Florian gelesen, dass die Visual Studio 2008 Team Suite Final und damit auch das .NET Framework 3.5 seit heute zum Download angeboten werden – also wie versprochen noch im November. Ich gehe mal davon aus, dass die “MSDN Subscriber Downloads” heute wohl wieder ziemlich langsam werden. 😉
Jetzt kann ich endlich C# 3.0 und LINQ für Produktivumgebungen einsetzen.
Nachtrag: Die Express-Versionen von Visual Sudio 2008 (Visual Basic 2008 Express, Visual C# 2008 Express, Visual C++ 2008 Express, Visual WebDeveloper 2008 Express)Â kann man ab jetzt auch kostenlos downloaden.
ReSharper ist ein Plugin der Firma JetBrains für Visual Studio, das sich speziell die Produktivitätssteigerung beim Entwickeln als Ziel gesetzt hat. Besonderes Augenmerk wird dabei auf die Refactoring-Unterstüzung gelegt, also auf das nachträgliche Umgestalten von Quellcode. JetBrains wirbt damit das “intelligenteste AddIn für Visual Studio” entwickelt zu haben – doch was kann ReSharper wirklich?Â
Am 06.07.2007 findet ab 19:30 ein sehr interessantes Event in Leipzig statt. Roland Weigelt wird über die Entwicklung seines mehrfach ausgezeichneten Plugins GhostDoc berichten und einen Einblick in die Visual Studio Erweiterbarkeit geben. GhostDoc ist für mich neben ReSharper das wichtigste Plugin für Visual Studio überhaupt.
Der Vortragende wird folgende Features vorstellen:
Für Java-Programmierer bzw. VB-Programmierer die gern in C# einsteigen wollen, gibt es eine Schnellreferenz mit den wichtigsten Syntaxunterschieden. Das funktioniert natürlich auch umgekehrt – aber wer würde schon freiwillig von C# weg wollen? 😉
AntMe! ist ein Programmierspiel zur Erlernung der Möglichkeiten der Künstlichen Intelligenz (KI). Dabei soll man zu Spielbeginn ein kleines Programm schreiben, um das eigene Arbeitervolk zu kontrollieren. Man kann dabei Nahrung sammeln, den Gegner ausspionieren oder sogar attackieren. Um bei AntMe! mitzumachen braucht man nur eine der kostenlosen Visual Studio Express-Versionen, egal ob Visual Basic, C# oder J#.
Weitere Informationen inkl. Tutorial und allen Projektvorlagen gibt es auf der Seite der AntMe!-Betaversion.
Filed under: C#,Tools — Steffen Forkmann at 11:22 Uhr
Im fünften Teil meiner Serie möchte ich auf erweiterte Möglichkeiten der Konfiguration des Dienstes eingehen. Über die ApplicationSettings ist es in Visual Studio ganz einfach möglich Strings, Integer usw. als globale Anwendungseinstellungen (web.config bei ASP.NET – sonst app.config) abzuspeichern:
Der Zugriff auf die Einstellung “ServerName” erfolgt dann ganz einfach über Properties.Settings.Default.ServerName. Man kann sogar zur Laufzeit die Settings ändern und wieder abspeichern.
Wenn man jedoch komplexere Strukturen in den Einstellungen ablegen möchte, kommt man um etwas Code nicht mehr herum. Im folgenden Beispiel lege ich die neue Sektion “entrances” an, um dort dann beliebig viele Eingangsverzeichnisse überwachen zu lassen:
Zugriff über Ableitung von ConfigurationElement, ConfigurationElementCollection und ConfigurationSection:
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
namespace DBCopyService
{
publicsealedclass EntranceElement : ConfigurationElement
{
///<summary>/// Gets or sets the name.
///</summary>///<value>The name.</value> [ConfigurationProperty("name", IsKey =true, IsRequired =true)]
publicstring Name
{
get { return (string)base["name"]; }
set { base["name"] = value; }
}
///<summary>/// Gets or sets the mail address.
///</summary>///<value>The mail address.</value> [ConfigurationProperty("mailAddress", IsRequired =true)]
publicstring MailAddress
{
get { return (string)base["mailAddress"]; }
set { base["mailAddress"] = value; }
}
///<summary>/// Gets or sets the path.
///</summary>///<value>The path.</value> [ConfigurationProperty("path", IsRequired =true)]
publicstring Path
{
get { return (string)base["path"]; }
set { base["path"] = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
namespace DBCopyService
{
publicsealedclass EntranceCollection
: ConfigurationElementCollection
{
protectedoverride ConfigurationElement
CreateNewElement()
{
returnnew EntranceElement();
}
protectedoverrideobject GetElementKey(
ConfigurationElement element)
{
return ((EntranceElement)element).Name;
}
publicoverride ConfigurationElementCollectionType
CollectionType
{
get
{
return
ConfigurationElementCollectionType.BasicMap;
}
}
protectedoverridestring ElementName
{
get{ return"entrance"; }
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
namespace DBCopyService
{
publicsealedclass EntranceSection : ConfigurationSection
{
[ConfigurationProperty("", IsDefaultCollection =true)]
public EntranceCollection Entrances
{
get { return (EntranceCollection)base[""]; }
}
}
}
Mit Hilfe dieser Klassenstruktur (Element, Collection, Section) kann man nun bequem auf die Section zugreifen:
EntranceSection entranceSection =
ConfigurationManager.GetSection("DBCopyService/entrances")
as EntranceSection;
foreach (EntranceElement element in entranceSection.Entrances)
Console.WriteLine(
string.Format("Path {0}, Mail {1}",
element.Path,
element.MailAddress));