Organisation von Projektreferenzen innerhalb eines Solution

Mir fällt sehr oft auf, dass beim Aufbau einer Anwendung mit mehreren Projekten innerhalb einer Solution, immer wieder eine direkte Abhängigkeit geschaffen wird, indem man beim Projekt sagt: "Verweis hinzufügen" -> Projekte -> Das zu referenzierende Projekt.Gemacht wird so etwas z.B. wenn man die Datenobjekte / -definitionen getrennt von der Logik, Datenzugriff, etc. in einem eigenen Projekt verwalten möchte (was eigentlich so wieso immer getan werden sollte). Solange man alleine an einem Projekt arbeitet mag das noch okay sein und funktionieren; arbeitet man aber in größeren Projektteams zusammen, wo nicht immer alle die komplette Solution inkl. SourceCode Kompilieren sollen / möchten / können, muss man regelmäßig die Referenzen manuell neu aufbauen. Ich empfehle immer nur die kompilierte Assembly zu referenzieren und alle 1024x768 Normal 0 21 false false false DE X-NONE X-NONE MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Normale Tabelle"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;} genutzten Assemblies in einem gemeinsamen Ordner abzulegen. Dann ist es nämlich vollkommen egal, ob man die gesamte Solution, einen Teil oder sogar nur ein Projekt öffnet. Mehr Aufwand bedeutet das für die Konfiguration und Entwicklung auch nicht, da nur einmal bei der Anlage des Projektes ein Post-Build-Kommando in den Einstellungen des Projektes hinterlegt werden muss. Hier ein Beispiel dafür:xcopy /y /d "$(TargetPath)" "$(SolutionDir)SharedAssemblies\"Der Parameter "/d" sorgt dafür das nur aktueller Versionen kopiert werden und "/y" unterdrückt die Nachfrage, ob vorhandene Dateien überschrieben werden sollen und macht dieses einfach automatisch.By the way... eine schöne Übersicht der XCOPY Parameter gibt es hier bei MicrosoftDamit nun die Reihenfolge der Kompilierung richtig ist und auch Veränderungen von z.B. Basisklassen zuerst neu erzeugt werden, muss man unter den Projektabhängigkeiten nun die einzelnen Projekte angeben. Das ist kein Verweis (!) veranlasst aber Visual Studio in der richtigen Reihenfolge die Projekte zu erstellen!that's it

Ein Videoportal auf Basis von DotNetNuke, WCF und MS - Message Queue

Im Netz gibt es zwei Seiten mutlimedia.katholisch.de und www.kirche.tv. Beiden Seiten wurde mit DotNetNuke umgesetzt und sollen so eine Art YouTube darstellen. Natürlich sehr stark spezialisiert auf den Bereich der katholischen Kirche.Die Architektur von diesen Videoportalen ist recht interessant, da hier beide Portale (getrennte Installationen) aus einem gemeinsamen Datenpool bedient werden. Der Lösungsansatz ist DotNetNuke mit WCF zu verheiraten. Die Module zur Darstellung von Videos, zum Upload von Videos und natürlich die Administration von Videos greifen dann nicht wie sonst üblich auf den DataProvider zurück, sonder befragen einfach die laufenden WCF-Services. Die eigentlich "anzeige Module"  - sprich die *.ascx" - greifen aber wie gewohnt auf Controller-Klassen zu, durch die dann eine Kommunikation mit den WCF-Services ermöglicht wird. In den Controllern kann man dann z.B. auch Caching und ähnliches einbauen. Neben der WCF wurde auch die MSMQ (Message Queue) stark genutzt, was gerade im Zusammenspiel mit der WCF sehr viel freude bereitet und denkbar einfach ist. Der große Vorteil bei der Verwendung von MSMQ ist natürlich, dass Prozesse asynchron ablaufen können und der Benutzer nicht warten muss, bis der komplette Workflow-Prozess dahinter abgerabeitet ist. Ein kurzes Beispiel um das zu verdeutlichen: Ein Anwender macht einen Video - Upload durch das DNN-Modul; dieses macht eine erste Validierung der Daten und wenn diese in Ordnung sind, wird eine Nachricht mit allen Informationen in eine transaktionale Message Queue übertragen. Damit ist der Job für das DNN-Modul zunächst erledigt. Ein WCF-Service der permanent die Queue "im Auge" hat, holt die Nachricht ab und bearbeitet diese nun weiter - Daten werden in die Datenbank geschrieben, eine Nachricht zur Konvertierungs Queue abgesetzt, etc.). Gerade bei der Konvertierung von Videos kommt man um einen asynchron Verarbeitung nicht herum, da große Dateien längere Zeit in anspruch nehmen,. Die Konvertierung erfolgt übrigens in das Format Flash. Wenn das Video konvertiert wurde, wertet ein diesmal ei NT-Dienst das Ergebnis aus und berichtet den Status. Für die Konvertierung werden externe Programm eingesetzt und deshalb überwacht das ein NT-Dienst. [Dieser Workflow ist nur sehr grob beschrieben und beinhaltet noch deutlich mehr Schritte]Die beiden Portale laufen nun seit gut 6 Monaten sehr zuverlässig, stabil und schnell. Ein schöner Beweis das man mit DotNetNuke als Basis wirklich so ziemlich alles umsetzen kann und das man DotNetNuke auch wunderbar mit anderen Technologien nutzen kann.Wer ausführlichere Informationen dazu haben möchte, kann sehr gerne mit mir Kontakt aufnehmen...

Bei Google MAPS GEO-Koordinaten mit C# abfragen

Für ein aktuelles Projekt benötige ich von Plätzen / Anschriften die GEO-Koordinaten. Da zur Visualisierung so wieso Google-Maps später eingesetzt werden soll, liegt natürlichdie Google-API nahe. Dafür habe ich heute ein C# Klasse entwickelt, mit der man einfach über einen HTTPRequest das Ergebnis in XML zurück geliefert bekommt. Die Klassen analysiert das Ergebnis von Google auf Fehler und parst die Werte für Latitude und Longitude. Zunächst habe ich mir das Core-Modul von DotNetNuke "MAPS" angeschaut, das ebenfalls die Google-Maps nutzt. Es funktioniert recht gut - nur war ich von der vorgehensweise docht etwas erschrocken: Da wird das Ergebnis wirklich noch mit String-Funktionen (Find, Left, SubString) auseinandergenommen um an die Werte zukommen. Hallo? Wofür gibt es einen XML-Parser, der für solche Aufgaben entwickelt wurde und auch deutlich schneller ist, bei der Analyse von XML. Das aber nur als Zwischenbemerkung an dieser Stelle ;-) Bei der Entwicklung der Klasse hatte ich zunächst Probleme mit XPath die Werte auszulesen. Da ich ja diesmal gezielt ein paar Daten aus dem XML-File benötige und nicht wirklich Node für Node durchgehen muss (wollte), war XPath meine erste Wahl. Mache das aber nicht so häufig und hatte zuerst schwirigkeiten, weil die Abfrage SelectSingleNode immer einen null-Value zurück lieferte. Nach kurzer Zeit viel mir dann aber auf, das Google einen Namespace im XML-Dokument stehen hat - so wie es ja eigentlich auch sein soll. Diesen Namespace muss aber bei einer XPath-Abfrage auf jeden Fall vorher dem Parser bekannt geben. Dann funktioniert die Abfrage auch ohne Probleme. Das sieht dann in etwa so aus: XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);nsManager.AddNamespace("gm", "http://earth.google.com/kml/2.0");///Es wird versucht den Statuscode zu ermittelnXmlNode nodeStatus = xmlDoc.SelectSingleNode("gm:kml/gm:Response/gm:Status/gm:code", nsManager); In der Abfrage hier wird der Status-Cide abgefragt, um zu überprüfen ob die Anfrage erfolgreich war. xmlDoc ist dabei mein XML-Parser ( System.Xml.XmlDocument). Die fertige C# Klasse steht hier zum Download bereit:C#-GoogleMaps-API-GEO-Koordinaten.zip (2,59 KB)

Eine .NET WinForms Anwendung nur einmal starten / arbeiten mit einem mutex

Wenn man eine Anwendung nur einmal durch den Anwender starten lassen möchte, dann ist das mit der Hilfe von einem erzeugten Mutex sehr einfach zu realisieren. Nur ein paar Zeilen Quellcode sind dafür in der Main() Methode notwendig. Wie immer ist der Beispiel-Code in .NET C#. bool createdNew;///Einen neuen Mutex erzeugen, damit die Anwendung nur einmal gestartet werden kann.System.Threading.Mutex appMutex = new System.Threading.Mutex(true, Application.ProductName, out createdNew);///Wenn die Erzeugung erfolgreich warif (createdNew){///... dann kann die Anwendung ausgeführt werdenLogIn frmLogIn = new LogIn();Application.Run(frmLogIn);if (frmLogIn.DialogResult == DialogResult.OK)Application.Run(new MainForm());// den Mutex wieder frei gebenappMutex.ReleaseMutex();}else{///Wenn die Anwendung schon ausgeführt wird -> Hinweis-Dialogstring msg = String.Format("Das Programm \"{0}\" wurde bereits gestartet!", Application.ProductName);MessageBox.Show(msg, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);}

C#/VB .NET Coding Guidelines

Gerade habe ich ein kostenloses eBook zum Thema Coding Guidlines für C# und VB.NET gefunden und möchte darauf aufmerksam machen. Den Download gibt es direkt unter submain.com Das eBook hat folgende Themen: Naming Guidelines Class Member Usage Guidelines Guidelines for Exposing Functionality to COM Error Raising & Handling Guidelines Array Usage Guidelines Operator Overloading Usage Guidelines Guidelines for Casting Types Common Design Patterns Callback Function Usage Time-Out Usage Security in Class Libraries Threading Design Guidelines Formatting Standards Commenting Code Code Reviews Additional Notes for VB .NET Developers Ebenso recht nützlich ist das Tool SmartOutline for VS2005, welches als kostenlose Version auf der Seite zur Verfügung gestellt wird. Damit wird das Handling von #region's - welche ich sehr gerne benutze - noch etwas verbessert.

Eine DotNet Technologie Suchmaschine

Suchmaschinen wie www.google.de oder www.live.de sind für alle Entwickler - ob .NET, PHP, Delphi, etc. - ein wertvolles Werkzeug um schnell Antworten und Lösungen bei Problemem zu finden. Das größte Problem dabei ist aber meist, dass man nicht nur Suchergebnisse bekommt dich sich auch wirklich mit .NET befassen und somit wird die Recherche unnötig erschwert. Dieses gehört aber der Vergangenheit an, denn Dan Appleman hat folgende Website erstellt: http://www.searchdotnet.com/ Diese Suchmaschine basiert auf Google, allerdings werden wirklich nur .NET relevante Ergebnisse angezeigt. Die ersten Erfahrungen mit dieer Suchmaschine waren sehr positiv!

Enterprise Library 3.0 steht zum Download bereit

Die von mir gern benutze und geschätzte Enterprise Library steht nun endlich in der Version 3.0 als Download zur Verfügung. Folgende Application Blocks sind in dem Download-File enthalten: Caching Application Block Cryptography Application Block Data Access Application Block Exception Handling Application Block Logging Application Block Policy Injection Application Block Security Application Block Validation Application Block Ebenso wurde die Integration der Windows Communication Foundation (WCF) vorgenommen. Leider ist meine Zeit im Augenblick etwas knapp aber ich hoffe mir die Finale der Library bald genauer anschauen zu können. Download Enterprise Library 3.0  

Sicherheitsanalyse von WCF (Windows Communication Foundation) durch das BSI und newtelligence

Wie ich schon in meinem Beitrag über den NRW Sumit 06 geschrieben haben, hat Newtelligence eine Beispielanwendung für die WCF geschrieben. Diese Anwendung wurde im Auftrag des BSI (Bundesamt für Sicherheit in der Informationstechnik) entwickelt und sollte nicht nur ein praxisorientierte Beispielanwendung sondern viel mehr die sichere Nutzung der WCF-Sicherheitsfunktionen zeigen.Die Empfehlungen umfassen neben den Hinweisen zu WCF-spezifischen Architekturen, zur sicheren Installation, Authentisierung und zur Anbindung von Datenbanken oder der Fehlerbehandlung in verteilten Systemen auch auch den Quellcode der beispielhaften WCF-Anwendung. Die entwickelten Handlungsempfehlungen sowie die Beispielanwendung kann per E-Mail (security (at) bsi.bund.de) angefordert werden.

Endlich neuer IE / .NET Framework 3.0 ready to download

Vermutlich ist es kein großes Geheimnis mehr aber trotzdem verbreite ich die Neuigkeit auch mal: Microsoft hat den Internet Explorer 7.0 zum Download frei gegeben. Der neue IE ist nicht nur ein Featureupdate sondern laut Aussage von Microsoft ein von Grund auf komplettes Redesign.  Besonders die Punkte Bedienbarkeit und Sicherheit standen im Vordergrund der Entwicklung. Hier gibt es den neuen Browser:Download   Endlich ist es da: Das .NET Framework 3.0 inkl. der passenden SDK's und den passenden Erweiterungen für das Visualstudio 2005. Ein paar Informationen zum .NET Framework und der Installation gibt es hier. Hier die Downloadlinks für die einzelnen Downloads: net 3.0 runtime -> http://www.microsoft.com/downloads/details.aspx?FamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&displaylang=en sdk -> http://www.microsoft.com/downloads/info.aspx?na=40&p=3&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&u=http%3a%2f%2fgo.microsoft.com%2ffwlink%2f%3fLinkId%3d74726 visual studio extensions for WF -> http://www.microsoft.com/downloads/info.aspx?na=40&p=4&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&u=http%3a%2f%2fgo.microsoft.com%2ffwlink%2f%3fLinkId%3d74727 visual studio extensions for WCF, WPF (noch CTP !1) -> http://www.microsoft.com/downloads/info.aspx?na=40&p=2&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&u=http%3a%2f%2fgo.microsoft.com%2ffwlink%2f%3fLinkId%3d74725

Techtalk Indigo / WCF mit Christian Weyer

Gestern abend war ich mal wieder auf einem Techtalk zum Thema: "Teile und herrsche: Verteilte Lösungen mit der Windows Communication Foundation" Hier bot Christian Weyer eine echt klasse "Show" und vermittelte eine sehr gute Einführung in das Thema SO (ohne "a") und WCF. Dabei wurden den Zuhöreren aber keine Slides um die Köpfe geschmießen, sondern Christian arbeitet mit Flipcharts und vielen Code-Beispielen. Man konnte das erzählte meist direkt in der Praxis sehen und somit vielfach deutlich schneller verstehen. Ende des Jahres gibt es eine weiter Beispielanwendung TecTv, das viele Bereiche des neuen .NET Frameworks 3.0 zeig... also WCF, WPF, WWF. Darauf darf man gespannt sein.