Posts mit dem Label Link werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Link werden angezeigt. Alle Posts anzeigen

Dienstag, 9. Februar 2010

BizTalk 2009 Issues unter VS2008

Seit wir mit BizTalk 2009 unter Visual Studio 2008 entwickeln, haben wir immer wieder heftige Probleme mit referenzierten Projekten. Und zwar vornehmlich dann, wenn sich diese innerhalb der gleichen Solution befinden. Nach unseren letzten Problemen hab ich mich auf die Suche gemacht und Blogeinträge mit den gleichen Erfahrungen gefunden:

Dienstag, 7. Juli 2009

Microsoft Message Queue MSMQ

Vor einigen Wochen habe ich einen Crashkurs innerhalb weniger Stunden in Sachen MSMQ durchlaufen müssen, an dessen Ende eine Biztalk Lösung stand. Da ich auf einige Hindernisse gestoßen war, fasse ich mal meine Erfahrungen zusammen.

Kurz gesagt, MQ dient der asynchronen Kommunikation zweier Applikationen. Und das auch über Rechnergrenzen, oder gar Domänengrenzen hinweg. Dazu legt nach dem FIFO Prinzip eine Anwendung auf ihrem System Nachrichten ab, und eine andere lauscht auf die Adresse und greift die Nachricht ab. MSMQ kann sich dabei verschiedener Kommunikations Protokolle bedienen. (engl. Einführung in MSMQ)

MSMQ unterstützt gegenwärtig drei Queue Typen:
- Public Queues (benötigt Active Directory, Adressen werden dort direkt veröffentlich und sind von allen in der selben AD erreichbar, bzw. über Domängrenzen über Replikation)
- Private Queues (benötigt kein AD, die Adresse muss der empfangenden Anwendung daher aber auch bekannt sein, selbst mit AD!)
- Transaktions Queues (Sicherheit verbunden mit hohen Overhead Kosten)

Zum Entwickeln empfehlen sich Hilfstools, denn das größte Problem meines Erachtens (eigentlich das Einzige das ich hatte) ist die Kommunikationsinfrastruktur zu konfigurieren, solange man nicht eine sehr simple Netzwerkstrutur vor sich hat.

Zu einem gibt es dafür von MS das MQBench Paket und dann noch von Cogin ein freies MSMQ First Aid Kit.

Im bin Verzeichnis von MQBench gibt es 2 Tools: MSMQRecv bzw. MSMQSend, mit denen man über die Kommandozeile das Empfangen und Senden testen kann. Zum Vorgehen empfiehlt es sich zuerst einmal lokal zu testen, ob die MQ korrekt eingerichtet wurde. Funktioniert das, kann man zum eigentlichen Empfangsrechner über gehen der die Messages später abgreifen soll. Diese Tools haben aber einen Nachteil, sie unterstützen nur den Typ Public Queue, da sie nur das Pathnamen Format beherrschen. Aber der Pathname MUSS im AD nachgeschlagen werden, sobald es über Rechnergrenzen hinweg geht, d.h. Lokal funktionieren Pathnamen auch wunderbar mit Privat Queues!

Beispiel lokaler(!) Zugriff auf private MQ:
msmqrecv .\private$\MeineTestNachrichten

Remote Zugriff:
msmqrecv <rechnername>\private$\MeineTestNachrichten
-> Error: 0xc00e0003 (= Queue Not Found)
(geht nicht, Path wurde nicht in AD publiziert, da privat!)


Anmerkung: ein Versuch das ganze mit einem Formatname anstatt Pathname aufzurufen führt zu einem 0xc00e0014 (= Illegal Queue Pathname), die Tools können nur Pathname!

Das selbe gilt leider auch für das FirstAidKit!

Wie aber Eingangs erwähnt, unterstützt MSMQ unterschiedliche Kommunikationprotokolle, wie z.B. TCP. Dadurch hat man also die Möglichkeit ohne AD Lookup direkt auf die MQ eines anderen Rechners zuzugreifen. Um aber den Protokoll Zugriff beschreiben zu können, benötigt man das Direct Format Name Format. Da ich kein freies Tool kenne das einem das abnimmt, hab ich mir kurzerhand was in .NET zusammengecoded.

(Eine Anmerkung zum MSMQ Biztalk Adapter, dieser unterstützt das "Direct Format Name" Format ebenfalls von Haus aus.)

Unter System.Messaging gibt es im .NET Framework das richtige Werkzeug dazu:

...
MessageQueue mq = null;
bool cr = false;
string strFormatnameaddress = @"FormatName:DIRECT=TCP:192.168.1.114\test";
 
try
{
   msg.Priority = MessagePriority.Normal;
   mq = new MessageQueue(strFormatnameaddress);
 
   cr = mq.CanRead;
}
catch (System.Messaging.MessageQueueException ex)
{
   Console.WriteLine("MSMQ Error: " + ex.ToString());
}
catch (Exception ex)
{
   Console.WriteLine("Error: " + ex.ToString());
}
finally
{
   mq.Close();
}
 
return cr;
...

Das CanRead Flag gibt uns auf jeden Fall Informationen dazu, ob wir nun überhaupt auf die MQ zugreifen können, oder nicht. Jedenfalls ist die Programmierung sehr simpel, das gilt auch für das empfangen, bzw. senden von Messages:
...
// empfang aller Messages in der MQ
Message[] msgs = mq.GetAllMessages(); 
 
...
 
// senden einer Message in die MQ
Message msg = new Message();
msg.Label = "Test Message";
msg.Body = "Das ist nur ein Test";
mq.Send(msg);
...

Das eigentliche Problem fängt nun da an, wenn man keinen Zugriff auf die Message Queue bekommt. Das läßt sich in der Regel auf Security Einstellungen zurückführen. Was kein großes Problem ist, solange man sich am gleichen AD befindet und man über den Pathnamen zugreifen will (Es reicht in der Regel dem User des lesenden Rechners einfach die Zugriffsrechte auf die MQ zu gewähren, notfalls den Anonymus Access erlauben). Befindet man sich in unterschiedlichen AD (aber noch unter dem gleichen Forrest) benötigt man eigentlich nur noch zusätzlich eine funktionierende AD Replikation für den Pathnamen Zugriff. Ansonsten sollte in der Regel der Direct Format Name Zugriff funktionieren.

Was aber wenn sich die Rechner in unterschiedlichen Forrests befinden? Die unterschiedlichen Forrests müßen sich diese Vertrauen, und das bedeutet entweder Zertifikate, oder die "Umsonst"-Variante: ein Loch in die "Mauer schlagen". Dazu benötigt es nicht viel mehr als eines zusätzlichen Eintrages in die Registry des MQ Servers:
http://msdn.microsoft.com/en-us/library/cc236138(PROT.10).aspx
1.) HKLM\Software\Microsoft\MSMQ\Parameters\security\NewRemoteReadServerAllowNoneSecurityClient dword = 1
2.) Zugriffsrechte für Anonymus

Das gibt dem Admin sicherlich richtige Magenschmerzen ;)


Dazu hat John Breakwell von Microsoft, der einem auch bei einem Microsoft Call Support leistet, ein ausführliches Blog verfasst. Folgende Einträge beschäftigen sich mit MSMQ und Rechnern in unterschiedlichen Forrests: http://blogs.msdn.com/johnbreakwell/archive/2008/02/14/how-do-i-send-msmq-messages-between-domains.aspx http://blogs.msdn.com/johnbreakwell/archive/2008/06/27/cross-forest-msmq-you-need-to-be-trusting.aspx http://blogs.msdn.com/johnbreakwell/archive/2008/10/13/authenticating-msmq-messages-between-forests.aspx

Mittwoch, 29. Oktober 2008

Freie Cryptography API

Eine freie Cryptography API, inkl. OpenPGP, ohne jegliche Lizenzeinschränkungen mit der Ausnahme das License Informations File weiterzugeben. Hört sich zu gut an um wahr zu sein? :)

The Legion of the Bouncy Castle - Bouncy Castle Cryptography API

Features:
  • Generation and parsing of PKCS-12 files.
  • X.509: Generators and parsers for V1 and V3 certificates, V2 CRLs and attribute certificates.
  • PBE algorithms supported by PBEUtil: PBEwithMD2andDES-CBC, PBEwithMD2andRC2-CBC, PBEwithMD5andDES-CBC, PBEwithMD5andRC2-CBC, PBEwithSHA1andDES-CBC, PBEwithSHA1andRC2-CBC, PBEwithSHA-1and128bitRC4, PBEwithSHA-1and40bitRC4, PBEwithSHA-1and3-keyDESEDE-CBC, PBEwithSHA-1and2-keyDESEDE-CBC, PBEwithSHA-1and128bitRC2-CBC, PBEwithSHA-1and40bitRC2-CBC, PBEwithHmacSHA-1, PBEwithHmacSHA-224, PBEwithHmacSHA-256, PBEwithHmacRIPEMD128, PBEwithHmacRIPEMD160, and PBEwithHmacRIPEMD256.
  • Signature algorithms supported by SignerUtilities: MD2withRSA, MD4withRSA, MD5withRSA, RIPEMD128withRSA, RIPEMD160withECDSA, RIPEMD160withRSA, RIPEMD256withRSA, SHA-1withRSA, SHA-224withRSA, SHA-256withRSAandMGF1, SHA-384withRSAandMGF1, SHA-512withRSAandMGF1, SHA-1withDSA, and SHA-1withECDSA.
  • Symmetric key algorithms: AES, Blowfish, Camellia, CAST5, CAST6, DESede, DES, GOST28147, HC-128, HC-256, IDEA, ISAAC, NaccacheStern, Noekeon, RC2, RC4, RC5-32, RC5-64, RC6, Rijndael, Salsa20, SEED, Serpent, Skipjack, TEA/XTEA, Twofish and VMPC.
  • Symmetric key modes: CBC, CFB, CTS, GOFB, OFB, OpenPGPCFB, and SIC (or CTR).
  • Symmetric key paddings: ISO10126d2, ISO7816d4, PKCS-5/7, TBC, X.923, and Zero Byte.
  • Asymmetric key algorithms: RSA (with blinding), ElGamal, DSA, and ECDSA.
  • Asymmetric key paddings/encodings: ISO9796d1, OAEP, and PKCS-1.
  • AEAD block cipher modes: CCM, EAX, and GCM.
  • Digests: GOST3411, MD2, MD4, MD5, RIPEMD128, RIPEMD160, RIPEMD256, RIPEMD320, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, Tiger, and Whirlpool.
  • Signer mechanisms: DSA, ECDSA, ECGOST3410, GOST3410, ISO9796d2, PSS, RSA.
  • Key Agreement: Diffie-Hellman and EC-DH.
  • Macs: CBCBlockCipher, CFBBlockCipher, GOST28147, HMac, ISO9797 Alg. 3, and VMPCMAC.
  • PBE generators: PKCS-12, and PKCS-5 - schemes 1 and 2.
  • OpenPGP (RFC 2440)
  • Cryptographic Message Syntax (CMS, RFC 3852), including streaming API.
  • Online Certificate Status Protocol (OCSP, RFC 2560).
  • Time Stamp Protocol (TSP, RFC 3161).
  • Elliptic Curve Cryptography (support for F2m and Fp curves).
  • Reading/writing of PEM files, including RSA and DSA keys, with a variety of encryptions. 
  • Donnerstag, 16. Oktober 2008

    Siebte Ausgabe des .NET BlogBook erschienen

    Nachdem der letzte Termin für eine neue Ausgabe des .NET BlogBook verstrichen ist, ohne dass der Community eine überarbeitete Version überlassen wurde, ist gestern am 15.10. die nunmehr siebte Ausgabe erschienen.
    Zugegeben, ganz korrekt ist die gerade getroffene Aussage nicht. Denn eine der angekündigten Veränderungen ist die Trennung von Themengebieten in eigene Dateien. Dadurch werden wird also im Prinzip drei BlogBooks bekommen, als da wären:

    • .NET Core
    • ASP.NET
    • Windows Presentation Foundation

    Bisher ist leider erst der WPF-Teil erschienen, die anderen beiden Teile sollen jedoch, laut Norbert Eder,  "im Laufe der kommenden Tage und der nächsten Woche nachgeliefert".

    Die Trennung ist nicht die einzige Änderung, die Einzug gehalten hat.
    Weiterhin wurde das Layout angepasst, um die Lesbarkeit sowie die Qualität von Druckerausgaben zu erhöhen. Auch neue Einträge wurden natürlich hinzugefügt.

    Die Idee der Aufteilung der Themengebiete halte ich für ausgesprochen gut. Die Bereiche WPF und ASP.NET sind zwar durchaus sehr interessante Bereiche von .NET, allerdings spielen diese in meinem täglichen Umgang mit dem Framework eine sehr geringe bis nicht vorhandene Rolle. Da kommt es mir natürlich gerade recht, ein eigenes Dokument für ".NET Core" zur Verfügung zu haben.

    Eine Verbesserung in Sachen Layout ist natürlich immer zu begrüßen, wenn es denn tatsächlich eine Verbesserung ist. Das ist im vorliegenden Fall meiner Meinung aber auf jeden Fall gegeben.

    Insgesamt begrüße ich die Änderungen, so weit ich sie jetzt bearbeitet hat. Also ein absolut positiver Schritt in der Evolution des .NET BlogBook.


    Update am 30.10.2008:
    Es steht jetzt auch der ASP.NET-Teil des Blogbooks zur Verfügung.

    Donnerstag, 9. Oktober 2008

    Online SourceCodeFormatter

    Da das SourceCode-Formatieren unter http://formatmysourcecode.blogspot.com/ zwar funktioniert, jedoch leider kein wirklich ansprechendes Ergebnis liefert, habe ich einmal mehr Google bemüht und tatsächlich einen Formatierer gefunden, der sehr schöne Ergebnisse liefert.

    Zu finden ist er unter http://www.manoli.net/csharpformat.

    Er formatiert C#, VB, HTML/XML/ASPX, T-SQL sowie msh und bietet die Möglichkeiten, Zeilennummern einzublenden und die Hintergründe alternieren zu lassen.

    Zur Verwendung des entstehenden HTML-Codes wird ein StyleSheet benötigt, dass von der Seite bezogen werden kann und dann in die Zielseite eingebunden werden muss. Möchte man das vermeiden, besteht aber auch die Möglichkeit, es in den HTML-Code mit einzubetten, so dass der beschriebene Schritt entfällt.

    Heraus kommt im Übrigen ein sehr übersichtlicher Quelltext, der - verglichen mit dem, was bisher hier an Code zu sehen war - sehr gut zu lesen ist. Was will man mehr?

    Montag, 15. September 2008

    BizTalk error "...has no Transport type specified"

    Das hat mich ein bischen Nerven gekostet, zum Glück hat Félix Mondelo in seinem Blog eine simple Lösung parat:
    Einfach unter C:\Documents and Settings\[user name]\Application Data\Microsoft\BizTalk Server\Deployment\BindingFiles alle Files im BindingFile Verzeichnis löschen. 
    ...es ist wirklich unglaublich an wievielen verstreuten Stellen man bei BizTalk suchen und rumschrauben muss :( 

    Montag, 8. September 2008

    Microsoft Posters (Bezugsquellen und Links)

    Wer kennt sie nicht als Software Entwickler, überall hängen diese schön bunten Poster herum die mal mehr oder weniger sinnvoll Features und Frameworks anschaulich demonstrieren können.

    Bei Microsoft kann man einge davon herunterladen. Was ich sehr bedauerlich finde ist, dass ich keine Einstiegsseite auf MSDN kenne, die einem alle Poster zusammenfassend präsentiert. Nun gut, man kann immerhin die Suche bemühen, dennoch bleibt bei mir das Gefühl nicht alle zu erfassen. Natürlich kann man die auch für einen verhältnismäßig günstigen Preis erwerben, z.B. bei Amazon.de wie die das Posterpack für das .NET Framework 2.0, oder auch über Technet (da kann man auch z.B. die Jahresarchiv DVDs des MSDN Magazins ordern).
    Empfehlenswert finde ich folgende Poster:
    • Ein Namespace und Type Überblick für das .NET Framework 3.5.
    • Hochinteressant finde ich die PnP (Patterns and Practices) Poster: Smart Client Architektur und der Overview.
    • Für Shortcutfetischisten die C# Keybinding Poster für VS2008 und VS2005 (gibt es auch für Basic und C++. J# und der Rest gehen leider leer aus).
    • Wer mit InfoPath oder Sharepoint entwickelt wird hier fündig, inkl. einer Developer Roadmap für Office 2007.
    • Für BizTalk2006 Entwickler gibts gleich nen ganzen Schwung an Poster, u.a. die Datenbank Struktur inkl. der SQL Jobs und die Runtime Architektur.

    Mittwoch, 3. September 2008

    Hashtable und der loadFactor Parameter

    Ich bin heute über den "ominösen" float loadFactor Parameter im Hashtable Constructor beim Fremdcode debuggen gestoßen. Wer sich nicht mit theoretischen Verständnis belasten will, nicht das "letzte" bischen Performance braucht und auch noch nie eine "System.InvalidOperationException: Hashtable insert failed. Load factor too high" Exception gesehen hat, dem sei gesagt, laß den loadFactor in Ruhe. Der ist Standardmäßig auf 0.72 eingestellt und völlig ausreichend normalerweise.

    Wer jetzt noch dabei ist, der muss sich nun darauf gefasst machen das ich recht weit ausholen muß. Nach etwas Recherche in Wesner Moise's legendärem .NET undocumented blog, ging mir ein Licht auf, was dass denn nun genau ist. 
    Theorie
    Die Grundidee der Hashtable ist, simpel gesagt, mittels des Keys den man besitzt direkt zum Eintrag in einer Liste springen zu können. Kein suchen und langes vergleichen, man hat den Key, berechnet daraus eine Art "Offset" und hat damit den Speicherplatz lokalisiert wo der zugehörige Value abgelegt ist. Die Berechnung dieses "Offsets" übernimmt die Hashfunktion in unserer Hashtable. 
    Z.b. wir haben eine Mitarbeiternummer für 50 Mitarbeiter, um jeden Eindeutig zu identifizieren würde es reichen aus den letzten 2 Nummern der Mitarbeiternummer einen eindeutigen Hashcode zu berechnen, ergo reicht uns ein vorinitialisiertes leeres Array von 100 Einträgen (nennen wir dieses Array Buckets) und je nach Hashcode kann man dann zum berechneten Index springen (egal ob 0 oder 99). Nun kommt aber Mitarbeiter 51, und dessen letzten 2 Ziffern aus der Mitarbeiternummer stimmen ganz zufällig mit der eines anderen überein. Ein insert schlägt fehl (Hashtable insert failed), unsere Hashfunktion ist nicht ausreichend und es gibt das, was man eine Collision in der Hashtable nennt. 
    Um diese Collision  zu vermeiden kann man nun z.B. die Hashfunktion neu implementieren, nur haben wir dann das dilema, um so komplizierter und einzigartiger dieser Hashcode berechnet  wird, um so langsamer wird jeder Zugriff auf unsere Hashtable. Ein anderer Ansatz geht vom Load Factor der Hashtable aus. haben wir unsere Buckets aus dem obigen Beispiel mit der Größe 100 und 50 Einträge drin, dann beträgt der Load Factor 50/100 = 0.5. Das heißt unsere Buckets sind zu 50% gefüllt, die Wahrscheinlichkeit das eine Collision stattfindet ist 0.5. Um so niedriger wir diesen Faktor drücken können, um so unwahrscheinlicher ist eine Collision, aber auch um so mehr freien Speicherplatz verpulvern wir sprichwörtlich. 
    Aber selbst wenn wir die Wahrscheinlichkeit drücken, sie bleibt bestehen, daher benötigt man eine Technik die im Falle der Collision eine Gegenstrategie fährt. Buckets machen aus unserem 1-dimensionalen Array ein 2-dimensionales Array. Ist der Index belegt, wird einfach in der 2. Dimension am nächsten freien Index unser Kollidierter Hash abgelegt. Praktisch auffüllen wie bei einem Eimer (Bucket). Die Nachteile sind offentsichtlich, das eingangs erwähnte "Vergleichen", dass man vermeiden wollte ist plötzlich wieder da, auch noch eine Collisiondetektions und Handlingsroutine.
    Ergo man kann es also auf den Punkt bringen, mehr Speicherplatz für mehr Performance in der Hashtable. Vermeidet man Kollisionen, vermeidet man unnötige Operationszeiten. Sowohl beim schreiben und vor allem auch beim auslesen.
    .NET Praxis
    Nach dem theoretischen Ausflug zurück zu .NET. Ganz so simpel wie das theoretische Modell ist es nicht ganz in der Praxis.
    Buckets sind in der .NET Hashtable ein Array von Arrays, um genau zu sein ein Bucket[], wobei jedes Bucket drei Werte hält: hash_coll (int), key (object) und val (object):
    Füge ich in die obige Hashtable den key "a" ein, berechnet die Hashfunktion einen Wert dazu und ordnet diesem Wert einen Index in DIESEM(!) Bucket Array zu (andere Bucket Array Größe, andere Zuordnungsweise). Daher wird in dieser Hashtable (100, 1.0f), der key "a" immer an Position 49 im Bucket Array landen (.NET 3.5). Hätte ich nun einen key zur Hand, dessen Hashcode zufällig identisch wäre, würde eine Collision eintreten und das Collision Handling tritt ein. Dazu wird der Hashkey neu berechnet und als "Offset" zu der Kollision Index Position aufgerechnet. Es wird also nicht wie im klassischen Bucket in die 2. Dimension gegangen, sondern, flapsig gesagt, flach "weitergesprungen" (was uns den Compare aus der Theorie von oben erspart!).
    Das wiederrum erklärt warum das Bucket Array hier deutlich größer ist als der vorgegebene Initialwert von 100. Und jetzt kommen wir damit auch endlich zum loadFactor und dessen Auswirkung. Ich habe den Wert von 1.0f übergeben als loadFactor. Dies wird mit dem Initialwert 0.72 multipliziert. D.h. würde ich 0.5f übergeben, wäre der interne loadFactor 0.36:
    Die Berechnung der Bucket Anzahl ist jetzt eher nebensächlich, grob gesagt die Initialgröße dividiert durch den loadFactor und dann die nächste Primzahl (aus statistischen Gründen für maximale Effektivität). Wesner Moise läßt sich in seinem Blog detailierter darüber aus, wen es genauer interessiert (siehe Verlinkung oben).
    Fazit
    D.h. zusammenfassend:
    um so kleiner der loadFactor...
    -> um so größer das Bucket Array
    -> um so mehr Speicherverbrauch
    -> um so weniger Collisionen
    -> um so weniger Operationen
    -> um so höhere Performance in Abhängigkeit von der steigenden Anzahl der keys (was wirklich durchaus in einem signifikanten Rahmen liegt, ...probierts aus)

    Freitag, 29. August 2008

    Microsoft StyleCop 4.3 SDK Dokumentation veröffentlicht

    Wie ich gerade via Microsoft StyleCop Blog erfahren habe, wurde soeben die Dokumentation des StyleCop 4.3 SDK veröffentlicht. Zu beziehen ist diese hier.

    Noch habe ich nicht in die heruntergeladene CHM-Datei geschaut, doch wird versprochen, dass erläutert wird, wie eigene StyleCop-Regeln erstellt und verwendet werden können, wie man dem Settings-Dialog des StyleCop eigene Settings hinzufügen kann und wie man den StyleCop in seine vorhandene Build-Umgebung einbetten kann.

    Der erste Punkt ist dabei der, der mich am meisten freut, denn bei uns in der Firma ist es vorgeschrieben, dass auf deutsch dokumentiert wird. Da bringen mir die Regeln des StyleCop nicht wirklich viel, die mir sagen, dass ein Dokumentationskommentar für Konstruktoren gefälligst mit "Initializes a new instance of the XYZ class" anzufangen haben. Also geht es jetzt mit munterem lokalisieren und Rule-Bobbeln los. Das Wochenende ist gerettet!

    Mittwoch, 20. August 2008

    BizTalk Hotrod Online Magazin

    Und ein drittes Mal BizTalk von mir heute... Es gibt ein interessantes freies Online PDF Magazin das sich mit BizTalk beschäftigt und vierteljährlich erscheint: http://biztalkhotrod.com/default.aspx Es ist auf jeden Fall einen Blick wert, da man als BizTalk Entwickler sowieso nicht gerade mit Publikationen erschlagen wird. Die zurückliegenden Ausgaben können unter hier heruntergeladen werden Beim Thema Publikationen sollte ich noch erwähnen dass einzige gute Buch das ich kenne: Professional BizTalk Server 2006 von Wrox (in Englisch versteht sich). Es geht nicht besonders stark in die Tiefe, behandelt eher konstruierte Aufgabenstellungen, aber man findet eigentlich immer zu einem Problem zumindestens einen Ansatz mit dem sich weiterarbeiten lässt. BizTalk Profis werden wohl etwas weniger mit dem Buch anfangen können. Das Buch ist gut strukturiert und liest sich sehr flüssig. Nach Amazon Bewertung würde ich da mal 4 von 5 Punkten für vergeben.

    StyleCop v4.3 erschienen

    Wie ich gerade anhand des Microsoft StyleCop-Blogs erfahren habe, ist die neue Version 4.3 des StyleCop erschienen.

    Unter anderem wurden in dieser Version einige Bugs gefixt sowie neue Rules eingefügt. Sehr schön finde ich auch, dass die Definition der einzelnen Rules jetzt wohl im Visual Studio verfübar sein soll. Bis jetzt musste ich immer das WWW durchforsten, wenn ich eine mir unbekannte Rule-Verletzung im Code hatte. Sehr positive Entwicklung.

    Zum Download geht es hier. Unter diesem Link steht auch eine Doku zur Verfügung, die ebenfalls die Rules und deren Erklärung enthält.

    Montag, 18. August 2008

    Microsoft StyleCop

    Vor kurzem bin ich wieder einmal über ein sehr nettes Tool gestolpert, das Microsoft den C#-Programmierern zur Verfügung stellt, um die Codequalität zu verbessern, ähnlich dem FxCop. Anders als der angesprochene FxCop analysiert der StyleCop allerdings keine Assemblies sondern den geschriebenen Code direkt im VisualStudio. Auch werden von ihm natürlich andere Themengebiete abgedeckt als vom FxCop.

    Hat man den StyleCop hier heruntergeladen und installiert, hat man im VisualStudio im Menü "Extras" ("Tools" in der englischen Version) zwei neue Menüpunkte, mämlich "Run Source Analysis" und "Run Source Analysis (Rescan all)". Die erste Option kann auch durch die Tastenkombination Ctrl + Shift + Y aufgerufen werden. Führt man die Quellcode-Analyse durch, erscheint ein neues Fenster, das die Ergebnise für die Solution enthält.

    Hingewiesen wird hier unter anderem auf fehlende Dokumentationskommentare, "falsche" Formatierung und ähnliches. Weiterhin bekommt man eine Meldung, wenn man beispielsweise vergessen hat, einer Klasse explizit einen Zugriffsmodifizierer zuzuweisen, was ja doch schon mal passieren kann, wenn die Klasse sowieso private sein soll.

    Interessant finde ich das AddOn hauptsächlich deswegen, weil es einem die Coding-Guidelines, die (zumindest teilweise) bei Microsoft verwendet werden. Ein paar Kleinigkeiten habe ich bereits gelernt, zum Beispiel, dass Using-Direktiven innerhalb eines Namespace gemacht werden und jede Datei einen definierten Header bekommen sollte. Die Sache mit den Using-Direktiven verstehe ich zwar noch nicht wirklich, doch den Grund hierfür werde ich schon noch herausfinden.  Falls da jemand etwas Genaueres sagen kann, so möge er dies doch bitte via Kommentar tun. Header verwende ich natürlich in meinen Sourcefiles, doch nicht in der Form, wie sie der StyleCop verlangt.

    Für jeden, der sich für die Optimierung seines Codings interessiert, der möge sich den StyleCop herunterladen und installieren. Bei mir wird er jedenfalls jetzt regelmäßig zum Einsatz kommen.

    Nachtrag: Wie ich gerade festgestellt habe, halten sich die von VisualStudio generierten Codedateien selbst nicht an die Vorgabe des StyleCop. Interessant...

    Donnerstag, 7. August 2008

    Sysinternals Tools Live

    Meine heißgeliebten nützlichen Helferlein kann man auch direkt ausführen von: http://live.sysinternals.com/ :)

    Montag, 4. August 2008

    PowerCommands für VS2008

    Gerade eben bin ich über ein sehr interessantes Projekt bei der MSDN Code Gallery gestolpert: die PowerCommands for Visual Studio 2008.

    Dabei handelt es sich um ein Set von nützlichen Erweiterungen, die man - mehr oder weniger - in Visual Studio immer mal wieder vermisst. Beispielsweise erhält man einen Eintrag im Kontext-Menü, der es einem erlaubt, alle geöffneten Projekte zuzuklappen. Natürlich nichts wirklich besonderes, aber bei fünf bis zehn Projekten pro Solution schon sehr angenehm. Für sehr interessant halte ich auch die Möglichkeit, aus einem beliebigen hartkodierten Text eine Konstante zu erstellen. Warum selber bauen, wenn man auch bauen lassen kann?

    Das absolute Killer-Feature für mich ist jedoch die Möglichkeit, sowohl die Recent File List als auch die Recent Project List zu leeren. Ich kann es absolut nicht leiden, wenn gerade die Recent Project List vollgestopft ist mit Projekten, die nur angelegt wurden, um "mal eben" etwas zu testen. Wenn das überhand nimmt, weiß ich in Zukunft, was ich zu tun habe!

    Mittwoch, 23. Juli 2008

    HowTo: Erstellen von Snippets

    Gestern habe ich über .NET-Snippets.de berichtet, wo man eine Vielzahl von nützlichen Snippets finden kann. Nun kennt sich vielleicht nicht jeder mit der Thematik Snippets aus und weiß, wie man heruntergeladene Snippets in Visual Studio verfügbar macht. Oder das Posting hat den Ehrgeiz geweckt, eigene Snippets zu erstellen, doch es fehlt das Wissen, wie das zu erledigen ist.

    Deshalb kam mir der Gedanke, ein HowTo zu schreiben, wie man Snippets erstellen und in VS einbinden kann. Doch da kam mir ein heutiges Posting in den MSDN-News zuvor. Es trägt den Namen "Codierungs-Turbos in Visual Studio 2008" und behandelt einige Interessante Themen, wie man mit Hilfe von Visual Studio Programmierarbeit schneller erledigen kann. Netterweise ist unter anderem ein kompletter Abschnitt über Snippets mit an Bord. Dieser behandelt wirklich alles rund um Snippets. Ganz so, als hätte Microsoft gerochen, was mir gerade so im Kopf herum geht.

    Zu erreichen ist der gesamte Beitrag hier: Codierungshilfsmittel Der Abschnitt über Snippets ist hier zu finden: Erstellen und Verwenden von IntelliSense-Codeausschnitten

    Donnerstag, 17. Juli 2008

    HowTo: Erstellen eines Windows Service unter .NET

    Da ich gerade zum ersten mal in die Verlegenheit komme, einen Windows Service unter .NET zu entwickeln, habe ich mich mal ein wenig im WWW umgeschaut, um ein brauchbares Tutorial zu finden. Fündig wurde ich hierbei bei CodeGuru.

    Im Tutorial wird nicht nur sehr schön erklärt, wie ein Windows Service aufgebaut ist, sondern es wird ebenfalls darauf eingegangen, wie er zu installieren ist und wie man den laufenden Service dann debuggen kann. Gerade für Anfänger auf dem Gebiet sicherlich sehr nützliche Informationen. Das Tutorial ist hier zu finden: http://www.codeguru.com/columns/dotnet/article.php/c6027/

    Noch ein Zusatz von meiner Seite: Bei der Installation des Windows Service via InstallUtil.exe über die Visual Studio Eingabeaufforderung ist unbedingt die Version des Frameworks zu beachten, mit der der Service erstellt wurde. Wird nämlich die Eingabeaufforderung einer anderen Framework-Version verwendet als jene, mit der der Service erstellt wurde, erhält man beim Aufruf von InstallUtil.exe nur einen Fehler, der einem mitteilt, dass der Service nicht installiert werden konnte.

    Alternativ kann man die normale Windows-Eingabeaufforderung verwenden und InstallUtil.exe aus dem Ordner "C:\WINDOWS\Microsoft.NET\Framework\FRAMEWORKVERSION" heraus starten.

    Mittwoch, 16. Juli 2008

    Verzögerung beim .NET BlogBook

    Wie ich gerade eben via Norbert Eders Blog erfahren habe, verzögert sich das Erscheinen der nunmehr siebten Ausgabe des .NET BlogBook. Der eigentliche Erscheinungstermin wäre der 15. Juli gewesen.

    Wie im entsprechenden Post nachzulesen ist, hängt die Verspätung damit zusammen, dass zur Zeit ein "großer Umbau" vorgenommen wird. Dieser scheint so groß zu sein, dass die nächste Ausgabe wohl erst am 15. Oktober erscheinen wird.

    Da bin ich doch jetzt wirklich mal gespannt, wie die Änderungen am BlogBook aussehen werden.

    Dienstag, 15. Juli 2008

    Webcast: Neuerungen im SP1 für .NET3.5 & VS2008

    Am heutigen Dienstag ist ein Webcast erschienen, der sich mit den Neuerungen und Änderungen  in .NET 3.5 und Visual Studio 2008 beschäftigt, die durch das Service Pack 1 Einzug halten werden. Als Vorbereitung auf den Release ist dies mit Sicherheit eine sehr interessante Sache und für jeden Entwickler, der mit der Technologie bzw. dem Tool arbeitet, ein Muss, um vorbereitet zu sein.

    Über die Qualität kann ich bisher leider noch nichts sagen, da ich mir den Webcast noch nicht angeschaut habe. Da er aber von Dariusz Parys abgehalten wird, kann er eigentlich nur sehr gut und informativ sein. Unbedingt anschauen!

    Zu beziehen ist der Webcast (mit gültigem Live-Account) hier: https://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032382740

    Skype-AddIn für Visual Studio 2005 / 2008

    Ein weiterer Schritt in Richtung "Ich geh nie wieder aus meinem VS raus" ist gemacht: Der thailändische Entwickler Keng Pongsathon hat ein AddIn für Visual Studio geschrieben, welches Skype in unser aller Lieblingsspielzeug einbindet. Dieses ist auf Codeplex verfügbar: http://www.codeplex.com/SkypeStudio/

    Über Sinn und Unsinn dieses AddIns kann man jetzt diskutieren. Meine Reaktion war eher in Richtung "Wozu", die eines anderen Teilnehmers an diesem Blog ein schlichtes "Goil". Da sollte sich wohl jeder selbst seine Meinung bilden.

    Gefunden habe ich das AddIn im Übrigen über den deutschen MSDN Blog.

    Montag, 9. Juni 2008

    Vergleich VB.NET und C#

    Ich springe in letzter Zeit öfter mal zwsichen VB.NET und C# hin und her, wobei ich ganz klar aus der C#-Ecke komme und mich daher mit der Syntax von VB.NET nicht wirklich auskenne.
    Da kommt mir diese Seite mehr als gelegen. Hier wird ein direkter Vergleich angestellt, wie etwas in C# und VB.NET realisiert wird. Danke dafür an meinen Kollegen Sebastian.

    Sollte ein Leser des Öfteren zwischen C# und Java wechseln müssen, für den gibt es hier eine ähnliche Übersicht.