Rash thoughts about .NET, C#, F# and Dynamics NAV.


"Every solution will only lead to new problems."

Category C#

In dieser Kategorie geht es um aktuelle Themen bzw. Code-Beispiele zur objektorientierten Programmiersprache C#.

Saturday, 1. March 2008


Integration einer Quellcodeverwaltung in Dynamics NAV

Filed under: .NET 3.0,C#,Dynamics NAV 2009,Navision,Tools,Visual Studio — Steffen Forkmann at 12:45 Uhr

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.

Tags: , , , , , , ,

Saturday, 1. December 2007


Visual Studio 2008, VSS und ReSharper

Filed under: C#,Tools,Visual Studio — Steffen Forkmann at 18:43 Uhr

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. 

Nachtrag: Ilya Ryzhenkov, der Product Manager für ReSharper schreibt in seinem Blog, dass ReSharper 4.0 ab Januar 2008 im EAP-Program downloadbar sein soll.

Nachtrag 2: Visual SourceSafe 2005 Update 1 ist nun auch verfügbar, so dass ich jetzt wieder ordentlich einchecken kann.

Nachtrag 3: Das Early Access Programm (EAP) für ReSharper 4.0 wurde leider auf “bis spätestens zum 15. Februar” verschoben.

Tags: , , , ,

Monday, 19. November 2007


Microsoft Visual Studio 2008 Final zum Download für MSDN-Abonnenten verfügbar

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.

Tags: , , , , ,

Saturday, 6. October 2007


ReSharper 3.0 für Visual Studio 2005 im Test – Refactoring für Profis

Filed under: .NET,ASP.NET,C#,Firmen,Tools,Visual Studio — Steffen Forkmann at 12:03 Uhr

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? 

(weiterlesen…)

Tags: , , , ,

Saturday, 5. May 2007


Vortrag von Roland Weigelt zur Visual Studio 2005 Erweiterbarkeit

Filed under: .NET 3.0,C#,TechTalk,Veranstaltungen,Visual Studio — Steffen Forkmann at 8:57 Uhr

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:

  • Code Snippets
  • Item und Project Templates
  • Wizards
  • Makros
  • Add-Ins

Mehr zu dieser Veranstaltung bzw. die Anmeldung findet man auf den Seiten der .NET User Group Leipzig.


Warning: Creating default object from empty value in /www/htdocs/w007928a/blog/wp-content/plugins/wp-referencesmap/GoogleMapsWrapper.php on line 55

Tags: , , , ,

Wednesday, 14. March 2007


Neu in Visual Studio 2008 – Launch Event Session 2008

Filed under: .NET 3.0,C#,Veranstaltungen,Visual Studio — Steffen Forkmann at 12:52 Uhr

Dirk Primbs (Developer Evangelist) spricht zu ausgewählten Neuerungen in Visual Studio 2008 und dem .NET Framework 3.5 bzw. C# 3.0.

Tags: , , ,

Wednesday, 3. January 2007


Java vs. C# vs. VB.NET

Filed under: C# — Steffen Forkmann at 14:35 Uhr

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? 😉 

Tags:

Codierung einer Textdatei ändern in C#

Filed under: C# — Steffen Forkmann at 14:24 Uhr

Wenn man die Encodierung einer Textdatei ändern möchte, kann man das mit diesem Code-Fragment tun:

public void ConvertEncoding( string fileName, string newFileName, Encoding oldEncoding, Encoding newEncoding) { using (StreamWriter w = new StreamWriter(newFileName, false, newEncoding)) { using (StreamReader r = new StreamReader(fileName, oldEncoding, false)) { int charsRead; char[] buffer = new char[128 * 1024]; while ((charsRead = r.ReadBlock(buffer, 0, buffer.Length)) > 0) w.Write(buffer, 0, charsRead); } } }
Tags:

Wednesday, 8. November 2006


AntMe! – Die Ameisensimulation

Filed under: .NET,C#,Visual Studio,Wettbewerbe — Steffen Forkmann at 17:41 Uhr

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.

AntMe-Simulation

Saturday, 4. November 2006


Eine überwachte Kopierfabrik (5)

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:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="userSettings" type="..."> <section name="DBCopyService.Properties.Settings" type="..." allowExeDefinition="MachineToLocalUser" requirePermission="false" /> </sectionGroup> </configSections> <userSettings> <DBCopyService.Properties.Settings> <setting name="ServerName" serializeAs="String"> <value>serverName</value> </setting> </DBCopyService.Properties.Settings> </userSettings> </configuration>

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:

Eintrag in der app.config:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="DBCopyService"> <section name="entrances" type="DBCopyService.EntranceSection,DBCopyService" /> </sectionGroup> </configSections> <DBCopyService> <entrances> <entrance name="entrance1" path="C:\Eingang\" mailAddress="mail@server.de" /> <entrance name="entrance2" path="C:\Eingang2\" mailAddress="mail2@server.de" /> </entrances> </DBCopyService> </configuration>

Zugriff über Ableitung von ConfigurationElement, ConfigurationElementCollection und ConfigurationSection:

using System; using System.Collections.Generic; using System.Text; using System.Configuration; namespace DBCopyService { public sealed class EntranceElement : ConfigurationElement { /// <summary> /// Gets or sets the name. /// </summary> /// <value>The name.</value> [ConfigurationProperty("name", IsKey = true, IsRequired = true)] public string 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)] public string 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)] public string Path { get { return (string)base["path"]; } set { base["path"] = value; } } } }
using System; using System.Collections.Generic; using System.Text; using System.Configuration; namespace DBCopyService { public sealed class EntranceCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new EntranceElement(); } protected override object GetElementKey( ConfigurationElement element) { return ((EntranceElement)element).Name; } public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } protected override string ElementName { get{ return "entrance"; } } } }
using System; using System.Collections.Generic; using System.Text; using System.Configuration; namespace DBCopyService { public sealed class 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));