Home
.NET BlogBook
Contents
1. Abbildung 64 WMI Code Creator Weitere Features Browsing namespaces Method execution Support of remote computer and more Download WMI Code Creator 1 0 5 8 Guidance Explorer NET BlogBook Ausgabe 4 Fur die Entwicklung unter NET gibt es ja viele hilfreiche Tools und Anwendungen Den Guidance Explorer muss man hier jedoch immer wieder einmal erwahnen Was bietet dieses Tool Nun ja Guidelines Patterns Anti Patterns Checklists Code Samples und Test Cases Das Angebot ist wirklich gut wird standig erweitert und sollte bei keinem NET Programmierer fehlen 5 9 Documentation Generator CodeDoc Aus Zufall bin ich heute auf den Documentation Generator CodeDoc 1 gesto en Das Teil ist Freeware und scheint die notwendigsten Funktionalit ten mitzubringen Die Demo sieht mal ganz gut aus Ein Test wird sich wohl nicht vermeiden lassen Wer also noch auf der Suche nach einem entsprechenden Tool ist der k nnte sich CodeDoc durchaus mal genauer ansehen 1 CodeDoc Documentation Generator 5 10 LINQ Kennst du schon Vergangenes Wochenende habe ich mich ein wenig mit LINQ besch ftigt Mit Hilfe dieser Erweiterung lassen sich sehr einfach Datenquellen abfragen LINQ erweitert C und VB NET um eine native Sprach Syntax Datenquellen abzufragen Von LINQ gibt es zwei unterschiedliche Varianten Mit DLINQ konnen relationale Datenquellen a
2. Console WriteLine Is Inherited rule IsInherited ToString Console WriteLine Propagation Flags rule Propagationflags ToString Console WriteLine File System Right rule FileSystemRights ToString Console WriteLine System Environment NewLine Console WriteLine Adding new Rule Adding a new rule to the file s Access Control List fSec AddAccessRule new System Security AccessControl FileSystemAccessRule System Security Principal WindowsIdentity GetCurrent Name System Security AccessControl FileSystemRights Read amp System Security AccessControl FileSystemRights Write System Security AccessControl AccessControlType Allow Console WriteLine Setting nun FileSecurity NET BlogBook Ausgabe 4 Save Access Control List File SetAccessControl C temptest xml fSec Console Readkey false 2 2 19 Assemblies nur zu Reflection Zwecken laden Die Assembly Klasse bietet die Methoden ReflectionOnlyLoad und ReflectionOnlyLoadFrom um Assemblies in einen eigenen Reflection Context zu laden Damit k nnen Assemblies einfach geladen werden um per Reflection Informationen aus diesen zu beziehen Nicht m glich ist damit das Instanzieren von Objekten ebenso wenig werden Abh ngigkeiten automatisch mit geladen Diese m ssen separat nachgeladen werden Hinweis Nur NET gt 2 0 2 2 20 List lt Person gt oder doch lieber eine PersonCollection In der letzten Zeit er
3. 227 NET BlogBook Ausgabe 4 5 7 WMI Code Creator Mehr zuf llig als gewollt fand ich gestern ein kleines Tool von Microsoft zur Generierung von Code fur die Arbeit mit der WMI Dieses Tool erlaubt es in einer GUI WMI Namespaces und Klassen auszuwahlen und erstellt entsprechend der Auswahl passenden Sourcecode Folgende Sprachen werden unterstutzt o CH e Visual Basic NET e Visual Basic Script VBS JE WMI Code Creator Fie CodeLanguage Target Computer Help Quen for data from a ViMl casa Execut d Receve an event Browse the namespaces on this computer Namespace oativa y Generated Code JF using System 426 classes dynamic or static found using System Management mare dynamic L a uang System Windows Poms oa E 1 me Of Us Dass nemesvace WMI Sanne a art pubic ass Guay ii public static void Maing l Management oject Seancner searcher new Man anagementUbject Searcher root IMA SELECT FROM Winga _BootConfiguration foreach ManagemetObject quenCibj in searcher Gel Search for Property Values ae Console W meLnel m Konsole Wrielinet Wind 12 BootConfiguretion instance Select one value to nanraw the scope of the query Corso Wielie mmm Console Wrielnel Caption 101 quanObj Cantion Th i catch Management Exception 2 F L MessageBox Show An ermo occured while querying for Vill datz I i
4. NET BlogBook Ausgabe 4 Wie im Artikel ASP NET Die PostBack Falle unter Lebensyklen beschrieben m ssen wir bei unserem Source nun darauf aufpassen welches Event wann gefeuert und welche Methode wann aufgerufen wird Kommen UserControls ins Spiel muss nat rlich deren Lebenszyklus ebenfalls betrachtet werden UserControls unterliegen den gleichen Lebenszyklen wie Seiten Im initialen Aufruf der Default aspx wird zuerst Page _Init aufgerufen Darin wird festgestellt dass es keine aktuelle Session gibt und das LoginControl geladen Dieses enth lt folgenden Sourcecode Public partial class Logintcontrol System Web UI UserControl protected void Page Load object sender EventArgs e LoginButton Elick new Eventhancler LoginButton Click protected void LoginButton Click objeet sender EventArgs e Implementierung Login Sobald also das LoginControl instanziiert wird werden die einzelnen Events durchlaufen In diesem Fall Page Load An dieser Stelle wird lediglich der Button Handler gesetzt Es passiert noch nichts gro artiges Wenn wir wieder zur ck zur Default Seite gehen wird nach dem Laden des Login Controls das Men geladen Dieses enth lt lediglich ein originales ASP NET MenuControl und folgenden Source protected void Page Prebender 65 72E sender Byvenr rygs ej if Session sessionInfo null foreach Menultem mi in MainMenu Items if mi Value Home mi
5. E lt contiguration gt a XPath Expression Results Expression Jnt configuration userSettings Aml Explorer Properties Settings Result 1 D lt XmlExplorer Properties Settings gt lt setting name Location serializeAs String gt 2 lt value gt Fr ABB 6 child nodes Abbildung 85 XmlExplorer Wer beispielsweise das XML Notepad verwendet der sollte zus tzlich einen Blick auf den XML Explorer werfen Vor allem im Vergleich zum XML Notepad kann dieses Tool mit einer wesentlich besseren Performance als auch mit weniger Speicherverbrauch aufwarten Allerdings fehlt die Editierfunktion Es ist jedoch wunderbar geeignet eine XML Datei in einer Baumstruktur anzeigen zu lassen Zudem sind einige hilfreiche Funktionen inkludiert Einfach mal ansehen 5 24 NClass kostenloser UML Klassen Designer Abbildung 86 NClass Wer einen leichtgewichtigen UML Klassen Designer sucht der findet ein kostenloses Tool in NClass Zwar bietet es nicht allzu viele Funktionalit ten dennoch sollte es gen gen um einen schnellen berblick ber ein kleines Projekt zu erhalten F r gr ere Projekte eignet sich das NET BlogBook Ausgabe 4 Tool sicherlich nicht da daf r entsprechende Funktionen einfach fehlen Da das Projekt jedoch erst 1m Oktober 2006 erstmalig ver ffentlicht wurde darf noch einiges zu erhoffen sein Aktuelle Features e Precision snapping to align objects wit
6. gesteuert werden kann Beispiel Bei Exceptions stellt sich die Frage wie denn diese im Spezialfall zu behandeln sind Sind sie f r den User sichtbar sollen sie geloggt werden oder gar der schlimmste Fall soll sie nicht behandelt werden Die geworfenen Exceptions werden an den Exception Handling Block bergeben welcher durch eine Konfigurationsdatei entsprechend eingerichtet wird Im Nachhinein kann nun festgelegt werden was mit bestimmten Exceptions passieren soll Ebenso verh lt es sich mit den anderen Blocks Beim Logging verh lt es sich gleich Durch die Konfiguration kann festgelegt werden wohin geloggt werden soll Hier stehen unterschiedlichste M glichkeiten bereit EventLog Datenbank Email Flat File usw In unserem Beispiel m chten wir allerdings alle geworfenen Exceptions via NLog aufzeichnen Sehen wir uns dazu allerdings das Grundger st an Das Beispiel l uft als Konsolenanwendung und Instanziiert eine Klasse DoSomethingClass welche eine einzige Methode ThrowAnException besitzt NET BlogBook Ausgabe 4 using System using System Collections Generic using System Text using Microsoft Practices EnterpriseLibrary ExceptionHandling namespace ExceptionLoggingDemo public class DoSomethingClass public void ThrowAnException catch Exception ex ExceptionPolicy HandleException ex DemoException throw ex Die Konsolen Anwendung selbst sieht folgenderma en aus using System
7. Abbildung 71 Community Server Installation 5 Nachdem der Installer fertig gearbeitet hat ist die Installation abgeschlossen Ist bereits eine Web config in dem Web vorhanden Zeigt der Installer die notigen Informationen an die dann per Copy amp Paste nachgepflegt werden konnen Aus Sicherheitsgrunden sollte das Verzeichnis Installer anschlie end gel scht werden NET BlogBook Ausgabe 4 Community Server Web Installer Windows Internet Explorer we k Q community Server Web Installer I Mr deh ir GQ JS v Q http test veloursnebel de installer Default aspx EB community server Complete Your web config file was successfully updated with the new connection string Click here to navigate to your new site IMPORTANT You should now have a working Community Server installation It is stronaly recommended that you disable the Community Server Web Wizard to prevent unauthorized access to your server To disable the Community Server Web Installation Wizard open the Installer default aspx file found on your web server and follow the instructions in the file to disable the installer Done internet 100 Abbildung 72 Community Server Installation 6 Installation abgeschlossen Sofern bei der Installation die Option Create Sample Data findet man nun einen bereits eingerichteten Weblog eine eingerichtete Image Gallery und naturlich das Forum mit Test Eintragen vor Nachdem man sich als Admi
8. Directory Move strSourceDir strDestDir else try CopyDirectory new DirectoryInfo strSourceDir new DirectoryInfo strDestDir if bDelSource Directory Delete strSourceDir true Catch Exception subEx throw subEx private void CopyDirectory NET BlogBook Ausgabe 4 DirectoryInfo diSourceDir DirectoryInfo diDestDir if diDestDir Exists diDestDir Create FileInfo fiSrcFiles diSourceDir GetFiles foreach FileInfo fiSrcFile in fiSrcFiles fiSrcFile CopyTo Path Combine diDestDir FullName fiSrcFile Name DirectoryInfo diSrcDirectories diSourceDir GetDirectories foreach DirectoryInfo diSrcDirectory in diSrcDirectories CopyDirectory diSrcDirectory new DirectoryInfo Path Combine diDestDir FullName diSrcDirectory Name Was ich an Directory Move allerdings nicht ganz verstehe ist dass eben Verzeichnisse nicht auf unterschiedliche Volumes verschoben werden k nnen File Move kann dies warum also Directory Move Nicht 2 2 79 C Entwicklung einer Notiz Anwendung anhand eines Beispiels Nachdem ich heute zuf llig dar ber gestolpert bin m chte ich diese Artikel Serie nat rlich nicht vorenthalten Worum geht es konkret StickOut ist eine Desktopanwendung f r Kurznotizen mit Unterst tzung f r mehrere Benutzer und Integration in Outlook Es handelt sich um eine Windows Forms Anwendung f r NET Framework 2 0 bei der die Kommunikation mit anderen
9. NET BlogBook Ausgabe 4 Englisch Length of text ntext or image data x to be replicated exceeds configured maximum 65536 Deutsch Lange der zu replizierenden text ntext oder image Daten ubersteigt das konfigurierte Maximum 65536 Dies kann mit folgender Stored Procedure umgangen werden CREATE PROC usp configure maxReplSize NewSize int 1000000 AS xec Sp S onfi gure Mas TEE rep ze exec sp configure max text repl size GNewSize RECONFIGURE WITH OVERRIDE exec sp configure nax text repl size GO In diesem Fall wird die maximale Gr e auf eine Million Zeichen gestellt 7 12 SQL Server Replizierung Alt oder doch neu Wer sich derzeit mit den Gedanken ber eine SQL Server Replizierung spielt und sich nicht sicher ist ob er den altbew hrten SQL Server 2000 oder dann doch den neuen 2005er nehmen soll dann kann ihm geholfen werden Werden in Zukunft nderungen an Tabellen etc vorgenommen Wenn nein dann sehe ich kein Problem bei der Verwendung der 2000er Version Handelt es sich dabei allerdings um ein wachsendes System d h die Struktur der Tabellen etc kann bzw wird sich ver ndern dann rate ich eindeutig zum 2008er Der Grund liegt darin dass nderungen an der Tabellenstruktur im SQL Server 2000 nur schwer nachgezogen werden kann Wird beispielsweise im Verteiler der Server der die Daten an seine Abonnenten verteilt eine neue Tabelle angelegt muss die Publikation als auch die
10. Nicht jedes Unternehmen ist dazu gemacht ein Innovator bzw ein fruher Adopter zu sein siehe Erkl rung Dies bedeutet nicht jede Firma setzt auf neueste Technologien Aus unterschiedlichsten Gr nden Viele vertrauen auf Bew hrtes Es bestehen wenig Risiken damit haben sich bereits Jahre zuvor andere auseinander gesetzt Informationen sind breit verf gbar Foren Blogs B cher und es gibt durchaus gen gend Entwickler die sich mit Bestehendem auskennen und somit im Notfall eingesetzt werden k nnen Bei einem Innovator sieht es hingegen anders aus Aktuellste Technologien werden eingesetzt um der Konkurrenz gegen ber einen technologischen Vorteil zu schaffen Informationen sind rar SDK Dokumentation wenn verf gbar Know How Tr ger m ssen kostenintensiv aufgebaut werden wodurch die Produktivit t anfangs sinkt und nat rlich das Risiko besteht das vorgesehene Projekt nie abzuschlie en Eng mit dem ersten Punkt ist die Tatsache dass Zeit geschaffen werden muss um sich eine Technologie anzueignen In Zeiten wie diesen Microsoft ver ffentlicht laufend neue Technologien ist es sehr schwierig mit den aktuellen Entwicklungen Schritt zu halten und am aktuellen Stand zu bleiben Gefordert sind haupts chlich Entwickler denn diese m ssen dem Unternehmen bzw dessen F hrung die Vorteile der neuen Technologien schmackhaft machen und sie selbt auch erlernen Unternehmen die die M glichkeit bieten auf neue Technologien umzusteigen
11. Visual Studio 2005 ffnet gerne den Default Browser f rs Debuggen und das muss nat rlich nicht immer der Internet Explorer sein oder man m chte explizit einen anderen Browser w hlen Dazu sind folgende Schritte notwendig Debugging stoppen eine ASPX Datei des Web Projektes ffnen Danach auf File Browse With dadurch erscheint der folgende Dialog Browse With default aspx TOV se 5 firefox exe Internal Web Browser Microsoft Internet Exp Size of browser window Default Abbildung 53 Visual Studio Default Browser Hier nun den gew nschten Browser ausw hlen als Default setzen und auf Browse klicken Ab sofort wird dieser Browser f r die Debugging Sessions verwendet 3 5 Visual Studio Anpassung Class Template Ich personlich unterteile meine Klassen gerne in Regionen nach privaten Feldern Eigenschaften etc um hier eine bestm gliche Ubersicht zu erhalten Nat rlich ist es anstrengend dies bei jeder neuen Klasse zu erstellen 176 NET BlogBook Ausgabe 4 Um ein entsprechendes Ergebnis zu erhalten kann das Class Template angepasst werden Aber gleich hier Achtung Bei Fehlern kann ich nicht garantieren wie sich das Visual Studio verhalt ich ubernehme fur etwaige Fehlfunktionen etc keine Haftung So geht es Ben tigt wird die Datei NewCSharpFile cs Diese befindet sich im Programmverzeichnis des Visual Studios unter VCHVCHWizards CSharpAddClassWiz Templates 1033 Diese is
12. int rule FileSystemRights int FileSystemRights Read return false else if System Security AccessControl AccessControlType Allow Equals rule AccessControlType if int FileSystemRights Read amp int rule FileSystemRights int FileSystemRights Read return True else return false return false public static bool IsWriteable string filename WwindowsIdentity principal WindowsIdentity GetCurrent if File Exists filename FileInfo fi new FileInfo filename if fi IsReadOnly return false AuthorizationRuleCollection acl fi GetAccessControl GetAccessRules true true typeof SecuritylIdentifier ror int i OF 1 amp ae l c n 174 System Security AccessControl FileSystemAccessRule rule System Security AccessControl FileSystemAccessRule acl if principal User Equals rule IdentityReference 1f System Security AccessControl AccessControlType Deny Equals rule AccessControlType if int FileSystemRights Write amp int rule FileSystemRights int FileSystemRights Write return false else if System Security AccessControl AccessControlType Allow Equals rule AccessControlType if int FileSystemRights Write amp int rule FileSystemRights int FileSystemRights Write return Crue NET BlogBook Ausgabe 4 return false return false 2 2 18 Mit Dateizugriffs Rechten arbeit
13. oo Add Building i a a Abbildung 12 Matrix Test Game Nun zur Erklarung einige Punkte Darstellungsflache stellt in diesem Beispiel ein ganz normales Panel dar welches lediglich zum besseren Erkennen eingefarbt wurde Wird nun der Button Generate Matrix betatigt wird quasi eine Matrix auf die Spielflache gelegt Diese wird automatisch berechnet und kann durch den Parameter Length gesteuert werden Dieser gibt die Seitenl nge des Quadrates an Der Button Add Building dient dazu ein Building anzulegen Es ist so vorzugehen dass der Button zu klicken ist danach ist auf eine beliebige Stelle des Panels zu klicken Ist der Platz noch nicht belegt wird das Geb ude auf diesem Feld gebaut andernfalls erscheint die entsprechende Meldung Dies ist im Endeffekt auch schon die gesamte Funktionalit t dieser Demo Trotz der K rze der Entwicklungszeit habe ich dennoch versucht dies m glichst einfach und erweiterbar zu gestalten so dass aufgrund dieser Vorlage recht schnell unterschiedliche Bauten etc eingef gt werden k nnen Vorstellbar w ren sicherlich noch Dinge wie Wiesen Personen und auch Geb ude NET BlogBook Ausgabe 4 die nicht auf ein Feld beschrankt sind Ebenfalls musste noch ein Pathfinding Algorithmus implementiert werden und danach ware eine erste spielbare Demo fast fertig Sollte ich Zeit finden werden noch die einen oder anderen Erweiterungen in diese Demo flie en aber grundlegend soll
14. static void Main string args Ery CalculatorProxy proxy new CalculatorProxy test2 Console WriteLine String Format 12 17 107 322112 17 Console WriteLine Srring Format ls 17 10 u iz 177 catch Exception ex Console WriteLine ex Message Console Read public interface ICalculator decimal Add decimal x decimal y decimal Sub decimal x decimal y i public class Calculator ICalculator public decimal Add decimal x decimal y Tecurn Bor yi public decimal Sub decimal x decimal y felurn x y public class CalenlatorProsy ICalculator private Calculator calculator new Calculator private String password test private Bring sivenPassyord null public CalculatorProxy string password this givenPassword password public decimal Add decimal x decimal y if tchie givenP assvord this password return Calculator aAddix y else throw new SecurityException Not allowed Add public decimal Sub decimal x decimal y if this GivenPassword This password return calculator Sub x y else NET BlogBook Ausgabe 4 throw new SecurityException Not allowed Sub Ich m chte nur darauf hinweisen dass ein Protection Proxy entsprechend abgesichert sein sollte Die obige Variante dient lediglich der Veranschaulichung und sollte so nicht verwendet werden 4 6 Qualit ts Management 4 6 1 Was ist Q
15. svn sucht nicht findet und somit die Unterst tzung f r das Projekt deaktiviert Damit der nach dem korrekten Ordner gesucht wird reicht eine einfache Einstellung in der Configdatei von AnkhSVN Die Datei findet man im Ordner C Dokumente und Einstellungen lt Benutzer gt Anwendungsdaten AnkhSVN ankhsvn xml In der Datei ersetzt man den Inhalt des Nodes AdminDirectoryName mit dem Wert svn Per default war bei mir der Node noch auskommentiert Nachdem die nderungen durchgef hrt wurden reicht es wenn die Datei gespeichert und das Projekt geladen wird Hat alles geklappt meldet sich Visual Studio bzw AnkhSVN beim Starten mit folgendem Fenster NET BlogBook Ausgabe 4 Ankh has detected that the solution File For this solution is in a Subversion working copy Do you want to enable Ankh for this solution TF you select Cancel Ankh will not be enabled but vou Will be asked this question again the next time you open the solution en arate 2 4 32 Reservierte ASP NET Projektnamen Gibt man ein ASP NET 1 1 Projekt z B den Namen ValidationSummary wird der Aufruf mit einer Fehlermeldung quittiert KJ Compilation Error Morilla Firefox Date Bearbeten Ancicht Gehe Lesezeichen Extras Hilfe a gt r il T LI http fecsthostValdshorSummes y ebion pii EI akuele Nachrichten J CMS NET User Group NE Die Ressource kann na DE Codefush fer weual myCSHARP de DEE Google 5 Suche
16. Nachdem die Zugangsdaten durch eine selbstgeschriebene Routine validiert wurden kann der Login ausgef hrt werden Hierf r bietet sich die Methode FormsAuthentication RedirectFromLoginPage an die nach dem setzen des Session Cookies eine Redirect auf die angeforderte Seite des Users durchf hrt protected void BER BLICK IODJEEE Sender EventArgs e FormsAuthentication RedirectFromLoginPage TestUser false Nachdem diese Schritte durchgef hrt wurden ist die Einrichtung bereits abgeschlossen und das Web oder Verzeichnis gesichert J rgen hat in seinem Weblog eine weitere M glichkeit aufgezeigt wie sich ein Web vor fremden Zugriffen sch tzen l sst Das Beispielprojekt zu diesem Beitrag findet sich hier 2 4 63 Eingaben im DetailsView validieren Ein h ufig verwendetes Control um Daten anzuzeigen einzuf gen oder zu editieren ist das DetailsView Control Insbesondere vom User eingegebe Daten sollten berpr ft werden bevor sie in die Anwendung bertragen werden Allerdings beinhalten die definierten Felder im DetailsView keine Eigenschaft die eine Validierung aktiviert Auch die mitgelieferten ASP NET Validation Controls k nnen ohne einen kleinen Trick nicht verwendet werden Der bereits angesprochene Trick ist in diesem Fall der kleine Link Convert this into a TemplateField im Fields Men des DetailsView Control Der True Perce Trua Tariu Tru 2 readers leet Tepe The Benl mul Pe hear ef Pri
17. firstClick gt lastZliek 7 firstClick 2 lastClice for i start 1 lt end itt document getklementById chkCollection i checked document getHElementBylId chkCollection lastClick checked FIirerllick 2lIiske IP 33 Mit Hilfe dieser paar Zeilen wird dem User ein wenig mehr Komfort bei der Markierung der CheckBox Controls geboten Grade bei langen Listen erleichtert dies die Arbeit erheblich Zus tzlich zu dem gezeigten Feature sollte noch eine weitere CheckBox die grunds tzlich alle Controls markiert implementiert werden Den Download des Beispielprojekts findet man hier 2 4 6 Wirklich l schen im DetailsView In einem anderen Beitrag hatte ich bereits gezeigt wie leicht es ist eine Wirklich l schen Abfrage im GridView zu implementieren Nun bekam ich mehrere Anfragen per E Mail ob es auch m glich ist diese Abfrage im DetailsView Control einzuf gen Nat rlich ist dies m glich und ebenfalls sehr leicht zu realisieren Schl ssel ist hier auch der Befehl Convert this field into a TemplateField welcher im Dialog Field zur Verf gung steht Abbildung 18 Wirklich l schen im DetailsView 1 Nach der Konvertierung steht ein vollwertiges LinkButton Control zur Verf gung Das NET BlogBook Ausgabe 4 Attribut OnClientClick des Controls kann nun dazu benutzt werden um eine JavaScript Anweisung auszuf hren sobald der Button geklickt wird lt asp TemplateField ShowHeader False
18. var personList from p in personDoc Descendants Person select new Firstname string p Element Firstname Lastname string p Element Lastname Email string p Element Email Weblog string p Element Weblog Active int p Element Active 0 be foreach var person in personList Console Writeline Console WriteLine Firstname person Firstname Console WriteLine Lastname person Lastname Console WriteLine Email person Email Console WriteLine Weblog person Weblog Console WriteLine Active N Derson ACtive Tosctring Console ReadKey Grunds tzlich wird das XML in ein XDocument geladen Nun wird mittels var ein anonymer Typ angelegt welcher die Ergebnisliste der Abfrage aufnimmt Innerhalb des Select new werden die einzelnen Eigenschaften definiert und auf welches Element diese mappen Per Intellisense stehen in weiterer Folge diese Eigenschaften unseres anonymen Types zur Verf gung Zu beachten ist an dieser Stelle vielleicht noch dass die Eigenschaft Active als nullable Type definiert wird 171 NET BlogBook Ausgabe 4 Dies hat den Hintergrund dass es an dieser Stelle zu einer Exception kame ware das Element Active nicht vorhanden Zusammen mit dem Operator kann dadurch auf null abgefragt werden und in diesem Falle der Wert 0 zugewiesen werden Anschlie end wird in einer for each Schleife s mtliche eingelesenen Date
19. ASC WITH IGNORE DUP KEY OFF END GO SET IDENTITY INSERT dbo tPerson ON INSERT dbo tPerson ID Firstname Lastname VALUES 1 N Norbert N Eder INSERT dbo tPerson ID Firstname Lastname VALUES 2 N Karoline N Draxler oul LDENTITY INSEKT dbo tPerson OFF Download Microsoft SQL Server Database Publishing Wizard 1 0 NET BlogBook Ausgabe 4 5 17 Kostenlose Code Coverage Tools Was ist Code Coverage Die Code Coverage Analyse wird zusammen mit Unit Tests eingesetzt Durch sie wird berpr ft welcher Anteil des Sourcecodes durch Tests abgedeckt wird Dadurch kann weiters festgestellt werden welche Bereiche nicht abgedeckt sind und hat so die M glichkeit daf r entsprechende Unit Tests zu bilden Insgesamt wird durch den Einsatz der Code Coverage Analyse die Qualit t der Unit Tests verbessert Kostenlose Code Coverage Tools f r NET Kommerzielle Produkte zu diesem Thema gibt es einige jedoch auch kostenlose Tools sind verf gbar NCover ist eines dieser kostenlosen Tools und steht aktuell in der Version 1 5 5 beta zur Verf gung welche jedoch nur mit dem NET Framework 2 0 zusammenarbeitet und nicht abw rtskompatibel ist Dazu muss zu einer lteren Version gegriffen werden F r eine komfortablere Auswertung der Berichte bietet sich der kostenlose NCoverExplorer an Eine weitere Variante stellt PartCover dar PartCover unterscheidet sich in einigen Bereichen vo
20. Methods Hier der Download System Environment Visualizer 2 2 Der Unterschied zwischen const und static readonly const Mit const definierte Werte werden mit der Kompilierung als Konstanten ausgewiesen und sind danach nicht mehr ver nderbar static readonly NET BlogBook Ausgabe 4 Diese Markierung erfolgt zur Laufzeit Damit gekennzeichnete Werte konnen zur Laufzeit innerhalb der eigenen Klasse modifiziert werden static readonly wird hauptsachlich verwendet wenn der gewunschte Typ nicht als const deklariert werden darf oder wenn der Wert erst zur Laufzeit bekannt ist 2 2 8 Standard Windows Sounds abspielen Seit NET 2 0 gibt es den Namespace System Media und die Klassen SystemSound sowie SystemSounds Damit ist es m glich Standard Windows Sounds abzuspielen um den User auf bestimmte Ereignisse Fehleingaben etc hinzuweisen Der klassische Beep kann mit nachfolgendem Code abgespielt werden System Media SystemSounds Beep Play Naturlich stehen noch weitere Moglichkeiten zur Verfugung Einfach mal die entsprechenden Klassen naher betrachten Zusatzliche Assemblies mussen hierzu nicht eingebunden werden 2 2 9 Die wohl haufigste Ausnahme NullReferenceException Wer kennt sie nicht die nachfolgenden Meldungen System NullReferenceException Object reference not set to an instance of an object System NullReferenceException Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt Was ist pas
21. Mit einem kleinen Trick ist es aber dennoch m glich den Page Parser zufrieden zustellen und eine korrekte Ausgabe zu gew hrleisten Head runat server yisible falses gt Das Attribut visible sorgt dafur das die Ausgabe ohne Tag erfolgt wahrend der Page Parser dieses vorfindet und somit die Verarbeitung nicht unterbricht 2 4 22 Formulare gegen SPAM schutzen Um Formulare gegen SPAM Eintrage zu schutzen bietet sich ein sog Captcha an Die Abk rzung Captcha steht fur completely automated public Turing test to tell computers and humans apart Hinter diesem Wort verbirgt sich eine Technik die mit Hilfe eines Bildes alphanumerische Zeichen darstellt Ir chi untied Page Submit Abbildung 28 Captcha erstellen Robots die nun versuchen das Formular per Automatismus auszuf llen scheitern daran die Zeichen abzulesen und in ein daf r vorgesehenes Formular Feld einzutragen Neben div kostenpflichtigen Controls findet man auf CodeProject com eine fertige Klasse inkl Beschreibung zur freien Verwendung Die Implementierung ist nicht aufwendig und folgt einem einfachen Schema e Generierte Zeichen in Session speichern e Captcha Image erstellen und anzeigen e Eingegebene Zeichen mit dem in der Session gespeicherten Wert vergleichen Zun chst muss die Klasse in den App Code Ordner des Webs kopiert und anschlie end ein WebForm mit dem Namen CIImage aspx hinzugef gt werden Diese WebForm bernimmt das Stream
22. Sinn Folgendes Beispiel soll eine eigene Exception verdeutlichen sing System class MyException ApplicationException public MyExcepricon string Str Console WriteLine str Wie zu erkennen ist ist von der Basisklasse ApplicationException abzuleiten Der Konstruktor erh lt einen Parameter und damit ist die einfachste Variante einer benutzerdefinierten Exception fertig Weitere M glichkeiten k nnen aus dem MSDN bezogen werden NET BlogBook Ausgabe 4 Benutzerdefinierte Ausnahmen konnen wie nachfolgend zu sehen mittels throw geworfen werden throw new MyException Eine benutzerdefinierte Exception ist aufgetreten Eine so geworfene Exception muss nat rlich auch entsprechend behandelt werden Referenzen und weiterf hrende Artikel 1 Exception Management Architecture Guide 2 Exception Class 2 2 35 C Methode mit Parameter via ThreadStart aufrufen Im heutigen Beitrag zum Thema C Beginner m chte ich ein Beispiel zeigen wie mittels ThreadStart eine Methode inkl Parameter aufgerufen werden kann Dazu ist einfach die entsprechende Methode in eine eigene Klasse mit den notwendigen Eigenschaften auszulagern private class TestClass private string parameter null public string Parameter get return this parameter set this parameter value public void Start 4 code goes here In der urspr nglichen Klasse wird der Thread wie folgt gestartet t
23. Start Fage ee OE Start Options Command Line Arguments Working Directo sways Use Internet Explorer False Debug Mode Determines whether an application an URL or the project output will be launched when you start debugging Abbrechen berehmen Hilfe Abbildung 57 Webprojekte und Firefox 3 NET BlogBook Ausgabe 4 3 10 Codebehind Datei in Visual Studio 2005 hinzufugen Der einfachste Weg um ein Codebehind Codebeside File einer ASPX Seite hinzuzufugen ist naturlich der entsprechende Schalter beim anlegen dieser Seite Vergisst man dieses allerdings mal oder mochte nachtraglich noch eine Codebehind Datei hinzuf gen gibt es keine M glichkeit dies mit einem entsprechenden Men punkt in Visual Studio zu erledigen Im Weblog von Jon Galloway findet man ein kleines Makro welches genau dieses Job erledigt Klick 3 11 Project Line Counter fur Visual Studio F r ein Projekt ben tigte ich ein paar Statistiken wie z B Anzahl der Code oder Comment Zeilen Nach kurzer Google Suche stie ich auf das Tool Line Counter von Oz Solomon fre Project Line Counter Results shown for 73 file s File Statistics Help Froject Statistics File Hame Extension Path Li Code Comments Both IE BaseS qliD ataLayer D Frol rh 446 2r BaseSettingsllass De Pro 280 130 fe Partner Di Pro 2r 155 T9 SheetlblectSglDataLaver D Froj 257 168 Be TextFormat D Fro 22 124 By TextSheet bje
24. StickOut Benutzern sowie der Austausch von Kurznotizen ber NET Remoting stattfindet Der neue IPC Kanal von NET Framework 2 0 wird zur Kommunikation zwischen Microsoft Outlook und dem StickOut Prozess verwendet Mit dem Outlook Add In k nnen Sie von beliebigen Outlook Objekten Kurznotizen auf dem Desktop erstellen einschlie lich E Mails Notizen Aufgaben Terminen usw Es wurde darauf geachtet den Speicherbedarf einer NET Anwendungen ma geblich zu verringern und einen z gigen und reibungslosen Umgang f r den Benutzer zu gew hrleisten Dieser mehrteilige Artikel enth lt einen Bericht ber die Entstehung beginnend mit meinem ersten Tag der Anwendungsplanung hin zu allen nachfolgenden Entwurfs Entwicklungs Test und Bereitstellungsphasen Er zeigt die Fortentwicklung der Anwendung bis hin zu den Komplikationen die bei den einzelnen Schritten aufgetreten sind Sie erfahren vieles ber NET Tricks Bereitstellungs und Versionskontrollprobleme Visual Studio Tricks und weitere nicht direkt auf die Entwicklung bezogene Tricks die f r Ihre t gliche Entwicklungsarbeit n tzlich sein k nnen Wer daran Interesse hat hier die Links zu den einzelnen Teilen dieser Serie StickOut Entstehung einer Kurznotiz Anwendung in NET 2 0 Teil 1 StickOut Entstehung einer Kurznotiz Anwendung in NET 2 0 Teil 2 StickOut Entstehung einer Kurznotiz Anwendung in NET 2 0 Teil 3 NET BlogBook Ausgabe 4 2 2 80 C Schnell und generisch Ob
25. TemplateField und das manuelle Casten und Formatieren der Daten Convert ToDateTime Eval Date ToShortDateString gt lt ItemTemplate gt lt asp TemplateField gt lt ItemTemplate gt lt lt asp TemplateField gt NET BlogBook Ausgabe 4 Die Ausgabe erscheint nun formatiert allerdings ohne die M glichkeit die Vorz ge der BoundFields zu nutzen 2 4 26 Controls dynamisch hinzuf gen Immer mal wieder taucht in Foren die Frage auf wie man Controls wie z B die TextBox dynamisch zu einer Seite hinzuf gen kann Mit Hilfe des PlaceHolder Controls ist dies ganz einfach m glich In diesem Beispiel soll der User die Anzahl der TextBox bestimmten K nnen die zur Seite hinzugef gt werden Zun chst muss das PlaceHolder Control eine TextBox und ein Button auf der Seite platziert werden In die TextBox tr gt der User die Anzahl der TextBoxen ein die hinzugef gt werden sollen Der Event OnClick ruft die Methode cmdAddControls Click liest die Anzahl aus und bergibt diese anschlie end an die Methode AddControls EventArgs e int numToAdd Convert ToInt32 txtAddNum Text protected void cmdAddControls Bllckiobject sender AddControls numToAdd Die Methode AddControls ist einfach aufgebaut Innerhalb einer for Schleife wird eine Instanz der TextBox Klasse angelegt und diese dann der Control Collection des PlaceHolders hinzugef gt private void AddControls int number for int i 0 i
26. Vollst ndigkeit halber folgend nochmal der Eintrag in der Web Config lt pages gt Controls lt add assembly BlaBlubWeblogUtils namespace BlaBlubWeblogUtils tagPrefix CC gt lt oontrols gt lt pages gt Nun ist das Custom Control auf jeder Seite verf gbar und kann mit dem entsprechenden Tag eingebunden werden Die Datei wurde zuletzt am lt CC LastWriteTime runat Server gt Uhr ver ndert Den Download der beiden Projekte findet man hier 2 4 47 ViewState Helper Der ViewState Helper von Binary Fortress Software erleichtert die berpr fung der Gr e des ViewStates Ist das Programm gestartet protokolliert es die aufgerufenen Seiten und gibt die Gr e des ViewState aus Neben diversen anderen Informationen ist es au erdem m glich das ViewState zu dekodieren und somit anzuschauen m e A H eee Be thee Aa t Te Lo pe p ee ee al HE mr we Te ie he eee ee a en ee ma be i Bin U Fee ae Sn go ee gr Ser De Her Vi ir il el eh eT Pe Se Ver a l eee ieee mi far wi ee el at ia i ee en Fe ay na u ip were m fer Geary ee fom Fiii iid far ee Fi a e EMs mie y Fe be ue o H mi Te Wipo u u eer B rger N ine ao bn hs 1 pan i et i ee ll a Lj apm i ee ee ee aed HET hay u ee es a ee i ee ee Au aan Ba ta ew a Ls gee ee ee ee ee Sl oo Ba Ei 4 ET tet ee ie lee Ep ee Se ete Gey ee Pers mit aan Ben TEE A ee Baie us A As Ha ha ee ee ip ee e ee ee ee ee au E Oe te a a ree c
27. abgeleite Klasse aufgerufen werden Verwenden Sie eine Klasse die die ICloneable Schnittstelle implementiert wenn eine tiefe oder flache Kopie eines Objekts ffentlich f r die Benutzer bereitgestellt werden muss Bei diesem Thema scheint man sich also selbst bei Microsoft nicht 100 ig einig zu sein Daher also mein Rat f r eigene Frameworks F r den Zweck des Kopierens sollten eigene Interfaces bereitgestellt werden Dadurch k nnen jegliche Zweifel aus dem Weg ger umt werden In Kombination mit einer eindeutigen Dokumentation sieht sich der Konsument des Frameworks dadurch mit keinerlei Fehl Information konfrontiert 2 2 2 Paper zur Common Language Infrastructure CLI Die CLI Spezifikation gibt es ja schon einige Jahre klarerweise doch haben sich die meisten NET Entwickler die Paper zur CLI gespart Hier einfach die Links zu den entsprechenden Dokumenten Ein Durchlesen erh ht auf jeden Fall das Verst ndnis f r NET und die Arbeitsweise im Hintergrund CLI Partition Concepts and Architecture CLI Partition Il Metadata Definition and Semantics CLI Partition Ill Common Intermediate Language CIL Instruction Set CLI Partition IV Profiles and Libraries CLI Partition V Annexes 2 2 3 Objekt auf Eigenschafts nderungen berpr fen Es kommt dann doch vor dass es notwendig ist festzustellen ob sich Eigenschaften eines Objektes ver ndert haben Beispielsweise um beim User nachzufragen ob er die Anderungen auch tats
28. daraufhin erstellt F r Informationen ber tlbimp exe verweise ich auf den ersten Teil 1 dieses Themas 1 Informationen ber tlbimp exe 2 2 29 Strong named assembly trotz Referenz auf eine ActiveX Komponente Teil 3 Im zweiten Teil dieser Serie erw hnte ich das Tool AxImp exe Ich fand jedoch einen wesentlich einfacheren Weg heraus diese Aufgabe mit Visual Studio 2003 zu erledigen Hierzu ist lediglich das Projekt Eigenschaften Fenster des aktuellen Projektes zu ffnen Unter Common Properties General finden sich die beiden Eintr ge e Wrapper Assembly Key File und e Wrapper Assembly Key Name Im ersten Feld ist der Pfad zum Keyfile anzugeben im zweiten ein entsprechender Name Dadurch werden die Wrapper Klassen automatisch signiert NET BlogBook Ausgabe 4 ExchangeWin Property Pages EJ Common Properties i General Assembly Name opiate Designer Defaults Output Type Windows Application References Path Default Namespace Ener Guid Events Startup Object Not set Configuration Properties Application Icon Apo ico Supported Runtimes Assembly Name The name of the outputfile that will hold assembly metadata manifest out potrechen bernehmen He Abbildung 3 Assembly Key File 2 2 30 Object Mapping oder doch lieber DataBinding Oft bekommt man in diversen Foren die Frage zu sehen ob denn nun im eigenen Projekt ein Object Mapping oder doch ein DataBinding verwendet werden soll Hier ein paar P
29. ffentlicht NET BlogBook Ausgabe 4 function play Clicked sender args var play Convert ToCanvas sender play fin w add MouseMonve 3E captureMouse ww constructor j Int Playt functi gt_bakgond i w get chdr r al get_cio se Y gi iuo get_height ne Stepi Die Installation bzw Einrichtung ist denkbar einfach und ebenfalls in der ReadMe txt des Downloadarchivs beschrieben Zun chst m ssen die beiden Dateien intellisense compressed js und intellisense js in den Projektordner entpackt werden Um die Bibliothek in JavaScript Dateien zu referenzieren gen g es einen reference Hinweis am Anfang der Datei einzuf gen lt reference path intellisense js gt function play Clicked sender args var bttPlay Convert ToCanvas sender bttPlay findName audioElement Play Zus tzlich muss in der Html Datei die das Silverlight Objekt darstellt eine weitere Referenz hinzugef gt werden lt script type text javascript src intellisense compressed js gt lt script gt Das Ergebnis ist ein funktionierendes JavaScript Intellisense und Debugging fur Silverlight 1 0 Auf der Codeplex Projektseite findet man dazu nicht nur den Download sondern auch ein Video welches diese Schritte noch mal ausfuhrlich erkl rt und aufzeigt http www codeplex com intellisense 3 24 CopySourceAsHtml mit Visual Studio 2008 Beta 2 nutzen Bereits seit me
30. lt number i TextBox textbox new TextBox textbox Text String Format Textbox O 1 pleControls Controls Add textbox plceControls Controls Addinew LiteralControl lt br ee 7 Das Ergebnis dieser paar Zeilen sind dynamisch hinzugefugte TextBox Controls Allerdings mussen diese Controls nach jedem PostBack erneut hinzugefugt werden Der Inhalt jeder TextBox wird allerdings vom ViewState gespeichert und bleibt somit erhalten Ein Tip am Rand Das Control DynamicControlsPlaceholder von Denis Bauer speichert die hinzugefugten Controls auch uber PostBacks hinweg Das Beispielprojekt gibt es hier 2 4 27 DropDownList Anderung der Auswahl durch JavaScript Dialog bestatigen Heute tauchte in einem Forum die Frage auf ob es m glich ist die nderung der Auswahl einer DropDownList nochmals durch den User per Dialog best tigen zu lassen oder einen Hinweis auszugeben Naturlich ist das moglich Sobald sich die Auswahl und somit auch der Index der DropDownList andern wird der clientseitige Event onChange ausgef hrt Die L sung besteht also darin diesen 127 NET BlogBook Ausgabe 4 Event mit einer entsprechenden JavaScript Methode zu belegen Hierzu habe ich mir folgenden Code geschrieben private void RegisterDDLScript string script if confirm Sicher document getHlementById ddlList ClientID selectedIndex currentIndex return false ddlList Attributes Add onchange
31. nnte es aber sein dass es R ckmeldungen nicht nur f r eine erfolgreiche Durchf hrung geben soll sondern auch wenn Fehler oder Warnungen gemeldet werden sollen Hierzu ist lediglich ein Integer Wert zu definieren und ExitCode entsprechend zu setzen Damit steht der Behandlung von Abbruchbedingungen im Batch nichts mehr im Weg 2 9 2 Abh ngigkeiten Referenzen f hren zu Kompilations Problemen Wer kennt das nicht bei gr eren Auftr gen bzw Produkten Mehrere Projekte tummeln sich in einer Solution und referenzieren einander Oder noch schlimmer die einzelnen Projekte sind in unterschiedlichen Solutions eingebunden Und eventuell sind diese auch gleichzeitig ge ffnet Dann kann es zu folgender Fehlermeldung kommen Error The dependency name Version 2 0 0000 0 Culture neutral PublickKeyToken etc in project name cannot be copied to the run directory because it would conflict with dependency name Version 0 0 0000 0 Culture neutral PublicKeyToken etc In diesem Fall einfach das Visual Studio beenden und alles aus dem bin Ordner des Projektes loschen Danach das Projekt im VS laden und neu kompilieren Nun sollte an sich wieder alles in Ordnung sein PS Naturlich auch die einzelnen Referenzen uberprufen ob es hier nicht notwendige Eintrage in diversen Projekten der Solution gibt 2 9 3 SVN Verzeichnisse mit einem Click entfernen Der Subversion Client TortoiseSVN verwendet wie viele andere auch verstecke
32. tzlich zur bertragung der Dateien per FTP muss eine SQL Server Datenbank eingerichtet werden W hrend der Web Installation werden der Datenbankname der Benutzername und das Passwort ben tigt Zus tzlich muss der Benutzer den Datenbank Rollen public und db owner zugeordnet werden NET BlogBook Ausgabe 4 Installation Community Server Web Installer Windows Internet Explorer go http f lt domain gt fnstaler Zen E OO loe R k x Community Server Web Installer o ei D dah nf AP i iG i EB community server Welcome to the Community Server remote installation wizard Requirements Microsoft NET Framework Version 1 1 or 2 0 of the NET framework must be installed Get help installing the NET framework Internet Information Server IIS or compatible web server software must be installed Get help installing IIS Microsoft SQL Server A Done but with errors on page Kr Internet 100 Abbildung 68 Community Server Installation 2 Der Aufruf der URL http lt domain gt installer startet den Web Installer Nachdem den Lizenzbestimmungen zugestimmt wurde muss die Verbindung zur Datenbank angelegt werden Hierf r wird wie oben bereits geschrieben der Benutzername der Datenbank und das Passwort ben tigt auf erdem muss festgelegt werden ob sich die Anwendung per Windows oder Sql Server Authentication verbinden soll Da in diesem Artikel ein Datenbank Benutzer angelegt wurde f llt die Wa
33. wird aber sehr wahrscheinlich um neue Shortcuts erweitert werden Wer also zukunftig vermehrt auf seine Maus verzichten m chte der sollte einen Blick darauf werfen 3 2 Bookmarks aller ge ffneten Dokumente ohne Ruckfrage entfernen Wer viel mit Bookmarks arbeitet der kommt auch des fteren in die Lage alle gesetzten Bookmarks entfernen zu wollen Hierf r gibt es das Tastenk rzel CTRL B C Allerdings erscheint hier die Nachfrage ob denn wohl wirklich alle entfernt werden sollen Wer dies nicht m chte kann sich folgendes Makro einbauen und dann einem Button Shortcut zuweisen und das ohne diese Nachfrage Dies funktioniert f r alle ge ffneten Dokumente Public Sub RemoveAllBookmarks Dim i As Integer For 1 1 To DTE Documents Count Dim doc As EnvDTE TextDocument doc DTE Documents Item 1 Object doc ClearBookmarks Next End Sub 3 3 Interessante VS 2005 Tastenkombinationen Durch Zufall heute auf zwei interessante Tastenkombinationen des Visual Studios 2005 gekommen CTRL J Korrespondierende s Klammer Tag anspringen CTRL Fokus in die Find ComboBox setzen Diese Tastenkombinationen funktionieren brigens auch unter dem Visual Studio 2003 175 NET BlogBook Ausgabe 4 3 4 Visual Studio 2005 Default Browser setzen Ich hab es schon irgendwann einmal irgendwo gepostet aber jetzt auf die Schnelle nicht gefunden daher an dieser Stelle damit ich es selbst nicht schon wieder vergesse
34. Ausnahme zu behandeln So ein Block k nnte so aussehen MyObject o null try o CallMethod catch NullReferenceException nullException Fehlerausgabe Sonstige Behandlungen Zur cksetzen des Workflows etc catch Exception ex eine andere Exception ist aufgetreten diese muss entsprechend behandlet werden finally hier Code f r Aufr umarbeiten 2 2 10 Vermeide if myBoolean true Oft sieht man Code la if myBoolean true oder if myBoolean true und jeder hat es Zeitweise selbst irgendwo so verwendet NET BlogBook Ausgabe 4 if myBoolean oder if myBoolean ist der saubere Weg dies zu tun und zeugt auch vom Verstandnis von booleschen Variablen 2 2 11 Begriffserklarung Boxing und Unboxing Fur die einen ein alter Hut fur andere ein Grund um auf die Suche nach Informationen und Erklarungen zu gehen Nun ein wenig Licht ins Dunkel kann ich hiermit bringen Es erfolgt nicht nur eine Erklarung der beiden Begriffe sondern auch Hinweise wann diese Techniken eingesetzt werden sollen k nnen und wann dies zu vermeiden sind Boxing ist die Konvertierung eines Werttypen in einen Verweistyp Beispiel int i 999 Werttyp object o object i Konvertierung in einen Verweistyp Unboxing ist die Konvertierung eines Verweistypen in einen Werttyp Beispiel object o 999 Wert in einem Verweistyp int i int o Konvertierung i
35. Client abgearbeitet wird und Code der auf dem Server abgearbeitet wird Um dies zu verdeutlichen habe ich eine kleine Grafik angefertigt Abbildung 25 PopUp per Response Redirect Wie die Grafik zeigt verarbeitet der Server div Controls und C bzw VB NET Code Ist dieser Code verarbeitet wird nichts anderes als reines HTML an den Client bertragen Zu diesem Zeitpunkt ist die Arbeit des Servers f r diese Anfrage beendet Dem Client obliegt nun die Interpretation dieses Codes Da das ffnen des Popups eine Aufgabe des Clients ist beantwortet sich die oben gestellt Frage von selbst Es ist nicht m glich ein Popup per Response Redirect Zu ffnen da das Redirect ohne Wissen des Clients serverseitig ausgef hrt wird Allerdings ist es m glich per C JavaScript Code einzuf gen der dann wiederum vom Client beim Aufruf der Seite interpretiert wird Hierf r bietet sich die Methode RegisterStartupScript an 117 NET BlogBook Ausgabe 4 Page ClientScript RegisterStartupScript this GetType StartPopUp window open http www asp net true Eine genaue Beschreibung der Methode findet man in der MSDN 2 4 16 Read Only Datens tze im GridView die Zweite In diesem Eintrag beschrieb ich wie man einzelne Zeilen im GridView auf Read Only setzt so dass diese nicht mehr bearbeitet oder gel scht werden k nnen Anhand der Spalte locked wird entschieden ob die Command Buttons funktionsf hig sind Per E Ma
36. Enabled false mi Selectable false else foreach Menultem mi in MainMenu Items mi Enabled true mi Selectable true protected void Page Load object sender EventArgs e Hier wird nun im Page_PreRender berpr ft ob bereits eine Session gesetzt wurde Dies ist vor dem Einloggen nun auch nicht Fall wodurch bis auf den Home Eintrag alle weiteren deaktiviert werden 154 NET BlogBook Ausgabe 4 Nun kommt es zum Login Die Daten werden per Post an den Server ubertragen Hier wird nun folgende Reihenfolge ausgef hrt 1 Default aspx Page _Init 2 LoginControl ascx Page_Load 3 Default aspx Page PreRender 4 MenuControl ascx Page_PreRender Verfolgt man diese Reihenfolge im Sourcecode ist schon zu sehen wie und vor allem wann Session Informationen ausgelesen werden musssen um korrekt angewandt zu werden Daher verweise ich nochmals an den Artikel ASP NET Die PostBack Falle welcher den Lebenszyklus von Seiten genau auflistet Fazit Dieser Artikel sollte sein wie mit Session Informationen unter Verwendung von UserControls umgegangen und worauf geachtet werden soll Unter Berucksichtigung des Lebenszykluses der Seite bzw der gesamten Webanwendung als auch der verwendeten UserControls lassen sich dadurch entstehende Probleme schnell eingrenzen und l sen 2 4 60 ASP NET Die PostBack Falle Irgendwann tappt jeder in die PostBack Falle So ist es auch mir passiert und daher
37. Function lt T gt tint x T y Console WriteLine Function 1 stati void Punction lt gt T long y Console WriteLine Function 2 static void Main Functions intet Ss 228333 F ngtion lt byte gt 5 324 Function 5 3231 Console WriteLine 2 2 69 Variable Anzahl an Methoden Parametern Wer eine variable Anzahl an Parametern in einer Methode benotigt der hat vermutlich bereits das Schlusselwort params entdeckt Wer nicht dem sei es hiermit erklart Das Schlusselwort params ermoglicht es einer Methode eine beliebige Anzahl an Parametern zu bergeben Im Gegensatz zu einem Array k nnen die einzelnen Werte mit Hilfe eines Komas getrennt werden so wie es beispielsweise auch bei einem String Format funktioniert Im folgenden Beispiel wird eine generische Liste durch eine Methode AddMultipleStringsToList erweitert welche diese Funktionalit t bietet public class MultiplestringList List lt string gt public void AddMultipleStringsToList params string values foreach string s in values NET BlogBook Ausgabe 4 this Add s Zus tzlich zu den Methoden Add und AddRange Ist nun die neue Methode AddMultipleStringsToList verf gbar die folgenderma en verwendet werden Kann MultipleStringList mStringList new MultipleStringList MELting List AdamulrtiplesrringesToLiet testi testa tests Test foreach string s in mStringLlist Console WriteLi
38. GridView ID GridViewl runat server AutoGenerateColumns False DataKeyNames ID 146 NET BlogBook Ausgabe 4 DataSourceID SqlDataSourcel OnRowDataBound GridViewl RowDataBound gt alumns gt lt asp BoundField DataField ID HeaderText ID InsertVisible False ReadOnly True SortExpression ID gt lt asp BoundField DataField Name HeaderText Name SortExpression Name gt lt asp BoundField DataField Price HeaderText Price SortExpression Price gt lt Co olumna gt lt asp GridView gt Dem EventHandler selbst wird ein Objekt vom Typ GridViewRowEventArgs bergeben Dieses Objekt erm glicht den Zugriff auf die gebundene Zeile protected void GridViewl RowDataBound object sender GridViewRowEventArgs e if e Row RowType DataControlRowType DataRow DataRowView row DataRowView e Row Dataltenm if row Price DBNull Value if decimal row Price gt 200 e Row Cells 2 BackColor System Drawing Color Red Zun chst muss berpr ft werden um welchen Typ von gebundener Zeile es sich handelt Die Einf rbung darf nat rlich nur in Daten Zeilen vorgenommen werden Anschlie end wird das Dataltem welches die Daten der aktuellen Zeile repr sentiert in ein Objekt vom Typ DataRowView gecastet ber den Feldnamen Price erh lt man nun Zugriff auf die Daten der Spalte Price Mit Hilfe des Vergleichs DBNull Value muss nun noch berpr ft werden ob das Feld i
39. Herr zu werden Hier die einzelnen Attribute und welche Bedeutung ihnen zukommt NonSerialized Dieses Attribut gibt an dass die entsprechende Eigenschaft nicht serialisiert wird NET BlogBook Ausgabe 4 OptionalField Damit wird die entsprechende Eigenschaft als optional gekennzeichnet Sendet nun beispielsweise eine altere Anwendungsversion das Objekt serialisiert zu einer neueren Version wird das Fehlen der Eigenschaft einfach ignoriert OnDeserializing Dieses Attribut wird nicht bei Eigenschaften gesetzt sondern nur bei einer Methode und zwar bei ausschlie lich einer Methode pro Klasse Dies wird haupts chlich f r Versionierungszwecken getan Die Damit gekennzeichnete Methode hat nun die M glichkeit in den Serialisierungsprozess einzugreifen und die fehlenden Werte zu setzen Weitere Informationen und auch Beispiele zu diesen Attributen k nnen durch den MSDN Artikel Version Tolerant Serialization bezogen werden 2 2 Basis Framework 2 2 1 ICloneable Etwas unsauber nicht Das Interface ICloneable wird f r gew hnlich implementiert wenn das entsprechende Objekt geklont werden soll Nun ergibt sich aus meiner Sicht hier ein kleines Problem ICloneable stellt eine Methode Clone zur Verf gung Diese wird f r die Klon Implementierung verwendet Nun gibt es aber zwei M glichkeiten zu klonen Deep Copy Alle Objekte werden dupliziert Shallow Copy Nur Objekte oberster Ebene werden vervielf ltigt Alle
40. LMerge kann auch PDB Dateien Debug Informationen und Projektstatus zusammenf hren Hierbei ist zu beachten dass ILMerge f r NET 2 0 nur 2 0er PDB Dateien zusammenf hren kann Jedoch k nnen Assemblies fr herer Versionen zusammengef hrt werden Mit ILMerge f r das NET Framework 1 1 k nnen auch PDB Dateien der 1 1er Version zusammengef hrt werden Mono und Rotor Bis zum aktuellen Zeitpunkt unterst tzt ILMerge weder Rotor noch Mono GUI Fur ILMerge gibt es zur Erleichterung grafische Oberfl chen von diversen Anbietern Eine kostenlose Variante ist NuGenUnify Die aktuelle Version kann ber das Microsoft Download Center bezogen werden 5 16 Microsoft SQL Server Database Publishing Wizard 1 0 Durch den SQL Server Datenbankveroffentlichungs Assistent k nnen Datenbanken in T SQL Skripts oder direkt an Hostingdienstanbieter ver ffentlicht werden Der SQL Server Database Publishing Wizard erm glicht die Bereitstellung von SQL Server Datenbanken in einer gehosteten Umgebung an einen Server mit SQL Server 2000 oder 2005 Dabei wird eine einzelne SQL Skriptdatei generiert die zum Neuerstellen einer Datenbank sowohl Schema als auch Daten in einer NET BlogBook Ausgabe 4 freigegebenen gehosteten Umgebung verwendet werden kann bei der die einzige Konnektivitat mit einem Server durch einen webbasierten Steuerungsbereich mit einem Skriptausfuhrungsfenster besteht Der SQL Server Database Publishing Wizard kann Datenbanken a
41. Laden eines Providers ber DbProviderFactory geschehen Dadurch kann eine Exception vermieden und der Benutzer entsprechend benachrichtigt werden oder Eintrag in eine Logdatei und hnliches Ein Provider kann folgenderma en dynamisch geladen werden Nur der Vollst ndigkeit halber Wird normalerweise aus einer Konfiguration gelesen string strProviderInvariantName System Data SqlClient string ScCrEConmecripnstring Yaa Laden des Providers Erstellen der Datenbank Verbindung Zuweisung des notwendigen ConnectionStrings DbProviderFactory dbFactory DbProviderFactories GetFactory strProviderInvariantNanme DbConnection dbConnection dbFactory CreateConnection dbConnection ConnectionString strConnectionString Wie bereits in den Code Kommentaren angemerkt werden diese Einstellungen normalerweise aus einer Konfiguration geladen oder in einer anderen Form an die Anwendung bergeben Der Vorteil liegt darin dass die Anwendung damit mit einem beliebigen ADO NET Provider ausgef hrt werden kann 2 2 64 String in eine XmINode konvertieren NET BlogBook Ausgabe 4 Es kommt vor dass XML Daten in einem String vorhanden sind und man daraus eine XmlNode erstellen muss Dies ist ja an sich kein Problem da hierzu die InnerText Eigenschaft gesetzt werden kann Was aber wenn der String eine Node inklusive einiger ChildNodes enthalt Hier ein einfacher Weg die Konvertierung durchzufuhren XmlDocument doc
42. M glichkeit Commands in beispielsweise einer Queue abzulegen um hintereinander abgearbeitet zu werden NET BlogBook Ausgabe 4 Beispiel Implementierung Der Aufbau des Command Patterns wird zwar in manchen F llen recht aufw ndig und kompliziert dargestellt gestaltet sich in der Praxis jedoch als sehr einfach Es wird ein Interface Command erstellt welches die notwendige Methode Execute zur Verf gung stellt Jeder konkrete Command implementiert dieses Interface und die Methode Execute wird dabei mit der Logik des Commands bef llt In einigen F llen macht es auch durchaus Sinn einen abstrakten Command einzuf gen der bereits Basisfunktionalit ten zur Verf gung stellt public interface ICommand string Message get set void Execute Dieses Interface schreibt also die Methode Execute vor die von jedem Command implementiert werden muss Weiters wird eine Eigenschaft Message vorgeschrieben die eine entsprechende Nachricht speichern soll Konkreter Anwendungsfall w re eine Fehlermeldung wenn der Command auf einem entfernten Host ausgef hrt wird kann als eine Erg nzung zu einem State gute Dienste leisten In diesem Beispiel wird nun ein abstrakter Command erstellt der die Eigenschaft als Basisfunktionalit t zur Verf gung stellt public abstract class Command ICommand private string message null public string Message get return this message set this message value pub
43. Ordner mit dem Namen snv zur Verwaltung des aktuellen Zustands Unter bestimmten Umst nden ist es allerdings erforderlich diesen Ordner zu entfernen um z B den Code weiterzugeben Es gibt nun mehrere M glichkeiten Entweder es wird die Windows Suche benutzt alle Ordner per Hand entfernt oder die in TortouseSVN integrierte Export Funktion benutzt Noch einfacher ist es mit einem Eintrag in der Registry von Jon Galloway Dieser Eintrag f gt dem Kontext Menu des Explorers einen neuen Men punkt hinzun ber diesen Men punkt ist es nun m glich alle svn Verzeichnisse mit nur einem Klick zu l schen Folgende Eintr ge m ssen als reg File abgespeichert und durch Doppelklick in die Registry importiert werden 173 NET BlogBook Ausgabe 4 Windows Registry Editor Version 5 00 HKEY LOCAL MACHINE SOFTWARE Classes Folder shell DeleteSVN Delete SVN Folders HKEY LOCAL MACHINE SOFTWARE Classes Folder shell DeleteSVN command cmd exe c TITLE Removing SVN Folders in 31 amp amp COLOR 9A amp amp FOR r 31 233f IN 87n DO RD fe 7q IMST Y un Nutzer der TortoiseSVN Version f r Visual Studio 2003 m ssen den Namen des Verzeichnisses svn durch svn ersetzen 174 NET BlogBook Ausgabe 4 3 V suaL STUDIO 3 1 Auflistung Visual Studio Shortcuts Kai hat sich die Muhe gemacht die wichtigsten Visual Studio Shortcuts ein einem PDF zusammen zu fassen Diese Liste ist sicherlich nicht vollstandig
44. Rekursion l t sich das vermeiden Im nachfolgenden Beispiel wird eine vorhandene Rekursion mit Hilfe eines Stacks ersetzt Die Stack Variante ist recht einfach umgesetzt und zudem auch noch performanter als die rekursive Um ein bestimmtes Steuerelement auf einem Formular zu finden w rde uns folgender rekursiver Ansatz zum Ziel bringen private Control FindRecursively Control c string strControlName if c Name strControlName return c Toreach Control ci in Controls Control cTemp FindRecursively cf strControlName NET BlogBook Ausgabe 4 if cTemp null rerurm Clenp return null Recht schnell erkl rt Das jeweils bergebene Control wird auf den Namen hin berpr ft Entspricht dieser nicht dem gew nschten wird die Controls Auflistung durchlaufen und dieselbe Methode wieder aufgerufen Dies wird so lange gemacht bis entweder das gew nschte Steuerelement gefunden wurde oder alle durchlaufen wurden Das nachfolgende Beispiel zeigt wie dies nicht rekursiv mit Hilfe eines Stacks gel st werden kann private Control FindNotRecursively Control c string strControlName if c Name strControlName return c Stack stack new Stack Stack Fushio while stack Count gt 0 Control cTemp stack Pop if cTemp Name strControlName return cITemp foreach Control cf in cTemp Controls STtack PFush ici return null Auch diese Variante ist schnell erkl rt D
45. Seite dar und enth lt wie bereits oben erw hnt dein Men Control und ein Login Control die beide selbst erstellt wurden und daher auch ein bestimmtes notwendiges Verhalten an den Tag legen Sehen wir uns nun den Sourcecode der Default aspx genauer an private SessionData sessionData null protected void Page PreRender object sender EventArgs amp BesB1 nDbara Session session nro as SessionDataj if Session sessionInfo null _Sessionbata sese1onData session sessicnTnfe gt foreach Control c in ContentPlaceHolder Controls Lt amp 1D loginControl ContentPlaceHolder Controls Remove c break protected void Page lnitiobject sender EventArgs amp it se9p10nData mull Control loginControl LoadControl modules LoginControl ascx Llogincontrol ID0 loginControl this ContentPlaceHolder Controls Clear this ContentPlaceHolder Controls Add loginControl else this ContentPlaceHolder Controls Clear Control menuControl LoadControl modules MenuControl ascx menuControl ID menuControl MenuPlaceHolder Controls Clear MenuPlaceHolder Controls Add menuControl Protected void Page Tsadlobjeet Bender EventArgs e Wie zu sehen ist werden grunds tzlich zwei Events bedient Page Load wurde nur angef hrt um zu zeigen dass sich hierin keinerlei Sourcecode befindet e Page Init e Page PreRender
46. Setzen der Eigenschaft BorderStyle auf FixedSingle erh lt das Panel einen 2D Rahmen der fix auf Schwarz eingestellt ist In manchen F llen soll nun eine andere Rahmenfarbe her Dazu muss von Panel abgeleitet und der Handler OnPaint berschrieben werden Hier ein kleines Beispiel bei dem sowohl die Rahmenfarbe als auch die Rahmenst rke bequem ber Eigenschaften eingestellt werden kann Public partial class PanelEx Panel Dllimport user32 d11 private static extern IntPtr GetWindowDC IntPtr hwnd Dll Import user32 all private static extern int ReleaseDC IntPtr hwnd IntPtr hdc private Color bordercolor Color Elack private int borderwiatn 17 public int BorderWidth get return borderwidth set 1 borderWl ch value public Color BorderColor get return bordercolor set 1 borderColor values public PanelEx this InitializeComponent SetStyle ControlStyles DoubleBuffer true SetStyle ControlStyles AllPaintingInWmPaint false SetStyle ControlStyles ResizeRedraw true SetStyle NET BlogBook Ausgabe 4 ControlStyles UserPaint true SetStyle ControlStyles SupportsTransparentBackColor true protected override void OnPaint PaintEventArgs e base OnPaint e if this BorderStyle BorderStyle FixedSingle IntPtr hDC GetWindowDC this Handle Graphics g Graphics FromHdc hDC ControlPaint DrawBorder 9 new Rectangle 0 0 t
47. Type gt lt Type Name TranslatorException gt lt Method Sig instance void ctor string gt lt Method Sig instance void ctor string class Exception gt lt Type gt lt Namespace gt lt Namespace gt lt Namespace gt lt Namespace gt lt Assembly gt Aus diesen Informationen kann genau ausgelesen bzw abgefragt werden welche Berechtigungen mind gesetzt werden m ssen um alle Funktionen nutzen zu K nnen 2 2 40 Drucken unter C NET BlogBook Ausgabe 4 Obwohl es ansich relativ viele Ressourcen im Internet zum Thema Drucken unter C gibt wird immer wieder die Frage danach aufgeworfen Daher an dieser Stelle ein Codebeispiel PrintDocument printDoc new PrintDocument printbpoc PrintPage new PrintPagekventHandleriprintBoc PrintPage PrintDialog pd new PrintDialog pd Document printDoc if pd ShowDialog DialogResult OK Printhoe Printi Was genau passiert hier Zum Ersten wird ein Dokument angelegt Dieses stellt quasi die Fl che dar die ausgedruckt werden soll Zudem wird ein EventHandler auf das Event PrintPage gelegt um feststellen zu k nnen wann genau gedruckt wird Durch den PrintDialog kann ein Druck Dialog zur Auswahl des Druckers angezeigt werden Durch Aufruf der Methode Print des PrintDocuments wird der Druck gestartet wodurch das Event PrintPage ausgel st wird Darin muss nun der zu druckende Inhalt in das erhaltene Graphics Obje
48. Verschl sselung bzw Entschl sselung des ViewState zu generieren Der generierte Key kann dann einfach in die Web Config bernommen werden 143 NET BlogBook Ausgabe 4 Validation key length 64 Encryption key length 24 Type SHA1 Generate Paste the following text in your web config Abbildung 42 MachineKey Generator http www aspnetresources com tools keycreator aspx 2 4 52 ASP NET Page Life Cycle Diagramm Leon Andrianarivony hat sich die M he gemacht und ein Diagramm des ASP NET Page Lifce Cycle angefertig Das besondere an diesem Diagramm ist dass sowohl ASP NET 1 1 als auch ASP NET 2 0 abgedeckt wird Ideal als Poster an der Wand http pointerx net photos screenshots images 852 original aspx ASP NET Page LifeCycle ema a iala Abbildung 43 ASP NET LifeCycle 2 4 53 Webseite automatisch aufrufen Zugegeben der Titel klingt zun chst etwas komisch hat aber einen ganz einfachen Hintergrund In einigen F llen kann es durchaus hilfreich sein eine Webseite zu 144 NET BlogBook Ausgabe 4 einem bestimmten Zeitpunkt automatisch aufzurufen und sei es nur um zu testen ob das Web noch erreichbar ist Zun chst ben tigt man ein Programm welches eine Webseite aufrufen bzw einlesen kann Hierf r eignet sich hervorragend wget Durch die umfangreichen Konfigurationsm glichkeiten kann man viele Gegebenheiten abdecken Unter Umst nden ist es aber besser ein eigenes Pr
49. Wie der Name schon sagt wird dieser Event direkt nachdem ein Datensatz an das GridView gebunden wird aufgerufen Aufgabe dieser Methode ist es nun zu berpr fen ob der Datensatz gesperrt ist und ggf die Command Buttons zum Editieren oder L schen zu deaktivieren protected void GridViewl RowDataBound object sender GridViewRowEventArgs e if e Row RowType DataControlRowType DataRow CheckBox chk CheckBox e Row Cells 2 FindControl CheckBox1 if chk Checked e Row Cells 3 Enabled false Zunachst wird uberpruft ob es sich bei der aktuellen Zeile um eine Datensatz Zeile handelt Diese ist n tig da beim Hinzuf gen von berschriften und Fu zeilen ebenfalls dieser Event aufgerufen wird Anschlie end sucht die Methode FindControl die CheckBox anhand der definierten ID Ist diese nun angehakt wird die dritte Zelle der aktuellen Zeile des GridView deaktiviert Das Ergebnis sind gesperrte Command Buttons im GridView NET BlogBook Ausgabe 4 r ah untted Page Name City locked Ka G ttingen Edit Delete Tim Karlsruhe Edit Delete Lars Braunschweig Edit Delete Karim Braunschweig Edit Delete Nils Kassel Edit Delete Abbildung 27 Readonly Datensatze im GridView 2 Das Beispielprojekt kann hier heruntergeladen werden 2 4 18 Dynamischer Meta Refresh in MasterPage Heute wurde in einem Forum die Frage gestellt wie man eine HIML Seite bzw Web Form nach einer fest definierten Zeit aktu
50. anderen Objekte stellen Verweise auf die tats chlichen Objekte dar Das eigentliche Problem dieser Schnittstelle besteht nun in folgender MSDN Aussage Clone can be implemented either as a deep copy or a shallow copy Dadurch ist nicht klar definiert wie die Clone Methode nun zu implementieren ist Bei der Entwicklung eines Frameworks wirft dies das Problem auf dass der Verwender dieses Frameworks abgesehen von der m glicherweise recht d rftigen Dokumentation nicht wei ob sein dupliziertes Objekt nun eine vollst ndige Kopie darstellt oder eben nicht Aus meiner Sicht empfehle ich daher ICloneable nicht zu verwenden und stattdessen eine eigene Implementierung vorzunehmen die hier eindeutiger ist Anbieten w rde sich die Erstellung zweier Interfaces nach folgendem Muster public interface IShallowCloneable lt T gt NET BlogBook Ausgabe 4 T ShallowClone Durch die Implementierung des Interfaces TShallowCloneable geht nun eindeutig hervor dass dabei ein Shallow Copy durchzuf hren ist public interface IDeepCloneable lt T gt T DeepClone Ebenso verh lt es sich beim Interface IDeepCloneable Zu guter Letzt noch ein Hinweis auf Object MemberwiseClone MemberwiseClone erstellt eine flache Kopie Shallow Copy des aktuellen Objektes und k nnte f r diesen Zweck benutzt werden Auch hier ein kurzer Auszug aus dem MSDN MemberwiseClone kann nicht berschrieben und nur ber diese oder eine
51. chlich speichern m chte NET BlogBook Ausgabe 4 Nun ist es ziemlich od sich alle alten Werte zu merken und mit denen vor der Speicherung zu vergleichen ob sich hier Unterschiede finden Stattdessen bietet sich die Implementierung des Interfaces INotifyPropertyChanged an Dadurch erh lt das eigene Objekt ein Event PropertyChanged welches ausgel st wird wenn eine der Eigenschaften ver ndert wurde Ein Beispiel aus der Praxis kann dann so aussehen public class ProgramProperties BasePropertyClass INotifyPropertyChanged region Members private bool cneckUpdatestartup false Private bool _recelveConiiguracionsrromseerver Tralee private String Sserveryr null endregion region Properties public bool CheckUpdateStartup ger return this checkUpdatestartup Ber LE this cheekipdatestartup I value NotifyPropertyChanged CheckUpdateStartup this checkupdatestartup value public bool ReceiveConfigurationsFromServer get return this receiveContigurationsrromserver Ber LE Chis Teseiversnz gurationstfr onserver i value NotifyPropertyChanged ReceiveConfigurationsFromServer this receiveContiguraticnsrromserver value public string ServerUri ger return this servervri set Lt this Sserverlri I value NotifyPropertyChanged ServerUri thie Serveriri value endregion region INotifyPropertyChanged Members public
52. com germany MSDN webcasts library aspx id 118767541 http msdn2 microsoft com de de library wcyt4fxb VS 80 aspx http www 15seconds com issue 040105 htm a 2 4 9 Login aspx Cannot convert type Grade wieder druber gestolpert Benennt man eine Datei mit dem Namen Login aspx wird dazu in der Code Beside Datei die Klasse Login angelegt Was im Development Server von Visual Studio noch funktioniert wird im IIS mit folgender Fehlermeldung quittiert Compiler Error Message Cs0030 Cannot convert type ASP login aspx to System Web UlL WebControls Login Source Error Line dis pupise 2001 aspx Line 113 string dependencies Line 114 Login this AppRelativeVirtualPath login aspx Line 113 if global 28P login aspx initialized faise q Line 116 dependencies new string 1 Anscheinend besteht hier ein Namenskonflikt zwischen der Klasse Login im Namespace System Web UI WebControls und der Klasse Login der eigentlichen Page Um dieses Problem zu l sen reicht es einfach die Klasse in der Code Beside Datei umzubenennen Im einfachsten Fall erganzt man den Namen um einen Unterstrich public partial class Login In der aspx Datei muss der Name ebenfalls angepasst werden lt S Page Language C AutoEventWireup true CodeFile Login aspx cs Inherits Login o gt 2 4 10 Von welcher Methode aufgerufen F r eine Logging Routine welche bestimmte Ereignisse in einer Datenbank speiche
53. delegate decimal DiscountCalculator decimal price Dieser wird im Standardfall auch verwendet um eine Methode aufzurufen die f r die Rabattberechnung zust ndig ist Dissountlalenlator default calc new DiscountCalculator CalculateDiscount Die aufgerufene Methode sieht dann so aus DiscountCalculator default calc new DiscountCalculatprivate decimal CalculateDiscount decimal price return price new decimal 0 05 tor CalculateDiscount Nun kann es jedoch vorkommen dass eine spezielle Berechnung durchgef hrt werden muss diese wird nur in einem ganz bestimmten Fall angewandt und bedarf NET BlogBook Ausgabe 4 daher keiner eigenen Methoden Implementierung in diesem Beispiel vielleicht weniger sinnvoll aber generell treten bei der Verwendung von Delegates immer wieder F lle auf in denen sich eine eigene Methode nicht rentiert Hier kommen nun anonyme Delegates ins Spiel Die aufgerufene Methode ist hierbei ansich nicht vorhanden daher anonym und wird erst bei der Erstellung des Delegate definiert Wie hier DiscounctCalculator specialsustomer calc delegate decimal price return price new decimal 0 09 F Damit wird im Grunde erreicht dass die eigentliche Berechnung durch eine neue ersetzt wird Eine entsprechende Methode muss hierzu nicht vorhanden sein Einsatzgebiete hierf r finden sich immer wieder daher grunds tzlich nicht schlecht wenn man sie kennt und auch anwenden kann I
54. dieser kurze Eintrag zu diesem Thema Der Beginn macht eine kurze Einf hrung Was ist ein PostBack Unter einem PostBack versteht man das senden einer Seite zum Server unter Verwendung des HTTP Vers Post Die Eingaben der gesendeten Seite werden vom Server verarbeitet und eine neue Seite generiert Die gesamte Seite wird neu geladen Konkretes Problem Beim Laden einer Seite vor allem wenn Werte zugewiesen werden sollte daher abgefragt werden ob es sich tats chlich um ein PostBack handelt Hier ein konkreter Fall protected void Page Load eb ect sender EventArgs amp FirstnameTextBox Text Norbert LastnameTextBox Text Eder In diesem Fall wird ein PostBack nicht abgefragt Nun werden beim Laden der Seite die vorhandenen Textfelder mit Werten bef llt Werden diese ver ndert und wieder an den Server bertragen werden die nderungen beim neu Erstellen der Seite wieder berschrieben Die ge nderten Werte scheinen also am Client nicht mehr auf NET BlogBook Ausgabe 4 Grund hierfur ist dass die Daten in der Methode LoadPostData siehe Lebenszyklen etwas weiter unten geladen und im anschlie enden Load Event berschrieben werden Anders sieht dies aus wenn die Wertezuweisung durch die Abfrage bezgl eines PostBacks gesichert wird protected void Page Load ob ect sender EventArgs 8 if this IsPostBack FirstnameTextBox Text Norbert LastnameTextBox Text Eder In diesem Fall
55. e Data In diesen Fallen werden die Informationen immer nur als Debug Informationen geschrieben Sie konnen aber naturlich auch anderweitig weiterverwendet werden Hier noch ein kleiner Hinweis Dadurch wird alles abgefasst was auf die Standard Ausgabe geschrieben wird Liegt also beispielsweise eine Windows Forms Anwendung vor die zwecks Debugging Informationen siehe Visual Studio viele Informationen via Console WriteLine schreibt und das damit verteilt wird k nnen diese Informationen dadurch ebenfalls ausgelesen werden Das sollte man sich in manchen F llen schon ganz gut berlegen siehe Debug WriteLine 2 2 61 Einstellungen einfach speichern und laden Wer beispielsweise viele unterschiedliche Konfigurationen speichern muss oder auch andere Daten dem wird es nicht allzu einfach gemacht Zum einen bietet sich eine Datenbank an zusammen mit einem O R Mapper Wer keine Datenbank verwenden m chte aus unterschiedlichsten Gr nden der muss sich anders behelfen Serialisierung ist eine M glichkeit Da ich nun genau diesen Fall hatte schrieb ich mir einen kleinen Manager der diese Aufgabe f r mich bernimmt Implementiert ist die Klasse als Singleton und kann mit allen serialisierbaren Typen umgehen lt summary gt Read and write Configuration files Uses the binary formatter lt summary gt public class ConfigurationManager region Private Members Private static object lockObj ect new obj
56. ebenfalls wieder 200 000 Aufrufe Uber 1 800 Millisekunden im Vergleich zu knapp mehr als 15 Millisekunden sprechen hierbei schon B nde Man bedenke dass oft aufw ndigere Probleme mittels Reflection gel st werden daher sollte ein Caching durchaus berlegt werden An sich sehr einfach jedoch eine gro e Wirkung 2 2 22 MD5 Wert eines Strings Immer wieder taucht die Frage auf obwohl an vielen Stellen im Internet auffindbar wie denn ein String in einen MD5 Hash umgewandelt werden kann Hier ein kleines Code Snippet dazu public static string GetOneWayHash string val byte data System Text ASCIIEncoding ASCII GetBytes val MD5 md5 new MD5CryptoServiceProvider byte res md5 ComputeHash data return System Convert ToBase64String res 0 res Length Ich m chte hierzu jedoch einen sehr wichtigen Punkt loswerden der oftmals falsch interpretiert wird Ein MD5 ist ein Hashverfahren und keine Verschl sselung Dies bedeutet dass das Zur ckgewinnen des urspr nglichen Wertes im Normalfall nicht m glich ist Warum nur im Normalfall Beispielsweise sollten Passw rter nie in ihrem originalen Wert abgespeichert werden Hierf r bieten sich Hashverfahren ab die einen Hashvalue errechnen und diesen anstatt des urspr nglichen Passwortes ablegen Aus dem resultierenden Wert soll es nicht m glich sein das eigentliche Passwort zu errechnen Im Gegensatz zur Verschl sselung Hier ist es von absoluter Wichtigkeit die
57. ein Name fur die Schaltflache vergeben werden kann Hier ist ein Name zu w hlen in dem ein Buchstabe mit einem kaufm nnischen Und amp hervorzuheben ist Dieser wird dann als Shortcut verwendet Hier sollte ein Buchstabe gew hlt werden f r den noch kein Shortcut vergeben ist Ich denke ein m w rde sich hier anbieten Ab sofort kann man einzelne Mailfolder ausw hlen ALT M dr cken und schon werden die darin enthaltenen Mailltems als gelesen markiert NET BlogBook Ausgabe 4 1 DATENBANK NIANAGEMENT SYSTEME 7 1 SQL Server 2000 Replikation und Error 18483 Die Replikation l sst sich nicht einrichten da der Benutzer distributor_admin nicht als Remotebenutzername eingetragen ist Und wo genau liegt nun das Problem Die Antwort ist eigentlich ganz einfach Das Problem liegt daran dass der Servername des SQL Servers nicht mit der eingetragenen ServerName Property berein stimmt Vermutlich durch eine Umbenennung etc Diese Einstellungen kann man mit folgender Abfrage herausfinden SELECT SERVERNAME SERVERPROPERTY ServerName Die beiden Felder des Resultates mussen hier gleich sein Wenn nicht dann ist folgendes Script auszufuhren USE master GO DECLARE serverproperty servername varchar 100 servername varchar 100 SELECT serverproperty servername CONVERT varchar 100 SERVERPROPERTY ServerName SELECT servername CONVERT varchar 100 SERVERNAME EXEC sp dropserver serve
58. erw hnt werden dass es f r gro e Datenmengen durchaus bessere M glichkeiten gibt eine derartige Funktionalit t abzubilden F r kleinere Anwendungsf lle sollte diese Variante aber durchaus ausreichen NET BlogBook Ausgabe 4 2 2 90 C 3 0 Automatische Eigenschaften Ein haufiges Konstrukt um unter C 2 0 Eigenschaften zu erstellen ist dieses hier private string myProperty public string MyProperty get return myProperty set myProperty value In C 3 0 kann eine solche Eigenschaft mit viel weniger geschriebenem Code erzeugt werden genauer gesagt mit einer einzigen Zeile Code public string MyProperty get set Das zugeh rige Feld und der Getter bzw Setter werden automatisch durch den Compiler erzeugt Dass dies tats chlich so ist kann mit Hilfe des NET Refletor berpr ft werden Der generierte Code ist jeweils mit dem Attribut CompilerGenerated gekennzeichnet Nat rlich k nnen automatische Eigenschaften immer nur mit Getter und Setter erzeugt werden Damit der Setter nur innerhalb der Klasse benutzt werden kann muss dieser einfach als private deklariert werden public string MyProperty get private set Der generierte Code zeigt nun jeweils einen privaten Setter und ffentlichen Getter NET BlogBook Ausgabe 4 2 2 91 Ausgabe von Datum und Uhrzeit formatieren Um das aktuelle Datum und die aktuelle Uhrzeit ausgeben zu lassen ist nichts weiter notig als e
59. event PropertyChangedEventHandler PropertyChanged NET BlogBook Ausgabe 4 endregion region Private Members private void NotifyPropertyChanged String info if PropertyChanged null PropertyChanged this new PropertyChangedEventArgs info endregion 2 2 4 lsolierter Speicher f r isolierte Daten Durch den Namespace System IO IsolatedStorage Ist es m glich Daten in einem isolierten Speicher abzulegen Der Vorteil liegt hier klar auf der Hand Auf diese Art und Weise k nnen Daten gelesen und geschrieben werden auf die wenig vertrauensw rdiger Code keinen Zugriff erhalten soll Somit werden vertrauliche Daten nicht zug nglich gemacht und werden daher zus tzlich abgesichert Ein weiterer Vorteil Diese Variante kann zusammen mit servergest tzten Benutzerprofilen verwendet werden So ist der isolierte Speicher des Benutzers dort verf gbar wo er sich an der Dom ne anmeldet Wie kann nun in einen isolierten Speicher geschrieben werden TsolatedStorageFile isolatedFile TsolatedStorageFile GetStore IsolatedStorageScope User IsolatedStorageScope Assembly null null if isolatedFile null StreamWriter newFile new StreamWriter new IsolatedStorageFileStream TsolatedStorageTest txt FileMode OpenOrCreate if newFile null newFile WriteLine This is an IsolatedStorage Test newFile Close u Vorerst wird der isolierte Speicher basierend auf eine Scope Angabe gel
60. folgende L sung zu Gem te f hren NET BlogBook Ausgabe 4 http weWeblogs asp net bleroy archive 2006 01 24 436350 aspx o 2 4 34 Debug and Release Builds in ASP NET 2 0 Wer sind nach ersten Experimenten mit ASP NET 2 0 gefragt hat wohin das bin Verzeichnis und die Project dll verschwunden sind sollte einen Blick auf den Artikel Debug and Release Builds in ASP NET 2 0 von K Scott Allen unter folgender Adresse werfen http odetocode com Weblogs scott archive 2005 11 15 2464 aspx D a 2 4 35 Maximum request length exceeded Die Meldung wird ausgegeben sobald man versucht eine Datei die gr er als 4096 KB ist per HtmlInputFile Control hoch zu laden Um dieses Limit zu erh hen berschreibt bzw erg nzt man folgenden Wert in der Web Config oder Maschine Config lt httpRuntime maxRequestLength 8192 gt maxRequestLength steht nat rlich f r den Maximalwert in KB Die Knowledge Base Artikel findet man dazu unter http support microsoft com default aspx scid kb EN US 295626 2 4 36 Session lost nachdem ein Verzeichnis umbenannt wurde Anscheinend verliert ASP NET nachdem ein Verzeichnis umbenannt wurde die komplette Session Diesen Fehler kann ich jederzeit reproduzieren und wurde mir auch von Olaf L der in microsoft public de german entwickler dotnet asp best tigt Dieser Fehler tritt auch auf wenn leere Verzeichnisse umbenannt werden Folgender Workaround 1 Neues Verzeichnis anlegen 2 D
61. freundliche Meldung anzuzeigen zus tzlich aber den vorhandenen Zustand festzuhalten und an den Entwickler zu verschicken oder in einer Datei zu speichern In diesem Fall werden die Informationen per E Mail verschickt Beginnt man mit der Programmierung eines HTTP Modules muss zun chst eine Klasse erstellt werden die das Interface IHttpModule implementiert public class ErrorHandler IHttpModule region IHttpModule Members public void Dispose throw new Exception The method or operation is not implemented public void Init HttpApplication context throw new Exception The method or operation is not implemented endregion 141 NET BlogBook Ausgabe 4 Visual Studio erstellt auf Wunsch die Methoden Dispose und Init die durch das Interface vorgegeben sind In der Methode OnInit muss nun ein Event Handler f r den Error Event registriert werden public void Init Http pplication context context Error new System EventHandler Error private void Error object o EventArgs e In dieser Methode kann nun die weitere Verarbeitung vorgenommen werden Zun chst ist es n tig den aktuellen Request und den ausgel sten Fehler einzulesen Hierf r liefert das Property Current der HttpContext Klasse den aktuellen HttpContext Zur ck welcher dann die n tigen Objektinstanzen liefert HEEHLONLeHT COntekxt HEIBE STEEL Correit ACT PResponse response context kespons
62. ge ffnet in dem einige Settings vorgenommen werden k nnen NET BlogBook Ausgabe 4 When Breakpoint Is Hit Specify what to do when the breakpoint is hit vi Print a message You can include the value of a variable or other expression in the message by placing it in curly braces such as The value of x is x To insert a curly brace use W To insert a backslash use W The following special keywords will be replaced with their current values SADDRESS Current Instruction CALLER Previous Function Name SCALLSTACK Call Stack SFUNCTION Current Function Name PID Process Id PNAME Process Name TID Thread Id TNAME Thread Name Continue execution So kann bei jedem Hit des Breakpoints eine Message ins Consolen Fenster geschrieben ein Makro ausgefuhrt oder unterbrochen werden Es lohnt sich auf jeden Fall auch die anderen Punkte naher anzusehen da bestimmte Features recht oft sinnvoll eingesetzt werden k nnen Damit l t sich die Produktivit t steigern und der Arger des Debuggens senken Weitere Informationen zum Thema Debuggen Visual Studio 2005 Default Browser setzen Webprojekte mittels Firefox debuggen Unable to debug The binding handle is invalid 3 22 Transparentes IntelliSense in Visual Studio 2008 W hrend der Arbeit mit Visual Studio 2008 fallen immer wieder kleine aber dennoch sehr n tzliche Hilfen auf So auch die M glichkeit das Intellisense transparent zu schal
63. gespeichert sind Beim ContentPlaceHolder handelt es sich um ein ContentHolder Control Nat rlich kann dies auch entsprechend dynamischer gestaltet werden da sich das zu ladende Control eventuell aus dem aufgerufenen Men eintrag oder anderen Informationen definieren l sst 2 4 62 Verzeichnisse per ASP NET FormsAuthentication in 60 Sekunden schutzen Inspiriert durch einen Thread auf www aspnetzone de soll dieser Beitrag zeigen wie schnell sich eine Web Applikation oder nur ein einfaches Verzeichnis per FormsAuthentication sch tzen l sst Zun chst ist es n tig die Web Config anzupassen In diesem Beispiel soll das Verzeichnis Secure gesch tzt werden Weiter wird eingestellt das Session Cookies verwendet werden d rfen und diese noch f r 120 Minuten nach der letzten Aktion g ltig sein sollen lt authentication mode Forms gt lt forms cookieless UseCookies defaultUrl Secure SecureSite aspx loginUrl default aspx timeout 120 gt lt forms gt lt authentication gt Nun mussen fur das Verzeichnis die Berechtigungen gesetzt werden Dies erfolgt uber den Location Node unter Angabe des Verzeichnisnamens Mit Hilfe der Angabe deny wird angegeben das nur bekannte also autorisierten User Zugriff erhalten sollen lt location path Secure gt lt system web gt 157 NET BlogBook Ausgabe 4 lt authorization gt lt deny users gt lt authorization gt lt system web gt lt 7 locatrion gt
64. gt lt ItemTemplate gt lt asp LinkButton ID LinkButtonl runat server CausesValidation False CommandName Delete Text Delete OnClientClick return confirm Wirklich l sehen s gt lt asp LinkButton gt lt ItemTemplate gt lt asp TemplateField gt Wird nun der Link Button angeklickt ffnet sich ein Fenster und fordert den User nochmals zur Best tigung der Anweisung auf Windows Internet Explorer mis Werke schen Der R ckgabewert des Dialogs wird per return weitergereicht und beendet ggf die weitere Verarbeitung Das Beispielprojekt kann hier runtergeladen werden 2 4 7 Login Control ohne ReturnUrl Verwendet man Forms Authentication in Verbindung mit den Login Controls von ASP NET gibt es ein kleines Feature dessen Funktion unter bestimmten Umst nden unterbunden werden soll Fordert der User eine Seite an ohne sich authentifiziert zu haben wird nach erfolgreichem Login auf diese Seite weitergeleitet Die angeforderte Seite wird dabei per GET mit dem Key ReturnUr1 bergeben NET BlogBook Ausgabe 4 Beispiel http localhost Login default aspx ReturnUrl 2fLogin 2fMember 2fMember aspx Allerdings gibt es viele Anwendungszwecke bei denen dieses Feature eher hinderlich oder nicht erw nscht ist Um diese Funktion zu deaktivieren sind ein paar kleine Schritte n tig Nach dem erfolgreichen Login wird von dem Login Control zun chst ein Event LoggedIn aufgerufen Ea It
65. handelt Wird dieser Parameter nicht angegeben entspricht der Ausgabetyp dem Typ der ersten Assembly Primary Assembly die der Ausgabe hinzugef gt wird out filename Dadurch wird der Name des Ziels angegeben v1 oder v1 1 oder v2 Diese Option ist nur bei ILMerge f r das NET Framework 2 0 verf gbar Damit kann eine Assembly gelinkt werden die auch unter einer anderen Framework Version lauff hig ist log filename Fur eine automatisierte Verwendung bietet sich der Parameter log an Durch ihn kann die Ausgabe des Vorgangs in eine anzugebende Logdatei geschrieben werden Etwaige Fehler k nnen dadurch zu einem sp teren Zeitpunkt gefunden und analysiert werden Nat rlich k nnen noch weitere Parameter angegeben werden Diese k nnen der Dokumentation zu ILMerge entnommen werden ist im Download enthalten Vergleich mittels Reflector for NET Sehen wir uns die Beispielanwendung in Lutz Roeder s Reflector for NET an sind die beiden Assemblies extra ausgewiesen NET BlogBook Ausgabe 4 File View Tools Help Oole r Ala 5 o verceoeno WP ILMergeDemo exe a References ILMergeDemo E ae FormMain E se Program ILMergeDemo Properties E Resources 43 ILMergeDemo Core MT ILMergeDemo Core dll a References fH 1 ILMergeDemo Core ae Calculator i Assembly ILMergeDemo Version 1 0 0 0 Location C Users n eder Documents Wisual Studio 2005 Projects Demos ILMergeDemo
66. hier runtergeladen werden 2 4 56 HyperLink im GridView Eine h ufige Anforderung an eine Anwendung istdie Auflistung von Datenbankinhalten deren Details auf einer extra Seite dargestellt werden sollen 149 NET BlogBook Ausgabe 4 uw Zu Untitled Page Name Price Knife 10 00 Spoon 11 00 Abbildung 47 Hyperlinks in GridView 1 Um diese Anforderungen zu erfullen sind nur ein paar kleine Schritte notwendig die per Assistenten erledigt werden k nnen Selbst programmieren muss man nicht Zun chst wird eine Datenbank und eine darin vorhandene Tabelle ben tigt In diesem Beispiel ist die Tabelle bewusst sehr einfach gehalten Products Abbildung 48 Hyperlinks in GridView 2 Nachdem eine Verbindung zur Datenbank per SylDataSource Control hergestellt wurde k nnen die angezeigten Felder des GridView uber das Kontextmen und den Punkt Edit Columns konfiguriert werden In diesem Dialog muss ein HyperLinkField Control hinzugef gt werden ber die Eigenschaften DataNavigateUrlFields und DataNavigateUrlFormatString kann nun eingestellt werden welches Datenbankfeld f r den Link verwendet werden soll und wie der Link selbst auszusehen hat In diesem Fall lautet der Wert f r das Feld DataNavigateUrlField Name wahrend das Feld DataNavigateUrlFormatString mit dem Wert detail aspx id 0 belegt wird Der Platzhalter 0 wird zur Laufzeit mit dem entsprechenden Wert aus der Datenbank ersetzt rl gar Ted M east
67. ist NET BlogBook Ausgabe 4 Mehr Infos unter http www codeproject com cs files SourceCodeLineCounter asp 5 21 NET Reflector Add Ins Auf www codeplex com finden sich zahlreiche Add Ins fur den NET Reflector von Lutz Roeder NET Reflector ist ein Class Browser Explorer Analayzer und Documentation Viewer f r NET Au erdem erlaubt er das Durchsuchen und Dekompilieren von NET Assemblies http www codeplex com reflectoraddins Der NET Reflector geh rt ebenfalls zu den Tools die im NET Casts Podcast vom 04 02 2007 mit dem Thema NET Developement Tools vorgestellt wurden 9 22 UML Modellierung mit Visual Studio Wer auf der Suche nach einem UML Modelling Tool f r Visual Studio ist dem sei eine weitere Variante durch tangible engineering geboten Zus tzlich zum kostenpflichtigen Tool tangible architect 4 0 gibt es auch eine kostenlose Variante die folgende Diagramme unterst tzt Case Diagrams Component Diagrams State Charts Class Diagrams Activity Diagrams Persistent Object Models Hier ein Screenshot hee Le PETE te mu ar ein Abbildung 84 tangible engineering UML Modellierungstool 249 NET BlogBook Ausgabe 4 Die erstellten Diagramme und Modelle sind mit der kostenpflichtigen Variante kompatibel 5 23 Tool XmIExplorer XmlExplorer app config GE us File Edit Format View Tools eS W al XPath 3ettings XmlExplorer Properties Settings E Launch
68. item null item Attributes Add title toolTip Die Methode sucht anhand eines Values den ensprechenden Eintrag und setzt den Title Das komplette Beispielprojekt gibt es hier 4 4 Deployment 4 4 1 Deploying unter NET 3 Alles zum Thema Deployment unter NET 3 findet sich wohl unter 1 Wer also schon fr h informiert sein will der sollte sich diesen Link genauer ansehen 1 Deploying Microsoft NET Framework Version 3 4 4 2 NET ClickOnce via Firefox NET ClickOnce ist mit Firefox nicht durchf hrbar und blieb daher den Internet Explorer Benutzern vorenthalten Bei den Firefox Add Ons befindet sich allerdings eines namens FFClickOnce 1 welches diese Funktionalit t hinzuf gt 1 5 2 0 0 Wer sich uber das Thema ClickOnce informieren mochte der sei auf den Artikel ClickOnce des MSDN s verwiesen NET BlogBook Ausgabe 4 1 FFClickOnce Download 4 5 Design Patterns 4 5 1 Einfuhrung Bevor unterschiedlichste Design Patterns erklart werden muss definiert werden worum es sich bei Design Patterns handelt Hier eine kurze Definition Jedes Muster beschreibt in unserer Umwelt ein bestandig wiederkehrendes Problem und erl utert den Kern der L sung f r dieses Problem so dass diese L sung beliebig oft angewendet werden kann ohne sie jemals ein zweites Mal gleich auszuf hren A Pattern Language von Christopher Alexander Oxford University Press 1977 Was genau bedeutet dies Jede
69. k nnen daraus sicherlich Vorteile generieren Dennoch ist der Faktor Mangelware an dieser Stelle Zeit Zeit ist eine gro e H rde die es zu berwinden gibt Neue Technologien stellen ein gro e Herausforderung an das gesamte Unternehmen vor allem an das Entwicklerteam welches unter Zeitdruck steht und dennoch Erfolge bieten muss Umstiegskosten Viele Unternehmen setzen auch heute noch Visual Studio 2003 ein Dabei ist Visual Studio 2005 fast ein Jahr alt und die 2008er wartet bereits darauf fertig zu werden um auf den Markt geworfen zu werden Die Produktzyklen werden immer geringer und immer weniger machen den Schritt tats chlich mit Aus Kostengr nden denn Visual Studio ist nicht billig Und WPF ist nun in der 2003er nicht verf gbar vorhandene Projekte wollen nicht umgestellt werden auf zwei Schienen entwickeln ist auch nicht unbedingt das Wahre usw Die berwindung Schlie lich muss man sich berwinden um tats chlich ein Projekt auf Basis WPF durchzuziehen Klar wundersch n man kann klar zwischen Designer und Entwickler trennen Oft kann diese Trennung jedoch nicht vollzogen werden aus Mangel an Designern Allrounder sind also gefragt und diese m ssen oft erst NET BlogBook Ausgabe 4 dazu bewogen werden Sind Designer vorhanden mussen diese erst Grundlagen der WPF erlenen denn ganz ohne geht es dann auch nicht Wahrscheinlich lie e sich diese Liste noch fortf hren Tatsache ist dass es viele Grunde gibt warum
70. lt Date gt lt ltem gt lt Data gt Mit Hilfe des XmIDataSourceControls werden die Daten an das GridView gebunden lt asp GridView ID grid runat server DataSourceID XmlDataSourcel AutoGenerateColumns False gt lt Columns gt lt asp BoundField DataField Number HeaderText Number SortExpression Number HtmlEncode false gt lt asp BoundField DataField Name HeaderText Name SortExpression Name HtmlEncode false gt lt asp BoundField DataField Price HeaderText Price SortExpression Price HtmlEncode false DataFormatString 0 C2 gt lt asp BoundField DataField Date HeaderText Date SortExpression Date HtmlEncode false DataFormatString 0 dd MM yyyy gt lt Columns gt lt asp GridView gt lt asp XmlDataSource ID XmlDataSourcel runat server DataFile App Data Data xml TransformFile App Data Data xsl EnableCaching False gt lt asp XmlDataSource gt Wie man sehen kann wird bei den Feldern Price und Date ein DataFormatString angewendet Au erdem wird das Attribut HtmlEncode auf false gesetzt um den bekannten Bug des GridView zu umgehen Allerdings zeigt der DataFormatString dennoch keine Wirkung so dass die Ausgabe weiterhin unformatiert im Browser erscheint 0001 Test 1 20 25 12 11 1999 1 75 12 11 1999 10 5 12 11 1999 12 11 1999 12 11 1999 Abbildung 30 GridView und XmIDataSource Ein m glicher Workaround f r diese Gegebenheit w re die Verwendung des
71. m ssen die zu testenden Methoden mit dem Attribut Test versehen werden Mit einem Rechtsklick auf die entsprechende Datei kann nun mittels Run Test s der Test gestartet werden Wird dieser Befehl auf das Projekt angewandt werden alle darin enthaltenen Tests gestartet Nach dem Durchlauf der Tests erscheint im Ausgabe Fenster die Angabe welche Tests durchgelaufen also erfolgreich waren und welche nicht Wann ein Test als erfolgreich und wann als nicht erfolgreich gilt muss vom Entwickler selbst angegeben werden Im Falle einer Exception darf der Test nat rlich nicht als erfolgreich angef hrt sein Wurden alle Punkte durchlaufen und stimmt das Ergebnis kann der Test als erfolgreich markiert werden Daf r zust ndig ist die Klasse Assert Diese hat einige Methoden die f r diese Aufgabe sehr hilfreich sind Assert Fail Hier ist ein String zu bergeben der angibt um welchen Fehler es sich handelt Dies kann die Message Eigenschaft einer Exception sein oder auch ein selbst definierter String um mitzuteilen wo bei was ein Fehler aufgetreten ist Assert IsTrue Hier werden normalerweise Vergleiche angegeben Beispielsweise das Ergebnis der Methode und das Ergebnis welches die Methode liefern sollte Sind beide Ergebnisse ident ist der Test durchgelaufen andernfalls nicht Assert IsFalse Dies funktioniert wie Assert IsTrue nur in die entgegengesetzte Richtung Konklusio Dieses kleine Tutorial lieferte einen kurzen E
72. mit der Registry Die Registry wird noch immer h ufig verwendet um bestimmte Daten zu hinterlegen NET bietet hierf r die Klasse RegistryKey Hier ein Beispielcode wie Daten in die Registry geschrieben werden k nnen RegistryKey rk Registry CurrentUser RegistryKey rkSoftware rk OpenSubKey Software true if rkSoftware null RegistryKey rkCompany rkSoftware OpenSubKey Norbert Eder true if rkCompany null rkCompany rkSoftware CreateSubKey Norbert Eder RegistryKey rkInstaller rkCompany OpenSubKey MySoftware true if rkInstaller null rkInstaller rkCompany CreateSubKey MySoftware rkInstaller SetValue valuel testl rkInstaller SetValue value2 test2 rkInstaller Close rkCompany Close rkSoftware Close rk Close Nat rlich m ssen die Werte auch wieder ausgelesen werden Dies passiert auf folgende Art und Weise RegistryKey rk Registry CurrentUser OpenSubKey Software Norbert Eder MySoftware if rk f null string valuel string rk GetValue valuel string value2 string rk GetValue value2 NET BlogBook Ausgabe 4 rk Close Damit sollte es nun einfach m glich sein Werte in die Registry zu schreiben und daraus auszulesen Eventuell empfiehlt es sich hier noch genauer im MSDN nachzulesen um zus tzliche Informationen zu erhalten 2 2 73 Exception Handling und Security Zum Exception Handling habe ich
73. name T gt Any serializable type lt typeparam gt lt param name configuration gt Serializable object lt param gt lt returns gt Given type T lt returns gt public T Read lt T gt string configuration 1f this coniigFath p ll Directory Exists this Sonfigrach throw new Exception string Format ConfigurationManager No valid path given 0 chis 2 nr gpach T Ist pem string filename Path Combine this ContigqPath configuration centig if File Exists filename throw new Exception ecring Format ConfigurationManager Configuration 0 doesn t exist filename BinaryFormatter bf new BinaryFormatter FileStream fs new FileStream filename FileMode Open T tempObject T bf Deserialize fs fs Closets return tempObject lt summary gt NET BlogBook Ausgabe 4 Write Configuration The typename is used as the filename lt summary gt lt typeparam name T gt Any serializable type lt typeparam gt lt param name configuration gt Serializable object lt param gt public void Write lt TS T configuration this Write configuration configuration GetType Name lt summary gt Write Configuration lt summary gt lt typeparam name T gt Any serializable type lt typeparam gt lt param name configuration gt Serializable object lt param gt lt param name filename gt Filename to be
74. nderungen am Client und ein damit verbundenes Rollout vornehmen zu m ssen Nun stellt sich die Frage ber welches Protokoll kommuniziert wird Dies wird in so genannten Policies festgelegt Wie erfolgt nun der Ablauf der Kommunikation Die Kommunikation erfolgt prinzipiell durch das Versenden und Empfangen von Nachrichten Diese enthalten Daten und keine Objekte Der Austausch erfolgt ber so genannte Endpoints die vom jeweiligen Service bereitgestellt werden Ein Endpoint besteht aus drei Teilen e Adresse e Binding e Kontrakt Die Adresse definiert wo der Endpoint zu finden ist Das Binding beschreibt wie der Endpoint aufgerufen wird und der Kontrakt wie bereits weiter oben beschrieben definiert welche Operationen angeboten werden Weitere Informationen zu diesem Thema k nnen unter folgenden Links gefunden werden SOA Wikipedia Service Oriented Architecture Microsoft 4 1 5 Aspect Oriented Programming NET BlogBook Ausgabe 4 Ein hei es Thema und fur viele sicherlich interessant Und ein Blick uber den Tellerrand schadet sowieso nie Daher ein paar gute Links dazu Aspect oriented programming in C Part Aspect oriented programming in C Part Il Using AOP in C AOP Aspect Oriented Programming in C Aspect Oriented Programming using NET AOP in C AOP Support for C PDF 4 2 Analyse 4 2 1 Eigenen Code analysieren Wo gibt es Verbesserungsm glichkeiten Sind fur die Performance rele
75. new Point this Wiath 0 Point p3 new Point this Width this Height Point p4 new Point 0 this Height points U pl pointe 1 p2 points 2 p3 points 3 p4 e Graphics DrawPolygon new Pen new SolidBrush this BackColor PaintBorder e points NET BlogBook Ausgabe 4 PaintBar e lt summary gt Paints the border lt summary gt lt param name e gt The lt see cref System Windows Forms PaintEventArgs gt instance containing the event data lt param gt private void PaintBorder PaintEventArgs e Pen p new Pen new SolidBrush this borderColor e Grephles DrawlLinesip til b rderFoints lt summary gt Paints the disabled part of the progress bar lt summary gt lt param name e gt The lt see cref System Windows Forms PaintEventArgs gt instance containing the event data lt param gt private void PaintDisabledPart PaintEventArgs e int y this Height 6 2 LinearGradientBrush lgb new LinearGradientBrush new Rectangle 3 y this Width 5 this Height y 3 this darkDisabledColorl this darkDisabledColor2 GUT e Graphics FillRectangle lgb new Rectangle 3 ytl this Width 5 this Height y 3 e Graphics FillRectangle new SolidBrush this brightDisabledColor new Rectangle 3 3 this Width 5 y lt summary gt Paints the active part of the progress bar lt summary gt l
76. nme nn enennenen WPF Rotation 1 WPF Rotation 2 Visual Studio Visual Studio Webprojekte und Firefox 1 Webprojekte und Firefox 2 Webprojekte und Firefox 3 Default BroWSel cccccccceccceeceeeceeceeeeeeeeeeeeeeeeaeeaeeees Class FEINDIAlE ve ssesccantcsdeanncanctat nennen PIOJECLEINE COUNIET ee ae een Korrespondierende Klammer 02200220024000000n nn nennen nnenne nen Visual Studio Visual Studio Enterprise Library Configuration CCNetConfig schneller starten Add IN Manager WMI Code Creator ccccccceccccccececececcaceccceccaucaccaceaceccscesuesueaueaneas ASP NET Deployment Tool 1 ASP NET Deployment Tool 2 Community Server Installation 1 Community Server Installation 2 Community Server Installation 3 cccccccccceecesseeesseeeeeeseeeeeeeeeneees Community Server Installation 4 200222002220nenennennnnen een Community Server Installation 3 2 2002220022000220 een nnn nennen Community Server Installation 6 u02220022200200 sen nnn nennen ILMergeDemo Solution Explorer 0022200222002000 nenn nennen Lutz Roeder s NET Reflector bersicht uu Reflector nach dem Merge ccccccsscccssceceseeceeeeceseeseeeseeseeseesaeenaes Database Publishing Wizard 1 Database Publishing Wizard 2 Database Publishing Wizard 3 Database Publishing Wizard 4 Database Pu
77. noch benutzt wird Jedes Mal wenn ein Objekt vom Garbage Collector besucht wird wird es als erreichbar markiert Nach diesem Durchlauf steht nun fest welche Objekte erreichbar sind und welche nicht Zyklische Referenzen also Objekt A referenziert Objekt B welches Objekt C referenziert welches wiederum Objekt A referenziert werden ebenfalls entsprechend behandelt Im n chsten Schritt wird der Managed Heap durchlaufen und dieser kompaktiert Das bedeutet dass Objekte die verworfen werden k nnen durch Objekte die im Heap weiter oben gelagert sind berschrieben werden Dadurch verkleinert sich der Heap und ben tigte Objekte wandern weiter nach unten Es entstehen also keine L cher Heap Fragmentierung Dadurch m ssen nat rlich auch alle Referenzen vom GC ge ndert werden Dies ist nat rlich ein aufw ndiges Unterfangen und aus diesem Grund sollte der GC manuell nur aufgerufen werden wenn dies unbedingt notwendig ist Wann werden Objekte nicht mehr ben tigt Beispielsweise werden in einer Methode unterschiedliche Objekte instanziert Wurde diese Methode durchlaufen werden diese Objekte nat rlich nicht mehr ben tigt und werden beim n chsten Durchlauf des GC entsprechend behandelt Sie m ssen also nicht explizit auf null gestellt werden Anders verh lt es sich bei Objekten die expensive resources Dateien Socket Verbindungen Ports Daten Strukturen etc enthalten Hier bietet NET die object finalization an Werden also Ve
78. scopes g ltig Im Code w rde das folgenderma en aussehen using OdbcConnection sqlConn new OdbcConnection OdbcCommand sqlCmd new OdbcCommand sql sqlConn sqlConn Open OdbcDataReader sqlReader sqlCmd ExecuteReader while sqlReader Read Console WriteLine sqlReader ID salReader Closel eqlConn Closet Diese Vorgehensweise hat mehrere Vorteile Zum einen wird der Zugriff auf eine bereits geschlossene Verbindung verhindert da das entsprechende Objekt au erhalb des scopes nicht vorhanden ist Zum anderen wird beim Auftreten eines Fehlers in jedem Fall die Verbindung zur Datenbank geschlossen da der Compiler diesen Code intern in einen try catch finally Block bersetzt Somit ist es auch m glich das manuelle Schlie en der Datenbank ganz wegzulassen Der bersicht halber wird es in diesem Beispiel aber trotzdem verwendet Mit Hilfe des Tool ildasm exe kann man dies anhand der vom Compiler erzeugten Metadaten berpr fen NET BlogBook Ausgabe 4 Tes ithScope Program Main void strinal ldloc z ldloc d IL 8815 newobj instance void Systen Data Systen Data Odbc OdbcConmand ctor string class System Data IL O81a stloc IL_ edib Idloc 1 IL 8 4c callvirt instance void Systen Data Systen Data Common DbConnection Open IL_ 8821 nop IL 8022 Idloc IL_0023 callvirt instance class System Data systen Data Odbe DdbeDatareader Systen Data Systen D IL 8028 s
79. sollte jeder Entwickler sorgsam mit Verbindungen zu solchen Ressourcen umgehen d h ge ffnete Verbindungen m ssen immer geschlossen werden sobald diese nicht mehr ben tigt werden Allerdings ist oft genau das Gegenteil der Fall Dieser Artikel soll kurz aufzeigen welche Fehler am h ufigsten gemacht werden und wie man mit einem kleinen Trick diese umgehen kann Verbindungen zu solchen Ressourcen wie Datenbanken herzustellen ben tigt Zeit Deshalb arbeitet das NET Framework mit dem sog Connection Pooling Der Connection Pool h lt eine gewisse Anzahl von m glichen Verbindungen vor und teilt diese den anfragenden Teilen des Programms zund Dabei wird nat rlich darauf geachtet dass Verbindungen nicht mehr ge ffnet sind bevor sie neu zugeteilt werden Sobald alle Verbindungen aufgebraucht sind wird eine entsprechende Ausnahme ausgegeben Unter normalen Umst nden reicht die Anzahl der m glichen Verbindungen aus Sollte es doch mal zu einem Engpass kommen ist oft die Unachtsamkeit des Entwicklers schuld der eine Verbindung nicht geschlossen hat Aber selbst wenn dieser alles richtig gemacht hat k nnen offene Verbindungen zur ckbleiben H ufig werden Datenbanken nach folgendem Schema ge ffnet und geschlossen string sql SELECT FROM Tabellel OdbcConnection sqlConn new OdbcConnection OdbcCommand sqlCmd new OdbcCommand sql sqlConn sqlConn Open OdbcDataReader sqlReader sqlCmd ExecuteReader while sqlReader Rea
80. urspr nglichen Daten in derselben Form zur ck zu erhalten 2 2 23 Graphics MeasureString Ma einheit der R ckgabe beeinflussen Immer wieder taucht die Frage auf in welcher Einheit die R ckgabe der Methode MeasureString Graphics Object gehalten ist Hier die Antwort Die Ma einheit wird ber die PageUnit Eigenschaft des Graphics Objektes beschrieben Hierzu wird die Enumeration GraphicsUnit verwendet Diese besitzt folgende Werte Display Document Inch Millimeter Pixel Point NET BlogBook Ausgabe 4 e World Um also die Breite eines Strings in Pixel zu erfahren ist vor dem Aufruf von MeasureString die Eigenschaft PageUnit des Graphics Objektes auf GraphicsUnit Pixel Zu stellen MSDN Graphics Class MSDN MeasureString Method MSDN PageUnit Property 2 2 24 Installierte Grafik Codecs Installierte Grafik Codecs k nnen mit nachfolgendem Code ermittelt werden foreach ImageCodecInfo codecInfo in encoders ImageCodecInfo encoders ImageCodecInfo GetlmageEncoders Console WriteLine codecInfo MimeType 2 2 25 JPEG Grafiken verlustlos rotieren Der nachfolgende Code zeigt wie JPEG Grafiken und ebenso auch andere Formate verlustlos rotiert werden k nnen Image i Image FromFile this imageFilename ImageCodecInfo usedIC this GetEncoderInfo image jpeg System Drawing Imaging Encoder encoder System Drawing Imaging Encoder Transformation EncoderParameters encparams new EncoderParame
81. used lt param gt public void Write lt T gt T configuration string filename LE thie CoOMtigralh null Directory E amp 218sts This Sonfigrach throw new Exception string Format ConfigurationManager No valid path given 0 this coniigPath 77 lt noe sete sys string file Path Combine this conrigPath Tilename conrig BinaryFormatter bf new BinaryFormatter FileStream fs new FileStream file FileMode OpenOrCreate bf Serialize fs configuration ts Close endregion Public Methods Wie kann dieser Manager nun eingesetzt werden Zuerst muss ein serialisierbares Objekt erstellt werden Serializable public class Package public string PackagePath null public ArrayList DirectoryList new ArrayList public ArrayList FileTypeList new ArrayList public ArrayList FilesList new ArrayList Diese Klasse ist serialisierbar und kann nun mit dem ConfigurationManager verwendet werden Der Name ConfigurationManager wird von mir fur das Speichern von Konfigurationen verwendet Grundlegend k nnen alle serialisierbaren Typen damit gespeichert bzw geladen werden Und so geschieht in weiterer Folge der Aufruf ConfigurationManager cm ConfigurationManager GetInstance cm Configurationrath MyPach Package pcp new Package pep FackageF ach F2anocher Fach cm Write pcp MyFile config NET BlogBook Ausgabe 4 Package originalf
82. using System Collections Generic using System Text namespace ExceptionLoggingDemo class Program static void Main string args new DoSomethingClass ThrowAnException Console WriteLine Exception thrown Console Readkey we Nun binden wir die Enterprise Library ein bzw die Teile davon die wir tatsachlich benotigen Dabei handelt es sich um folgende Libraries Microsoft Practices EnterpriseLibrary Common Microsoft Practices EnterpriseLibrary ExceptionHandling Microsoft Practices EnterpriseLibrary ExceptionHandling Logging Microsoft Practices EnterpriseLibrary Logging Bevor wir nun daran gehen die Enterprise Library zu konfigurieren erstellen mussen wir uns genauer ansehen wie der Ablauf aussehen soll Grunds tzlich binden wir den Exception Handling Block ein Dieser f ngt unsere Ausnahmen auf Hier mussen wir eine neue Exception Policy hinzufugen damit unsere Exception auch aufgefangen wird hier sind unterschiedliche Policies moglich und k nnen somit auch unterschiedlich behandelt werden Dieser Policy h ngen wir einen Logging Block um Hierbei ist sch n zu sehen dass die einzelnen Blocks sehr gut miteinander zusammenarbeiten Durch diese Definition legen wir fest dass auftretende Exceptions mitgeloggt werden sollen Nun muss der Logging Block entsprechend konfiguriert werden Es muss also angegeben werden wohin die NET BlogBook Ausgabe 4 Daten geschrieben werden und wie diese formatie
83. von Generics hat dem sei noch das Projekt Generics NET auf CodePlex empfohlen 2 2 6 Funktionsangebot der System Environment Klasse Die System Environment Klasse bietet einige nette Hilfsmittel die durchaus n tzlich sind Dabei handelt es sich quasi um eine Allerlei Ssammlung Die angeh ngte Beispielanwendung NET 2 0 gibt alle verf gbaren Daten in einer ListView aus Dabei handelt es sich um folgende Daten NET BlogBook Ausgabe 4 Re 5ystem Environment Visualizer DAR Property Method Data Curent Directory C Dokumente und Einstellungen ede Eigene Dateien Visual Studio 2005 Proj Get LogicalDrives CA Has Shutdown Started False Machine Name Why Machine Name OS Version Microsoft Windows NT 5 1 2600 Service Pack 2 Processorlourt 2 Stack Trace at System Environment Get Stack Trace Exception e Boolean needFilelnfo System Directory CAWINDOW S system 32 TickCount 6500500 UserDomain Name Domain Userlnteractive True UserName ede Version 2 0 50727 42 Working Set 17391616 Abbildung 1 System Environment Visualizer Zu beachten ist dass die Klasse auch einige Methoden besitzt die interessant sind Exit ExpandEnvironmentVariables FailFast GetCommandLineArgs GetEnvironmentVariable GetEnvironmentVariables GetFolderPath GetLogicalDrives SetEnvironmentVariable Zusammen also eine nette und vor allem hilfreiche Liste Eine genaue Beschreibung der genannten Methoden findet sich im MSDN unter System Environment
84. ware das MSDN sondern auch in Form von Buchern oder den zu den verwendeten Werkzeugen mitgelieferten Ressourcen 2 Fehlendes Verstandnis und Wissen rund um den Debugger Immer wieder muss ich feststellen dass der Debugger wenig bis gar keine Beachtung findet obwohl sich durch ihn das wohl beste Werkzeug berhaupt offenbart Auf schnelle Art und Weise konnen nicht nur Syntax Fehler gefunden werden nein es k nnen auch Variableninhalte abgefragt werden Objektinformationen bezogen und sogar Abfragekommandos an den Compiler bergeben werden 3 Ignoranz von Unit Tests Die Verwendung von Unit Tests wird in vielen F llen nur Profis zugetraut und aus diesem Grunde wird ihnen kaum Beachtung geschenkt oder aber einfach das fehlende Wissen um diese M glichkeit Dieser Artikel soll zeigen dass selbst Programmier Anf nger sehr einfach Unit Tests verwenden k nnen Begriffserkl rung Bevor wir aber tiefer in die Materie einsteigen muss der Begriff Unit Test erkl rt werden Durch Unit Tests ist es m glich Testklassen zu schaffen die automatisiert andere vorhandene Klassen testen So werden pro Testklasse folgende Dinge der zu testenden Klasse angegeben und getestet e alle Methoden e alle berladungen e in allen erdenklichen bergabeparametern auch sinnlosen Varianten Vor allem die sinnlosen Varianten sind f r die Tests sehr wertvoll Dadurch werden berl ufe und vor allem auch Fehleingaben durch User diese pas
85. 1 CHIS Streetcniuiber value public int Zip get zeturn This SIP set this zip value Public string City Ser return this city 7 ser THIS City values Public string Country get zeturn Cib Country ser this country value j public void ResetData is CIty mul this Country tall this Street null Chis Streetiunper mill tnig Zip Oe NET BlogBook Ausgabe 4 public override BaseObject Build Address address new Address address City this city address Country This country address Street This street address Efresthunber this Slrestnumber BOGress 421p this zip return address Die Ausf hrung der gesamten Anwendung erfolgt durch nachfolgenden Sourcecode List lt Address gt addresses new List lt Address gt XmlDocument doc new XmlDocument doc Load addresslist xml XmlNodeList xnlAddresses doc SelectNodes addresses address if xnlAddresses null amp amp xnlAddresses Count gt 0 AddressBuilder builder new AddressBuilder AddressParser parser new AddressParser builder foreach XmlNode xnAddress in xnlAddresses parser Parse xnAddress Address address Address builder Build addresses Add address foreach Address a in addresses Console WriteLine a ToString Console NrciteLine ae E Console Read Fazit Uber dieses Pattern k nnen du
86. 77 C Eintrag in das EventLog hinzuf gen Das EventLog stellt eine gute Basis dar Informationen oder aufgetretene Probleme abzulegen Hier ein kleines Beispiel wie dies funktioniert if EventLog SourceExists TestCategory EventLog CreateEventSource TestCategory TestLog EventLog evtLog new EventLog evtLog Source TestCategory evtLog WriteEntry This is a test EventLogEntryType Information Zuerst wird lediglich berpr ft ob eine bestimmte Kategorie im EventLog bereits vorhanden ist Wenn nicht erfolgt eine Anlage Anschlie end wird ein Objekt vom Typ EventLog erstellt als Source die soeben angelegte Kategorie zugewiesen Mittels WriteEntry kann nun ein Eintrag erstellt werden EventLogEntryType legt den Typ des zu schreibenden Eintrages fest 2 2 78 NET Directory Move und unterschiedliche Volumes Mit Directory Move ist es sehr einfach komplette Verzeichnisse zu verschieben Ein Problem stellt sich lediglich dann ein wenn Verzeichnisse zwischen unterschiedlichen Volumes verschoben werden sollen Dies wird durch Directory Move nicht abgedeckt Stattdessen muss auf eine eigene Implementierung zur ck gegriffen werden Mit Hilfe einer Rekursion kann das dann in etwa so aussehen public void MoveDirectory string strsourceDir string strDestDir bool bDelSource Lt tDirect ry Exists strSourceDir if Directory GetDirectoryRoot strSourceDir Directory GetDirectoryRoot strDestDir
87. Abonnenten am Verteiler gel scht und neu erstellt werden ndern sich nur einzelne Datenfelder k nnen diese nur mit der Stored Procedure sp repladdcolumn zur Replikation hinzugef gt werden Dies ist auf Dauer doch recht m hsam Der SQL Server 2005 bietet diese Einschr nkungen nicht mehr 7 13 Autoinkrement Wert nach INSERT INTO auslesen die Zweite NET BlogBook Ausgabe 4 Im letzten Beitrag zu diesem Thema Zeigte ich kurz auf wie es moglich ist einen inkrementellen Identit tswert nach einem INSERT auszulesen Dazu verwendete ich die Konstante IDENTITY Allerdings ist die Verwendung dieser Konstante nicht immer zu empfehlen da IDENTITY unabh ngig des aktuellen Gultigkeitsbereiches arbeitet Verwendet man z B einen Trigger der nach dem eigentlichen INSERT ein weiteres auf eine andere Tabelle absetzt erh lt man den letzten Identit tswert In diesem Fall also den Wert des zweiten INSERT Mit der Verwendung von SCOPE IDENTITY umgeht man dieses Problem da diese Funktion in Abh ngigkeit des aktuellen G ltigkeitsbereichs arbeitet CREATE PROCEDURE Lop Test name varchar 300 AS SET NOCOUNT ON INSERT INTO Tabellel name VALUES name SELECT SCOPE IDENTITY SET NOCOUNT OFF INSERT INTO Tabelle2 Tabellel ID mame VALUES SCORE IDENTITY name GO Jedem der mehr zum Thema SQL und SQL Server wissen mochte kann ich die Internetseite InsideSQL de empfehlen 7 14 Zufalligen Datensatz aus
88. Block Logging muss nicht kompliziert sein Wer bekannte Logging Bibliotheken a la NLog nicht verwenden will oder doch lieber seine Informationen in der Ereignisanzeige sehen m chte der kann den Enterprise Logging Application Block verwenden Mittlerweile findet sich im Paket das Tool Enterprise Library Configuration mit dem Konfigurationen f r die unterschiedlichen Application Blocks erstellt werden k nnen F r mein Beispiel w rde dies so aussehen i Enterprise Library Configuration File Action Help Oa i Gi ce Enterprise Library Configuration E General El 7 e dokumente und einstellungen ed Name Formatted EventLog TraceListener Ses Logging Application Block E Referenced raceListener Formatted EventLog TraceListener fF Filters Formatter iE Category Sources El fy General lil Formatted EventLog Formatted EventLog TraceListener 1 53 Special Source EnterpriseLoggingDemo Logging Emors amp Wamin TraceDutputOptions None io L M Fomatted EventLog ven gt Unprocessed Category P All Events Trace Listeners Late Formatted EventLog Tra 4 Formatters Text Formatter Abbildung 62 Enterprise Library Configuration Die durch die Konfigurierung entstehende Konfigurations Datei welche der NET Standard Anwendungs Konfiguration entspricht muss nun nur mehr in das Anwendungsverzeichnis kopiert werden Zudem sind folgende Assemblies einzubinden NET BlogBook Ausgabe 4 Microsoft Prac
89. CPU Build Build Events Enable Code Analysis defines CODE_ANALYSIS constant Debug Rules Status Ww Design Rules d Warning Resources Globalization Rules Warning Settings Interoperability Rules 4 Warning E E Dale IV Maintainability Rules A Warning I Mobility Rules a Warning Signing v Naming Rules M Warning Security I Performance Rules dh Warning Ww Portability Rules Warning Publish I Reliability Rules A Warning Code Analysis IM Security Rules A Warning IM Usage Rules d Warning Wird der Compiler Schalter CODE ANALYSIS aktiviert wird die Analyse bei jedem Kompilierungs Vorgang ausgef hrt Wer dies m chte kann die Analyse auch manuell starten Hierzu ist das Kontext Menu eines Projektes zu ffnen und Run Code Analysis aufzurufen Refresh Build Rebuild Clean Publish Run Code Analysis Project Dependencies rm In einigen F llen kann es vorkommen dass bei Durchsicht des Codes dieser als korrekt definiert wird obwohl durch die Code Analyse eine Warnung ausgegeben wurde F r derartige F lle kann diese mit Hilfe des SuppressMessage Attributes SuppressMessageAttribute unterdr ckt werden Ein Beispiel m chte ich an dieser Stelle nicht vorenthalten Nun stellt sich eventuell noch die Frage wof r Code Analysis denn eigentlich gut sein soll und welchen Nutzen man davon hat Je nach definierten Regeln idealerweise sollten alle Regeln aktiviert sein werden Hinweise auf undokumentiert
90. D ehiml transitional dta gt lt html xmlns http www w3 org 1999 xhtml gt lt head runat server gt lt title gt Cache Demo lt title gt lt head gt lt body gt Uhrzeit lt DateTime Now ToLongTimeString gt lt body gt lt html gt Wird diese Seite gestartet und mehrmals durch Reload aktualisiert ist sch n zu sehen dass stets die aktuelle Uhrzeit angezeigt wird Mit der Output Direktive kann nun ein einfaches Caching aktiviert werden Der Aufbau der Direktive sieht wie folgt aus lt s OutputCache Duration 10 VaryByParam None gt Hier nun das gesamte Beispiel lt S Page Language C AutoEventWireup true COcerile Detayliseape ce inherite Default gt lt OutputCache Duration 10 VaryByParam None gt xI DOCTYPE html PUBLIC W3C DTD XHTML 1 0 Transitional EN http www ws org TER xhtml1 DTD xhtmll transitional dtda gt lt html xmlns http www w3 org 1999 xhtml gt lt head runat server gt lt title gt Cache Demo lt title gt lt lt head gt lt body gt Uhrzeit lt DateTime Now ToLongTimeString gt lt body gt lt 7 i gt Bei einer Ausfuhrung dieser Seite und dem Betatigen von Reload ist schon zu sehen dass der Seiteninhalt ca alle 10 Sekunden aktualisiert wird 2 4 44 ASP NET AJAX aktualisierte Dokumentation und Videos Das ASP NET AJAX Team hat die Dokumentation zu ASP NET AJAX 1 0 aktualisiert Neben einigen Korrekturen und zusa
91. Fall die Windows Communication Foundation Hier ein paar Links f r all diejenigen die sich weiter damit besch ftigen m chten e WCF Simple Example e Atruely simple example to get started with WCF e WCF sample Chat room client and server for NET Framework 3 0 e WCF example Using of self hosted service with SSL Zuk nftig werden wohl auch einige Beispiele von mir erscheinen 2 8 LINQ 170 NET BlogBook Ausgabe 4 2 8 1 LINQ to XML Ein einfaches Beispiel LINQ ist derzeit ein recht beliebtes Thema viele Beitrage werden dazu verfasst Auch ich mochte an dieser Stelle ein kleines sehr einfaches Beispiel zu LINQ to XML zeigen Es soll verdeutlichen wie wenig Aufwand es bedarf eine XML Datei auszulesen Zudem wird die Verwendung des Schl sselwortes var gezeigt Ausgangspunkt ist das nachfolgende XML lt xnl Wersion 1 0 emeaeting uti s 75 lt Persons lt Person gt lt Firstname gt Norbert lt Firstname gt lt Lastname gt Eder lt Lastname lt Email gt csharpaoqme at lt Email gt lt Weblog gt http blog norberteder com lt Veblog gt lt ketiveri lt kctive gt lt r Ferson lt Person gt lt Firstname gt Hugo lt Firstname gt lt Lastname gt Tester lt Lastname gt lt Email gt lt Email gt lt Weblog gt k Wehlog gt lt r Ferson lt Persons gt Und hier auch gleich das Beispiel if File Exists Persons xml XDocument personDoc XDocument Load Persons xml
92. Franz Lastname Nachname Es empfiehlt sich auch die weiteren M glichkeiten der Klasse SqlCommand im MSDN 2 nachzuschlagen da viele weitere Funktionen zur Verf gung stehen Alle zu beschreiben w rde jedoch den Umfang dieses Tutorials sprengen 4 Daten hinzuf gen Da wir nun eine der M glichkeiten gesehen haben wie Daten abgefragt werden k nnen werden wir nun einen Datensatz hinzuf gen Dies passiert wie folgt SqlCommand com new SqlCommand INSERT INTO tPerson Firstname Lastname VALUES efirstname lastname conn com Parameters Add new SqlParameter firstname fritz com Parameters Add new SqlParameter lastname huber com ExecuteNonQuery Wieder erstellen wir einen SqlCommand der ein SQL Statement bergeben bekommt sowie die Datenbankverbindung Hier passiert dann noch etwas Spezielles Aus Sicherheitsgr nden werden die Daten nicht direkt ins SQL Statement geschrieben sondern via SqlParameter Dieser Schritt hat einige Vorteile was das Thema SQL Injection etc betrifft Sollte also immer in dieser Form angewandt werden Mittels der ExecuteNonQuery Methode des SqlCommand Objektes wird der Befehl auf der Datenbank ausgef hrt und der Datensatz eingef gt 4 Zusammenfassung Dies war ein kurzer Einblick in die Datenbank Thematik unter C Alle Klassen und Methoden k nnen auf die gleiche Art und Weise unter VB NET verwendet werden Es empfiehlt sich die angegebenen Klassen im MSDN genauer anz
93. Hier werden die damit zusammenh ngenden Probleme gut und ausf hrlich beschrieben 2 2 47 Unable to debug The binding handle is invalid Welch nette Fehlermeldung beim Startversuch einer Anwendung unter dem Visual Studio 2005 Nach einiger Recherche kam ich dann auf des Ratsels Losung und ich war richtig verwundert Gestern ging ich meine Dienste am Rechner durch und deaktivierte alles was ich eigentlich nicht brauche Darunter auch die Terminal Services Das war ubrigens ein Fehler Denn Visual Studio 2005 benotigt die Terminal Services um Debuggen zu konnen Aber bitte nicht dass jemand auf die Idee kommt mich zu fragen warum das denn so ist Merke Programmiert man mit Visual Studio 2005 niemals die Terminal Services NET BlogBook Ausgabe 4 deaktivieren Einfach auf Manuell lassen und schon freut sich das Visual Studio wieder 2 2 48 Dateien vergleichen Mochte man zwei Dateien vergleichen kann man leider auf keine fertige Methode im Framework zuruckgreifen Im MSDN findet man allerdings eine Anleitung inkl Quellcode um so eine Methode selbst zu schreiben Eigentlich muss man den Quellcode einfach nur kopieren und in das Projekt einfugen Nachfolgend der Quellcode This method accepts two strings the represent two files to compare A return value of 0 indicates that the contents of the files are the same A return value of any other value indicates that the files are not the same private bool FileCom
94. ILMergeDemo bin F ILMergeDemo Version 1 0 0 0 Culture neutral Windows Application Im Abbildung 74 Lutz Roeder s NET Reflector bersicht Nach dem Merge Vorgang ist ersichtlich dass sich alles in einer einzigen Assembly befindet File View Tools Help ooleBalnN Pue ol E ILMergeDemoMerged Wy ILMergeDemoMerged exe a References El HEERES FormMain ae Program ILMergeDemo Core Calculator ILMergebemo Properties Resources namespace ILMergeDemo Abbildung 75 Reflector nach dem Merge NET BlogBook Ausgabe 4 Was passiert mit den Ressourcen ILMerge kann Ressourcen nicht zusammenf hren sondern lediglich kopieren was bei der Ausf hrung auch passiert Nun kann es bei der Laufzeit der zusammengef hrten Assembly zu Fehlern kommen Dies ist beispielsweise dann der Fall wenn die Ressourcen Referenzen zu Typen kodieren Diese k nnen danach nicht mehr aufgel st werden Die Referenz verweist auf die urspr ngliche Assembly die es nach dem Merge Vorgang nicht in der Sammel Assembly gibt Kann ich ILMerge direkt in ein Projekt einbinden Mit Visual Studio 2005 ist es m glich ausf hrbare Assemblies als Referenz einzubinden Dadurch kann ILMerge exe in ein anderes Projekt quasi als Klassenbibliothek eingebunden werden Weitere Informationen Kommerzielle Nutzung Eine kommerzielle Nutzung von ILMerge ist laut Lizenz m glich PDB Dateien zusammenf hren
95. Klassen und Methoden Somit ist das Problem mit ein paar Zeilen schnell gel st ExeConfigurationFileMap configFile new ExeConfigurationFileMap configFile ExeConfigFilename test config Configuration config ConfigurationManager OpenMappedExeConfiguration configFile ConfigurationUserLevel None AppSettingsSection section AppSettingsSection config GetSection appSettings string configValue section Settings Folder Value 4 3 9 ToolTips einzelner Items einer CheckBoxList setzen In einem Forum tauchte die Frage auf wie man die Eigenschaft ToolTip einzelner CheckBoxen einer CheckBoxList setzt Das CheckBoxList Control bietet selbst eine Eigenschaft ToolTip allerdings setzt man dann gleich den ToolTip f r alle CheckBoxen 207 NET BlogBook Ausgabe 4 Die Eigenschaft ToolTip selbst bewirkt dass das HIML Attribut Title gesetzt wird Man muss also nur durch alle CheckBoxen iterieren und dieses Attribut manuell setzen Der Code hierf r ist recht einfach for int i 0 i lt CheckBoxList1 Items Count i ListItem item ListItem CheckBoxListl Items i item Attributes Add title TestTooltip i Um den Tooplip einzelner Items der Liste direkt setzen ohne durch die gesamte Liste zu iterieren habe ich mir eine kleine Methode geschrieben private void SetCheckBoxToolTipByValue string value string toolTip ListItem item ListItem CheckBoxListl Items FindByValue value if
96. LECT Name Surname AS FullName FROM Persons gt lt asp SqlDataSource gt lt asp DropDownList ID DropDownList1 runat server DataSourceID SqlDataSourcel DataTextField FullName DataValueField ID gt lt asp DropDownList gt Das Beispielprojekt kann hier heruntergeladen werden 2 4 4 Lange eines Strings per Validation Control uberprufen Leider ist es mit dem ASP NET RangeValidator nicht ohne weiteres moglich die Lange eines Strings zu uberprufen Mit Hilfe eines kleinen regularen Ausdrucks und dem RegularExpressionValidator kann man diesen Umstand allerdings umgehen f w 1 20 Dieser Ausdruck lasst nur Eingaben mit der maximalen Lange von 20 Zeichen zund Eingebaut in den RegularExpressionValidator ist das Problem auch schon gel st lt asp RegularExpressionValidator ID regexCheck runat server ErrorMessage Error ValidationExpression w 1 20 S gt M chte man die Eingabe von vornherein begrenzen kann man das Attribut MaxLength des TextBox Controls benutzen lt asp TextBox runat server MaxLength 20 gt 2 4 5 Per Shift Taste mehrere CheckBox Controls markieren Die Aufgabe ist es ein wenig Windows Look amp Feel in eine WebForm zu portieren Genauer gesagt geht es darum mit Hilfe der Maus und der Shift Taste mehrere CheckBox Controls zu markieren In diesem Beispiel ist eine Liste mit mehreren Produkten gegeben die jeweils anhand einer CheckBox zum Loschen markiert werden konn
97. NET BlogBook 4 Ausgabe Norbert Eder Kat Gloth NET BlogBook Ausgabe 4 Dipl Ing FH Norbert EDER http Weblog norberteder com Norbert Eder ist als Software Architect und Technologieberater t tig Er besch ftigt sich seit den Anf ngen mit dem Microsoft NET Framework Zus tzlich engagiert er sich fur die NET Community und versucht sein Wissen an Hilfesuchende weiter zu geben Sie k nnen ihn unter me norberteder com erreichen Community Projekte http www dotnet blog com http www dotnetcasts com Kai Gloth http Weblog veloursnebel de Kai Gloth arbeitet als Softwareentwickler und studiert Informatik Er besch ftigt sich haupts chlich mit ASP NET und versucht die Begeisterung f r diese Technologie an Einsteiger weiterzugeben Sie k nnen ihn unter kai veloursnebel de erreichen Community Projekte http www dotnetcasts com NET BlogBook Ausgabe 4 Unterstutzt durch visual studio one ASP NET professional Gewinnchance In dieser Ausgabe befindet sich ein Gewinncode Senden Sie diesen an csharp gmx at bis sp testens 30 11 2007 und gewinnen Sie wahlweise ein Jahresabonnement der visual studio one oder der ASP NET Professional Bitte geben Sie in Ihrem Email folgende Daten an Name Adresse Email Adresse Wie wurden Sie auf das NET BlogBook aufmerksam F NF Gewinner werden unter allen Teilnehmern am 1 12 2007 gezogen und ffentlich per Namen bekannt geg
98. Null zur ckgesetzt werden 2 Wem die Pr zision und die Aufl sung der Stopwatch Implementierung nicht gen gt dem seien die Eigenschaften Frequency und IsHighResolution ans Herz gelegt Weitere Besonderheiten und generelle Informationen finden sich unter 1 Hier noch ein kleines sinnloses Beispiel NET BlogBook Ausgabe 4 private void PerformanceTest System Diagnostics Stopwatch stopWatch new System Diagnostics Stopwatch estopnarech zfarti StringBuilder sb new StringBuilder tor int 1 Of i lt 1000090 itt sb Append Stopwatch stop Console WriteLine Milliseconds used stopWatch ElapsedMilliseconds 1 MSDN Stopwatch Klasse System Diagnostics 2 2 14 Klassen als obsolet veraltet markieren Vor allem bei der Entwicklung von Frameworks kommt es immer wieder vor dass bestimmte Klassen durch andere ersetzt werden da ein anderes Pattern eingezogen wurde oder einfach nur eine bessere Implementierung gefunden wurde Nun sollten diese Klassen nicht sofort aus dem Framework entfernt werden aus Gr nden der Kompatibilit t zu lteren Versionen Hier bietet es sich an diese Klassen als obsolet zu markieren Dies kann folgenderma en erreicht werden Obsolete BeschreibungsText false Keine Fehlermeldung public class Test Obsolete BeschreibungsText true Fehlermeldung public class Test Es stellt sich nun lediglich die Frage wie lange die
99. Project Types My Templates kj Search Online Templates A project for creating a C class library dll Name ClassLibraryl Location C Development Blog Solution Create new Solution Create directory for solution ClassLibraryl Abbildung 39 Custom Control In diesem Fall wird die neue Klasse von einer vorhandenen abgeleitet sodass man die grundlegende Funktionen nicht selbst implementieren muss Da die Ausgabe nicht sehr umfangreich ist bietet sich das Literal Control an public class LastWriteTime System Web UI WebControls Literal protected override void Render System Web UI HtmlTextWriter writer FileInfo fi new FilelInfo HttpContext Current Request PhysicalPath writer Write fi LastWriteTime base Render writer NET BlogBook Ausgabe 4 Wie man sehen kann wird die Methode Render uberschrieben bzw um den notigen Code erganzt Die Eigenschaft PhysicalPath beinhaltet den vollstandigen physischen Pfad der aktuellen ASPX Datei welcher notig ist um eine Instanz der Klasse FileInfo zu erstellen Uber die Eingenschaft LastAccessTime ist es m glich das Datum und die Uhrzeit auszulesen an dem die Datei wie der Name schon sagt zuletzt geschrieben wurde Die Methode Write des writer Objekts gibt diese Info aus Im Web Projekt selbst kann man das Custom Control per Web Config hinzuf gen Bereits an anderer Stelle hatte ich beschrieben wie dies m glich ist Der
100. RENT USER Software Microsoft VisualStudio s 0 ProjectMRUList berfl ssige Eintr gen k nnen daraus einfach gel scht werden Es muss jedoch auf die korrekte Nummerierung geachtet werden File1 File2 usw 8 5 IlE 6 0 Kontextmenu Es gibt Programme die sich in das Kontextmen des Internet Explorers eintragen M chte man diese Eintr ge entfernen sollte man unter folgendem Pfad in der Registry schauen HKEY CURRENT USER gt Software gt Microsoft gt Internet Explorer gt MenuExt Dort einfach die unerw nschten Eintr ge l schen 273 9 ABBILDUNGSVERZEICHNIS Abbildung 1 Abbildung 2 Abbildung 3 Abbildung 4 Abbildung 5 Abbildung 6 Abbildung 7 Abbildung 8 Abbildung 9 Abbildung 10 Abbildung 11 Abbildung 12 Abbildung 13 Abbildung 14 Abbildung 15 Abbildung 16 Abbildung 17 Abbildung 18 Abbildung 19 Abbildung 20 Abbildung 21 Abbildung 22 Abbildung 23 Abbildung 24 Abbildung 25 Abbildung 26 Abbildung 27 Abbildung 28 Abbildung 29 Abbildung 30 Abbildung 31 Abbildung 32 Abbildung 33 Abbildung 34 Abbildung 35 Abbildung 36 Abbildung 37 Abbildung 38 Abbildung 39 Abbildung 40 Abbildung 41 Abbildung 42 Abbildung 43 System Environment Visualizer 0220002200220 ne enesnnsnnsnnsnnseneen Reflection SPEARS een Assembly Key File Ressourcen schonen IL Code Fehlender Namespace 1 Fehlender Namespace 2 Anonyme Typen und Intellisense Komp
101. SELECT FROM sys objects WHERE object id OBJECT ID N dbo tPersonAge AND type in N U BEGIN 245 NET BlogBook Ausgabe 4 CREATE TABLE dbo tPersonAge PersonID int NULL Age int NULL Test image NULL END GO FREE OP ect Table Abo tFroperty Sori Date 01730 2007 11 20 12 eeeeeey SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON GO IF NOT EXISTS SELECT FROM sys o0b ects WHERE ob ect id OBJECT ID N dbo EPreperty AND type in N U BEGIN CREATE TABLE dbo tProperty ID int IDENTITY 1 1 NOT NULL Fullname nvarchar 255 COLLATE Latinl General Cl AS NULL PropertyName nvarchar 50 COLLATE Latini General CI AS NULL PropertyValue nvarchar 255 COLLATE Latin General CI As NULL Attributes nvarchar 1000 COLLATE Latinl General CI AS NULL CONSTRAINT PR tPr perty PRIMARY KEY CLUSTERED ID ASC YISLTH IGNORE DUP KEY OFF END GO f e eREX Object Table dbo tPerson Beri Date 01 30 2007 11 24 15 nr SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON GO IF NOT EXISTS SELECT FROM sys ob jects WHERE ob ect id OBJECT IDIN dbo tBferssa AND type in N U BEGIN CREATE TABLE dbo tPerson ID int LDENTITYt1 1 NOT BULL Firstname nvarchar 50 COLLATE Latini General CI 25 NULL Lastname nvarchar 50 COLLATE Latini General CI AS NULL CONSTRAINT PR TPrerson PRIMARY KEY CLUSTERED ID
102. Studio 3 lt body gt g lt form id form1 runat server gt 19 lt div gt 11 lt u u ES span E E strong J 14 lt boc GE sub 15 htn za sup 15 E5 table 23 textarea a tt E UC World Ein kleines Beispielprojekt gibt es hier 2 4 24 Caching von Bildern verhindern In div Foren stellen User haufiger die Frage wie man das Caching von Bildern verhindern kann Ein einfacher aber wirkungsvoller Trick ist es an den Bildnamen eine Zufallszahl zu hangen Meist reicht die Verwendung des Datums und der Uhrzeit image ImageUrl Image image gif System DateTime Now ToString yyyMMddHHmmss Der Browser findet nun bei jedem Aufruf ein neuer Bildnamen vor und cached somit das Bild nicht 2 4 25 XmIDataSource GridView und DataFormatString Die Darstellung einer XML Datei ist mit Hilfe der xmlDataSource und des GridView kein Problem Zumindest solange man nicht die Ausgabe der einzelnen Felder formatieren m chte Hierbei stie ich auf ein Problem welches ich nur mit einem kleinen Workaround l sen konnte Zun chst der Aufbau der XML Datei lt Data gt lt Item gt lt Number gt 0001 lt Number gt lt Name gt Test NET BlogBook Ausgabe 4 lt Number gt 0002 lt Number gt lt Name gt Test 1 lt Name gt lt Price gt 20 25 lt Price gt lt Date gt 12 711 1999 lt Date gt lt Item gt lt I tem gt 2 lt Name gt lt Price gt 75 lt Price gt lt Date gt 12 11 1999
103. T BlogBook Ausgabe 4 Solution Explorer Solution ExceptionLoggingDemo 2 projects 2 2 El amp ea Solution ExceptionLoggingDemo 2 projects 39 ExceptionLoggingDemo fa sa Properties amp References 4 Microsoft Practices EnterpriseLibrary Common 42 Microsoft Practices Enterpriselibrany ExceptionHandling 43 Microsoft Practices EnterpriseLibrary ExceptionHandling Logging 42 Microsoft Practices EnterpriseLibrary Logging lt NLogTraceListener sad A System System Data be System Xml x gt App conf on 2 ores c DoSome Edit WCF Configuration Refresh Edit Enterprise Library Configuration Exclude From Project ta Syste Og ae er Syste Ee Copy Gi Systel X Delete Hee a Syste a NLog cor Rename M NLogTra L Properties NLogTracelistener phe An mi Taim Ceninrer eA pranarhac E Snurre Ontiner E8 Salrhnn Feninrer aa Team Feninrer PA Pronerties Abbildung 9 Edit Enterprise Library Configuration Die Enterprise Library kann sowohl signiert als auch unsigniert eingebundern werden Wird die signierte Variante verwendet muss auch die eigene Assembly signiert sein Zudem muss im Falle eines TraceListeners die Klasse von CustomTraceListener abgeleitet sein und folgendes Attribut gesetzt haben ConfigurationElementType typeof CustomTraceListenerData Damit ist alles getan um unseren eigenen TraceListener laden zu k nne
104. TotalResultsCount Google ResultElement elements r resultElements Damit lasst sich dann schon etwas machen Und beispielsweise konnte eine sehr einfache Abfrage Anwendung so aussehen GoogleRequester 70 0 2 Search Snippet Keywords Visual CH Developer Center Microsoft s official product homepage Visual CH Express Visual CH Easy to Use L Pages Visual CH Developer Center The CH This section provides a quick tour oft CH Comer C Sharp CH NET CSharp W In this series of four articles we will tra CHC Sharp Help For CH Developers CH portal with articles message forum CH Station Tutorial Links Info C Sh Leam how to apply the CH programmi fatto fwi c CH Frogramming CH directory resource site for CH progr http ans H Pesult Lournt 1930000 4 Comparative Overview of CH Also compares CH Java C By Be CHC Sharp and Tutoriale on CH Friend CH community site which provides far APRESS COM MET 2 0 in CH 2005 From Novice to https ie a Abbildung 90 GoogleRequester 272 NET BlogBook Ausgabe 4 8 4 Recent Projects in VS 2005 Werden sehr viele Projekte im Visual Studio angelegt sei dies zu Testzwecken oder anderen Grunden erscheint die Liste der Recent Projects bald uberfullt Um diese zu leeren oder nur um bestimmte Eintr ge zu l schen muss dies uber die Registry erledigen Die Eintrage sind im nachfolgenden Schlussel zu finden HREY CUR
105. Unternehmen WPF nicht sofort einsetzen sondern auf einen gunstigen Moment warten auf das richtige Projekt die richtigen Entwickler oder moglicherweise gar nie diesen Schritt wagen Fakt ist dass dieser Schritt irgendwann vollzogen werden sollte Die M glichkeiten sind gro aber eine vorhandene Anwendung wird nun eben nicht von Heute auf Morgen umgestellt wobei auch die Sinnhaftigkeit einer Umstellung hinterfragt werden sollte Doch auch neue Projekte werden lieber mit Windows Forms entwickelt Und warum Vermutlich weil es einfach an allgemein bekannten Anwendungen fehlt die mittels WPF entwickelt wurden Entsprechende Patterns sind ebenfalls Mangelware dazu kommen wir in einem anderen Teil Was also sollte in meinem Unternehmen passieren um auf die neue Technologie zu kommen Diese Frage ist immer schwer zu beantworten Grunds tzlich sollte durch Visual Studio 2005 bald 2008 die Grundlage gelegt werden D h auf das NET Framework 3 0 sollte umgestiegen werden Diese muss nicht zwangsl ufig f r alle Anwendungen gelten Es ist ok sich nur eine kleine Anwendung auf wenn diese nur f r interne Verwaltungszwecke verwendet wird heraus zu nehmen und diese quasi als bung mit Hilfe der neuen Technologie umzusetzen Mit den gewonnenen Erfahrungen kann man sich an gr ere Projekte wagen 2 7 Windows Communication Foundation 2 7 1 Windows Communication Foundation Ein paar Beispiele Einer meiner kommenden Schwerpunkte wird auf jeden
106. UserControl Private int tun U Private int max 100 private int value 1 private Point _borderFoints null private Color bordercolor Color FromArgb 174 179 179 private Color brightDisabledColor Color FromArgb 222 222 222 private Color darkDisabledColorl C lar Fron rch 2093 209 209 private Color darkDisabledColor2 Color FromArgb 216 216 216 private Color brightActiveColor Color FromArgb 0 183 254 private Color darkActiveColorl Color FromArgb 0 167 233 private Color darkActiveColor2 Color FromArgb 0 183 254 lt summary gt Gets or Bers the minimum lt summary gt lt value gt The minimum lt value gt public int Minimum get I return This min j ser 1 this Min value lt summary gt Gets or sets the maximum lt summary gt lt value gt The maximum lt value gt public int Maximum get 1 return This max j set this max value I lt summary gt IFI Gets or sets the value lt summary gt NET BlogBook Ausgabe 4 lt value gt The value lt value gt public int Value Ar ffi FRE ve ger return This value set This value values thissInvalicate thie Update lt summary gt Initializes a new instance of the lt see cref SkypeProgressBar gt class lt summary gt public SkypeProgressBar InitializeComponent this SetStyle ControlStyles Use
107. Vorgang ist unter anderem dann interessant wenn Application Domains erstellt werden sollen die zur Laufzeit die M glichkeit bieten sollen entladen werden zu k nnen Schlie lich w re da noch Cache Proxies die bestimmte Daten des eigentlichen Objektes cachen und so diverse Vorg nge beschleunigen k nnen Das sind jedoch nicht die einzigen M glichkeiten So gibt es noch Synchronization Proxies und viele weitere Ein einfaches Grundger st eines Proxies findet sich nachfolgend NET BlogBook Ausgabe 4 using System using System Collections Generic using System Text namespace ProxyParttern class Program static void Mainistring args Calenlaterrroxy proxy new Caloularcorrroxy Console WriteLine Scring Formac 12 17 1077 proxy 22212 179 7 Console WriteLine SCrangerormact ls 17 107 ii 3 12 IT Console Read public interface ICalculator decimal Add decimal x decimal y decimal Sub decimal x decimal y public class Caleulatsr Calculator public decimal Add decimal x decimal y reCurn X y public decimal Sub decimal x decimal y return 2 y public class Calculator Proxy 2 Calcularor private Calculator calculator mew Galzulatoerih public decimal Add decimal x decimal y return cCalculator Adad x 9 public decimal Sub decimal x decimal y return calculator Sub x y Dies ste
108. Wiederholung gleich kommt Um es auf den Punkt zu bringen es ist einfach langweilig Daher wird dieser wichtige Schritt einfach nicht durchgef hrt Das Resultat Nun wer w rde sich ein Auto kaufen welches jedes Mal auf der Autobahn abstirbt weil der Motor aufgrund der andauernden Belastung uberhitzt also quasi einen berlauf verursacht Oder man stelle sich vor dass das Aufblendlicht nicht funktioniert weil der Kontakt zur Birne fehlt was vergleichbar mit einer Null Reference Exception w re Viele viele Beispiele g be es an dieser Stelle Grunds tzlich m chte jeder ein voll funktionst chtiges Auto Genauso verh lt es sich mit Software Wenn andere Branchen so fehlerbest ckte Produkte ausliefern w rden wie es Software Branche tut k nnten wir vermutlich mit keinem Ger t bzw keinem Produkt tats chlich etwas anfangen Das stimmt sehr nachdenklich In diesem Sinne w nsche ich einen guten Start ins Wochenende und auf dass es in Zukunft nicht auch notwendig ist die Software zum Service zu bringen oder gar j hrlich ein Pickerl TUV machen zu lassen 4 3 2 Unit Tests und Aufwand NET BlogBook Ausgabe 4 Danke f r die vielen R ckmeldungen die ich vor allem in Form von Emails erhalten habe Dabei stand fast immer die Frage nach dem Aufwand im Vordergrund Zu diesem Thema kann ich folgendes sagen behaupten Naturlich verursacht das Erstellen von Unit Tests einen entsprechenden Aufwand da jede Methode in allen erdenklic
109. Zieldatenbank SQL Server 2005 Vorhandene Objekte im Skript l schen True Zu ver ffentlichende Datentypen Schema und Daten Abbildung 81 Database Publishing Wizard 6 244 NET BlogBook Ausgabe 4 E Datenbankverottentlichungs Assistent status der Datenbankverofientlichung Der Ver ffentlichungsvorgang wird gerade ausgef hrt 3 Total Success Details Action Liste der Objekte f r die Skripterste Skripterstellung f r Objekte Skript wird auf den Datentr ger ges Abbildung 32 Database Publishing Wizard 7 Die Ausgabe dieser Testdatenbank sieht dann folgenderma en aus fereee Oo ect Table dbo tPerson Script Dates 0173072007 11 24 15 Hera If EXISTS SELECT FROM 893 6bJeera WHERE object id OBJECT IDIN dbo tPerson AND type in N U DROP TABLE dbo tPerson GO x k kkk Object Table dbo tProperty Sorin Date 017 3072007 ILa 13 Farta IF EXISTS SELECT FROM sys cbh ects WHERE Object id OBJECT 1D iN dbo tProperty AND type in N U DROP TABLE dbo tProperty GO Object Table dbo tPersonAge Sor nt Date 01730 2007 11220773 Massa IF EXISTS SELECT FROM sys ob ects WHERE object Id OBJECT ID N dbo tPersonAge AND type in N U DROP TABLE dbo tPersonAge GO x xxxx x Object Table dbo tPersonAge Soria Dare 0173072007 1322 75 Ferre SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON GO IF NOT EXISTS
110. a Wird dieser geklickt ist das Ergebnis eine einfache TextBox eingeschlossen in einem TemplateField Innerhalb dieses Feldes k nnen nun die Validation Controls benutzt werden Nat rlich ist es auch m glich die Controls au erhalb des Template Field zu plazieren NET BlogBook Ausgabe 4 lt asp TemplateField HeaderText Name SortExpression Name gt lt EditItemTemplate gt lt asp RequiredFieldValidator ID valTextBox1 runat server ControlToValidate TextBox1 ErrorMessage Errorl gt lt asp TextBox ID TextBox1 runat server Text lt S Bind Name gt gt lt asp TextBox gt lt EditItemTemplate gt lt InsertItemTemplate gt lt asp RequiredFieldValidator ID valTextBox1 runat server ControlToValidate TextBox1 ErrorMessage Errorl gt lt asp TextBox ID TextBox1 runat server Text lt S Bind Name gt gt lt asp TextBox gt lt InsertItemTemplate gt lt ItemTemplate gt lt asp Label ID Labell runat server Text lt Bind Name gt gt lt asp Label gt lt ItemTemplate gt lt asp TemplateField gt Auf diese Weise k nnen wie gewohnt die Eingaben auch im DetailsView validiert werden Bei genauerer Betrachtung w re sogar eine Unterscheidung zwischen Einf gen u Editieren m glich Das Beispielprojekt zu diesem Beitrag kann hier runtergeladen werden 2 4 64 UserControls um eigene Eigenschaften erweitern UserControls bieten eine hervorragende M glichkeit u
111. a E Action Suthenter ale Loggengln LogenError el Data f ALR Sorpa Li gr F l I a Leggedin Pared after the user m authentsi ted Abbildung 20 Logi n Control ohne ReturnUrl Dieser Event muss nun mit einer entsprechenden Methode belegt werden deren Aufgabe es ist die Weiterleitung per Response Redirect ZU steuern protected void Loginl LoggedIn object sender EventArgs ej Response Redirect Default2 aspx Anschlie end wird unabh ngig der ReturnUr1 immer auf die gew nschte Seite weitergeleitet Den Download des Beispielprojekts findet man hier 2 4 8 Literal content is not allowed within a skin file Zumindest auf den ersten Blick ist diese Fehlermeldung ein wenig verwirrend deshalb eine kurze Erkl rung dazu Die mit ASP NET 2 0 neu hingekommenen Skin Files erm glichen die Definition von Control Styles an einer zentralen Stelle F gt man dieser Datei ein Control hinzu wird die Definition f r alle verwendeten Controls der Applikation verwendet Allerdings darf man an dieser Stelle tats chlich auch nur Server Controls hinzuf gen welche man an dem Attribut runat Server erkennt Hat man dieses Attribut vergessen zeigt Visual Studio oben genannte Fehlermeldung an Mehr Informationen zum Thema Skin Files und ASP NET Themes findet man unter NET BlogBook Ausgabe 4 http quickstarts asp net QuickStartv20 aspnet doc themes default aspx http www microsoft
112. ackage cm Read Myrile contig Anzumerken ist dass der Pfad des ConfigurationManagers nur einmal gesetzt werden muss also nicht bei jedem Aufruf au er die Konfigurationen werden in unterschiedlichen Verzeichnissen abgelegt 2 2 62 Unbehandelte Ausnahmen Unhandled Exceptions Die Frage nach einer globalen Behandlung von aufgetretenen Ausnahmen und speziell von unbehandelten Ausnahmen wird oft gestellt Als m gliche Realisierung wird oft das folgende Beispiel gebracht Ausgangspunkt ist hier eine Konsolenanwendung class Program static void Main string args AppDomain CurrentDomain UnhandledException new UnhandledExceptionEventHandler delegate object o UnhandledExceptionEventArgs eventArgs Console WriteLine Unhandled Exception eventArgs ExceptionObject Verschwiegen ob bewu t oder aus Nichtwissenheit wird meist dass ber diesen Weg zwar viele Ausnahmen abgefangen werden k nnen diese M glichkeit jedoch nicht als Exception Handler zu verwenden ist Warum nicht Vorerst werden hiermit nicht behandelnden Exceptions mitgeteilt W rde es sich um einen Handler handeln w ren die Exceptions nicht unbehandelt Achtung Rekursions Alarm Weiters lassen sich einige Exceptions hiermit nicht behandeln da sie via try catch nicht abgefangen werden k nnen seit NET 2 0 StackOverflowException Zus tzlich ist zu beachten dass es einen groben Unterschied macht ob manuell zwecks Test
113. aden Der Scope beschreibt hier die g ltigen Ebenen die auf die Informationen zugreifen d rfen In der weiteren Folge wird dem StreamWriter ein IsolatedStorageFileStream bergeben der die Daten in diesen isolierten Speicher schreibt Gelesen werden k nnen die Daten folgenderma en new StreamReader StreamReader existingFile new IsolatedStorageFileStream IsolatedStorageTest txt FileMode OpenOrCreate NET BlogBook Ausgabe 4 if existingFile null Console WriteLine existingFile ReadToEnd existingFile Close Die Verwendung von isoliertem Speicher ist wie oben zu sehen also doch sehr einfach gehalten Dementsprechend empfiehlt es sich auch diesen tats chlich zu nutzen wenn sensible Daten im Spiel sind Weitere Informationen zu diesem Thema finden sich naturlich im MSDN Verwenden der isolierten Speicherung 2 2 5 Design und Implementierung der NET Generics Wer sich ausf hrlicher mit der Implementierung der Generics Parametric Polymorphism in der CLR auseinander setzen m chte dem sei nachfolgender Artikel f r den Start quasi als Entrypoint ans Herz gelegt Design and Implementation of Generics for the NET Common Language Runtime PDF 134 KB Weiters empfiehlt sich der MSDN Artikel Introducing Generics in the CLR Und zum Schluss noch ein Link der in die Generics Programmierung noch ein wenig Licht bringt Generics C Programming Guide Wer jetzt noch immer nicht genug
114. al Pll oo ay Sag bake gene ee riai irme dc a heated i Abbildung 49 Hyperlinks in GridView 3 NET BlogBook Ausgabe 4 Das Ergebnis ist die Anzeige des Inhalts als HyperLink Die Anzeige der Daten auf der Detailseite bernimmt das DetailsView Control in Verbindung mit dem SqlDataSource Control Die Url zur Detailseite wurde um den Parameter id erg nzt einem sog QueryString welcher den zu ladenden Datensatz angibt Das SqlDataSource Control muss so Konfiguriert werden dass dieser Parameter an die Datenbank weitergereicht und das Ergebnis somit eingeschr nkt wird Im Schritt Configure the Select Statement ffnet man hierzu den WHERE Dialog und legt einen entsprechenden bergabeparameter an Abbildung 50 Hyperlinks in GridView 4 Wird diese Seite mit dem ID Parameter aufgerufen erh lt man als Ergebnis den Inhalt des Datensatzes Ohne diesen Parameter bleibt die Anzeige leer In diesem Fall empfiehlt es sich zus tzlich eine Abfrage zu implementieren und eine Meldung auszugeben oder die Anforderung per Response Redirect umzuleiten Den Download des Beispielprojekts findet man hier 2 4 57 ASP NET Publish einer Website aus der Konsole _ command line Im Zuge eines automatisierten Deploymentprozesses m chte man eventuell eine vorkompilierte Version der ASP NET Anwendung in ein bestimmtes Verzeichnis generieren lassen Hierf r kann das Tool aspnet_compiler exe welches seit dem NET Framework 2 0 verf gbar ist verwend
115. alisieren kann Hier bietet sich ein Meta Refresh an welcher im HEAD Tag der Seite hinzugef gt werden muss lt meta http equiv refresh content 5 URL http www asp net gt Verwendet man allerdings eine MasterPage muss dieser HIML Tag dynamisch hinzugefugt werden ansonsten ware er auf allen Seiten aktiv Hierfur habe ich eine kleine Methode geschrieben private void AddMetaReferesh int time string url HtmlGenericControl metaRefresh new HtmlGenericControl meta metaRefresh Attributes Add http equiv refresh metaRefresh Attributes Add content time URL url Master Page Header Controls Add metaRefresh Nachdem eine Instanz der HtmlgenericControl Klasse erstellt und die verschiedenen Attribute zugewiesen wurden wird das Control dem Header der MasterPage hinzugef gt Das Ergebnis ist ein dynamisch hinzugef gter Meta Refresh Den Download des Beispielprojekts gibt es hier 2 4 19 Server MapPath in Session_End M chte man die Methode Server MapPath im Session End Event der global asax Datei verwenden erh lt man eine Object reference not set to an instance of an object Exception Was zun chst ein wenig verwirrend ist hat einen ganz einfachen Hintergrund Die Klasse HttpContext welche eine Instanz der Klasse HttpServerUtility und somit die Methode MapPath zur ck gibt ist null NET BlogBook Ausgabe 4 Der Grund hierf r ist dass der HttpContext nur Request bezogen zur Verf gung ge
116. as bergebene Steuerelement wird auf den Stack gelegt Die darauffolgende Schleife durchl uft den Stack solange solange sich Elemente darauf befinden Per Pop wird immer ein Steuerelement vom Stack genommen und die Eigenschaft Name berpr ft Danach werden alle Steuerelemente aus der Controls Auflistung auf den Stapel gelegt und ebenfalls durchlaufen Dies geschieht ebenfalls so lange bis das gew nschte Steuerelement gefunden wurde oder sich keine weiteren Elemente mehr auf dem Stapel befinden Ein kleiner Testfall wurde durch ein dynamisches Anlegen von Steuerlementen geschaffen Panel currentPanel new PaneLl this Controls Add currentPanel for int i Uf 1 lt 4 244 Panel p new Panel for tink Ze i2 lt 80 22 Label 1 new Label p Controls Add l currentPanel Controls Add p currentPanel p Button btnl new Button btnl Name buttonl currentPanel Controls Add btnl Danach wurden die unterschiedlichen Varianten mittels Stopwatch gemessen Hier das Ergebnis NET BlogBook Ausgabe 4 zahlen in Millisekunden Erster Durchlauf Recursively 4 IRecursively 1 Folgende Durchl ufe Recursively 1 IRecursively 0 Die zahlen wirken auf den ersten Blick nicht sehr spektakul r Zu beachten ist jedoch dass die Beispielrekursion recht klein ist und wenig Aufwand verursacht In der Realit t sind viele Rekursionen meist aufw ndiger wodurch sich der Geschwindigkeitsunterschied v
117. ateien kopieren 3 Altes Verzeichnis l schen Hierzu habe ich die Funktion CopyFiles geschrieben public static void CopyFiles string strSourceFolder string strDestinationFolder string strRestrictions Kopiert alles Dateien aus einem Verzeichnis in das andere Es k nnen auch Einschr nkungen z B aspx bergeben werden if strDestinationFolder Substring strDestinationFolder Length 1 1 strDestinationFolder DirectoryInfo dir new DirectorylInfo strSourceFolder FileInfo files dir GetFiles strRestrictions foreach FileInfo file in files NET BlogBook Ausgabe 4 file CopyTo strDestinationFolder file Name true 2 4 37 ASP NET HttpWebRequest und Timeout Problem Bis dato habe ich ja noch nicht viel mit ASP NET gemacht und muss daher auf die eine oder andere T cke erst kommen Da ich mich beruflich nun verst rkt damit besch ftigen muss wird wohl meine ASP NET Kategorie ein wenig aufgef llt werden Nun jedoch zum eigentlichen Thema Wer via ASP NET WebRequests aufbaut kann eventuell auf das Problem eines Timeouts sto en Meist beim zweiten Aufruf erfolgt ein Timeout Des R tsels L sung liegt darin die dazugeh rigen Response Objekte zu schlie en Vergisst man ein Response Close kommt es eben zum genannten Timeout Problem Also immer brav darauf Acht geben 2 4 38 Probleme mit WebUIValidation js Wer nach dem Deployment einer ASP NET Anwendung oder bei der Ent
118. atible anonyme Typen Edit Enterprise Library Configuration NLOG Trace IBCs 1g ee ee een VOUDIO TF AGIAN nee nenn E ie Matrix Test Game Mehrzeiliges Editieren Progressbar im Skype Stil Bilder im GriedView 1 Bilder im GridView 2 Mehrere CheckBox Controls markieren Wirklich l schen im DetailsView 1 Wirklich l schen im DetailsView 2 Login Control ohne ReturnUrl Custom Controls und Intellisense Wirklich l schen im GridView 1 Wirklich l schen im GridView 2 Wirklich l schen im GridView 3 PopUp per Response Redirect 022022022020 20 0en nennen nenn Readonly Datensatze im GridView 1 Readonly Datensatze im GridView 2 Captcha erstellen Caching von Bildern verhindern GridView und XmIDataSource Reservierte ASP NET Projektnamen Captcha Variante Weitere Captcha Variante Ajax Auto Complete Ajax Progress Gefahrlicher Code 1 Gefahrlicher Code 2 Gefahrlicher Code 3 Custom Control ViewState GID SLs icsssnaccacnsscnteanenseanansncsdansnsnatanaausdinneesdieensddnsanineescranees ASP NET Unterschiedliche Programmiersprachen IVIACHIMNEKCY GENET AION une ee ASP NET LifeCycle NET BlogBook Ausgabe 4 Aufgabenplane ee ee nn eee ae Zellen in GridView einfarben Theme Auswahl Hyperlinks in GridView 1 Hyperlinks in GridView 2 Hyperlinks in GridView 3 ccccceeccceececeeeeceeeseeeseeeeeseeeseeeseeeeeeeeeeees Hyperlinks in GridView 4 0022200202002000 nano nnnnnnnne nenne
119. auf das Feld ID welches lediglich zur Identifizierung der Datens tze dient werden alle anderen per Bound bzw TemplateField referenziert Au erdem muss das Feld locked in Form einer CheckBox angezeigt werden damit Datensatze manuell gesperrt werden konnen In diesem Beispiel ist es nicht moglich einen Datensatz zu bearbeiten sobald er gesperrt ist Demnach ist es auch nicht moglich einen Datensatz wieder zu entsperren lt asp GridView ID GridViewl runat server AllowSorting True AutoGenerateColumns False DataSourceID SqlDataSourcel Width 423px DataKeyNames ID OnRowDataBound GridViewl RowDataBound gt lt Columns gt lt asp BoundField DataField Name HeaderText Name SortExpression Name gt lt asp BoundField DataField City HeaderText City SortExpression City gt lt asp TemplateField HeaderText locked SortExpression locked gt lt EditItemTemplate gt lt asp CheckBox ID CheckBox1 runat server Checked lt Bind locked gt gt lt EditItemTemplate gt lt ItemTemplate gt lt asp CheckBox ID CheckBox1 runat server Checked lt Bind locked gt Enabled false gt lt ItemTemplate gt lt asp TemplateField gt lt asp CommandField ShowDeleteButton True ShowEditButton True gt lt Columns gt lt asp GridView gt Wichtig ist nun das Attribut OnRowDataBound Dieses gibt an welche Methode aufgerufen wird sobald das Event OnRowDataBound vom GridView gestartet wird
120. ayoutTransform st Rotationsfaktor public void sliderRotate ValueChanged object sender RoutedEventArgs e i RotateTransform rt new RotateTransform sliderRotate Value this btnTest RenderTransform rt Das Ergebnis sieht dann wie folgt aus NET BlogBook Ausgabe 4 Ei zoom and Rotate Ioj xj len Abbildung 52 WPF Rotation 2 Dies kann jetzt nicht nur auf einen Button angewandt werden sondern auf die gesamte Oberfl che oder auch nur einzelne Bereiche Der dahinter liegende XAML Code etc ist im gesamten Projekt enthalten welches zum Download bereit steht Download WPF Rotation Test Beispiel 2 6 3 Windows Presentation Foundation Teil 1 Einf hrung Der erste Teil einer Tutorials Reihe gibt eine kleine Einf hrung in das Thema Windows Presentation Foundation ehemals Avalon und beschreibt die wichtigsten Punkte Zudem wird anhand einer sehr simplen Testanwendung gezeigt wie eine solche entwickelt werden kann Der n chste Teil dieser Serie wird weiter in die Tiefe gehen und Hintergr nde n her erl utern Windows Presentation Foundation Teil 1 Einf hrung PDF 2 6 4 Windows Workflow Foundation Web Workflow Approvals Starter Kit NET BlogBook Ausgabe 4 Microsoft hat ein Starter Kit veroffentlicht welches die Verwendung der Windows Workflow Foundation in Web Anwendungen zeigen soll This starter kit is a Visual Studio 2005 project that demonstrates using Windows Workflow Foundati
121. b Config Merge into one Assembly ASP Net Version 2 0 0727 Abbildung 66 ASP NET Deployment Tool 2 Auch wenn das Programm selbst noch mit kleinen Bugs zu kampfen hat ist es eine sehr gute Alternative zum Visual Studio integrierten Deployment Mehr Informationen und den Download gibt es unter http www sunlab de Tools aspx 5 12 Lokalisierung des Community Servers NET BlogBook Ausgabe 4 Nach erfolgreicherer Installation des Community Servers folgt in den meisten Fallen die Lokalisierung Zum Gluck gibt es bereits ein deutsches Language Pack deren Installation hier kurz erlautert werden soll Den Download des Language Packs fur die Version 2 1 findet man auf den offiziellen Seiten im Downloadbereich Der direkt Link lautet http communityserver org files folders language _ Allerdings ist hierf r eine Registrierung notwenig In dem herunter geladenen ZIP Archiv findet man neben der ReadMe txt den Order de DE in dem die Sprachdateien enthalten sind Dieser Order muss per FTP in den Ordner Languages des Community Server Webs bertragen werden Anschlie end sollte man von folgenden Dateien ein Backup anlegen communityserver config Languages languages xml web config Zun chst muss Datei Languages languages xml abge ndert werden Folgende Zeile muss in die lt root gt Section eingef gt werden lt language name German key de de gt Diese Zeile gibt an dass nun eine weitere Sprache in dem Ordner de
122. be 4 2 regedit starten 3 HKEY CURRENT USER Software Microsoft VisualStudio 8 0 Csharp Options Editor 4 Neuer Eintrag Neuer DWORD Wert 5 Dem Eintrag den Namen OpenAllVenusFilesOnRefactor verpassen und den Wert auf 0 belassen Nach einem Neustart sollte nun das Refactoring deutlich schneller laufen ASP NET Pages Inline asmx und asax Code werden nicht mehr ber cksichtigt Wer die Startzeit von Visual Studio 2005 verbessern m chte sei auf den Eintrag Visual Studio 2005 schneller starten verwiesen Und noch ein Hinweis Refactoring gibt es auch f r Visual Basic 2005 Hierf r einfach Refactor verwenden 3 19 Visual Studio 2005 Region Blocke per Tastatur auf und zuklappen Regions sind eine sehr nette Sache m chte man Methoden Eigenschaften Attribute oder andere zusammengehorigen Teile einer Datei in Bereiche unterteilen Wer nun aber m glichst wenig zur Maus greifen m chte stellt sich sehr schnell die Frage wie denn Regions Bl cke per Tastatur auf bzw zugeklappt werden k nnen STRG M STRG M Und schon wieder ein Griff weniger zur Maus Dass es doch tats chlich immer wieder Tastenkombinationen gibt die man st ndig vergisst 3 20 Visual Studio 2005 Anpassung Class Template Im Beitrag Visual Studio Anpassung Class Templates habe ich bereits beschrieben wie die Klassen Templates wird verwendet beim Anlegen einer neuen Klasse an eigene Bed rfnisse angepasst werden k nnen Hier nun wie die
123. bereits hier hier und hier berichtet Was aber bis dato gefehlt hat war eine Aussage zum Thema Sicherheit bei der Behandlung von Ausnahmen Was also hat das Behandeln von Ausnahmen mit Sicherheit zu tun In den meisten F llen wird bei einer Exception der Inhalt der Eigenschaft Message zur ckgegeben und n der Hauptanwendung egal ob Windows Forms Web WPF zur Anzeige gebracht Dadurch werden jedoch in manchen F llen Daten zum Vorschein gebracht die besser im Verborgenen bleiben sollten Nehmen wir das Beispiel Webanwendung Gehen wir weiters davon aus dass diese eine Verbindung zu einer Datenbank ben tigt Nun wird hier im System ein ConnectionString hinterlegt nat rlich gilt es auch diesen abzusichern Nun kann folgendes Problem auftreten Die Anmeldung auf den Datenbank Server schl gt fehl Daraufhin wird eine Exception geworfen welche dann m User Interface angezeigt w rd entsweder per eigener Fehlerseite oder berhaupt als Exception Aus dem Message Text st nun ersichtlich dass die Anmeldung scheitterte und mit welchem User die Anmeldung versucht wurde Ein potentieller Angreifer hat nun ein leichteres Spiel da er einen User f r die Datenbank definitiv kennt Dies ist nur ein einfaches Beispiel Aus diesem Grunde sollten Exception Messages niemals direkt an den User weitergegeben werden Folgende Vorgehensweise st hier empfohlen l Jede Exception abfangen 2 Exceptions in eine Log Datei loggen Bei Webanwendu
124. bgefragt werden Die zweite Variante nennt sich XLINQ und ermoglicht die Abfrage von XML Daten Und so sieht zum Beispiel eine DLINQ Abfrage aus public void Tang i List products GetProductlist var productNames from p in products select p ProductName Console WriteLine Product Names foreach var productName in productNames Console WriteLine productName Weitere Informationen zu LINQ sind auf der LINQ Project Homepage zu finden 5 11 ASP NET Deployment Tool NET BlogBook Ausgabe 4 Visual Studio 2005 bietet von Haus aus schon sehr gute Moglichkeiten eine ASP NET Anwendung zu veroffentlichen Allerdings gibt es keine Moglichkeit ein bestimmtes Deployment Schema zu speichern oder festzulegen Das ASP NET Deployment Tool von Andreas Kraus bietet genau dieses Feature Hat man erst mal ein Projekt angelegt gibt es verschiedene mogliche Optionen je BS MET 0G peparen Sool yeftings 1 carma Suna Fa Tr yh Abbildung 65 ASP NET Deployment Tool 1 Neben dem einfachen lokalen Deployment ist es m glich die Dateien per Netzwerkpfad oder FIP zu ver ffentlichen Au erdem kann eingestellt werden ob das Zielverzeichnis gel scht die Web Config bertragen oder alle Assemblies in ein einziges zusammengefasst werden sollen ASP NET 2 0 Deployment Tool v1 9 Deploy Local Copy to Network Copy to FTP i Bin only Erase Dest Deploy First E We
125. bjeer sender EventArgs j FlementHost host new ElementHost LoginControl lc new LoginControl host Child lc host Dock DockStyle Fill this Controlse Add nost Bei einem Start der Anwendung sollte nun das WPF Control sichtbar sein Wichtig hierbei ist dass das Host Element via DockStyle Fill am Windows Formular ausgerichtet werden muss 2 6 6 WPF Serie Teil 1 Die Windows Presentation Foundation aus der Sicht eines Unternehmens Wie bereits angek ndigt werde ich hier eine Umsetzungs Serie zum Thema WPF starten Im Zuge dieser Serie werden einige interessante Themen besprochen Eine Einf hrung zum Thema Windows Presentation Foundation werde ich an dieser Stelle nicht bieten hierf r m ssen die beiden von mir erstellen Tutorials zu diesem Thema reichen NET BlogBook Ausgabe 4 Windows Presentation Foundation Teil 1 Einfuhrung Windows Presentation Foundation Teil 2 XAML und Layouts Vielmehr mochte ich hinterfragen welchen Stellenwert WPF in Unternehmen hat und welche Uberlegungen mitspielen um auf WPF umzusteigen Auch heute noch WPF gibt es nun ja schon langer wird die Windows Presentation Foundation als neue Technologie gehandelt Beispiele gibt es dazu ja bereits einige und durch Silverlight hat XAML sicherlich einen neuen Hype erfahren Dennoch scheuen sich sehr viele Unternehmen diese Technologie einzusetzen Warum ist dem so Hier spielen sicherlich mehrere Faktoren eine wichtige Rolle
126. blemen wenn die Zertifikate nicht verifiziert werden k nnen Diesem Problem kann man aus dem Weg gehen Dazu einfach die folgende Klasse implementieren public class TrustAl lCertificaterolicy System Net ICertificatePolicy public TrustAllCertificatePolicy 2 public bool CheckValidationResult ServicePoint sp X509Certificate cert WebRequest req int problem return true Danach ist die Policy nur mehr zu aktivieren Dies kann folgenderma en erreicht werden System Net ServicePointManager CertificatePolicy new TrustAllCertificatePolicy Und schon sollte der Zugriff auf diese Webseiten funktionieren 2 2 32 C Beginner Enumeratoren vs Flags Enumeratoren sind ja den meisten C Entwicklern durchaus bekannt Flags allerdings werden nicht sehr oft eingesetzt Diese Erfahrung habe ich in diversen Foren gemacht und daher m chte ich dazu ein paar Worte verlieren Enumeratoren Ein Enumerator kann bestimmte vordefinierte Werte enthalten und ist vor allem f r Aufz hlungen sehr praktisch Ein Beispiel w re hierf r der Color Enumerator Dieser erm glicht das einfache Ausw hlen von Farbwerten Ein eigenes Beispiel w rde wie folgt aussehen public enum TestEnum EnumValueO EnumValuel 0 1 NET BlogBook Ausgabe 4 Fur einzelne Items kann hier ein bestimmter Wert definiert werden muss jedoch nicht Standardm ig repr sentiert ein Enumerator einen Int32 Value und beginnt bei 0 au er ander
127. blishing Wizard 5 cccccececececeeeceeeeeeeeseeeeeeeeeeeeeeees Database Publishing Wizard 6 Database Publishing Wizard 7 Source code line COUNTEL c cccccccccccccccccccuccuucuuccueueuuucuuevauuusuneeunenas Bulk Inserts 1 Bulk Inserts 2 SO OCIS TR COU SC ia ea ee een NET BlogBook Ausgabe 4 Abbildung 44 Abbildung 45 Abbildung 46 Abbildung 47 Abbildung 48 Abbildung 49 Abbildung 50 Abbildung 51 Abbildung 52 Abbildung 53 Abbildung 54 Abbildung 55 Abbildung 56 Abbildung 57 Abbildung 58 Abbildung 59 Abbildung 60 Abbildung 61 Abbildung 62 Abbildung 63 Abbildung 64 Abbildung 65 Abbildung 66 Abbildung 67 Abbildung 68 Abbildung 69 Abbildung 70 Abbildung 71 Abbildung 72 Abbildung 73 Abbildung 74 Abbildung 75 Abbildung 76 Abbildung 77 Abbildung 78 Abbildung 79 Abbildung 80 Abbildung 81 Abbildung 82 Abbildung 83 Abbildung 84 Abbildung 85 Abbildung 86 Abbildung 87 Abbildung 88 Abbildung 89 Abbildung 90 275
128. c Parameter test TestClass tc new TestClass Thread t new Thread new ThreadStart tc Start Start 2 2 36 Connectionstrings unter C VB NET Immer wieder wird nach den richtigen Connectionstrings f r die unterschiedlichsten Datenbank Systeme gefragt Daher mein Tipp einfach auf http www connectionstrings com nachsehen Da sollte das meiste zu finden sein Und wie wird dieser dann in C bzw VB NET verwendet Gut hierf r kann ich ein kleines Beispiel geben gilt f r den Microsoft SQL Server CH NET BlogBook Ausgabe 4 using System Data SqlClient SqlConnection conn new SqlConnection conn ConnectionString Data Source local Tnitial Catalog MyDatabaseName Integrated Security SSPI conn Open VB NET Imports System Data SqlClient Dim conn As SqlConnection New SqlConnection Conn Connectionstring Data source local 7 amp _ Initial Catalog MyDatabaseName amp _ Integrated Security SSPI oSQLConn Open Dies gilt nun fur den Microsoft SQL Server der lokal installiert ist Fur einen SQL Server der auf einem anderen Rechner installiert ist muss lediglich der Connectionstring ausgetauscht und angepasst werden Die entsprechenden Connectionstrings sind im oben angef hrten Link zu finden Zusatzinformation Die Beispiele funktionieren sowohl bei einem SQL Server 2000 als auch beim SQL Server 2005 2 2 37 Strings unter NET Dieser Eintrag soll auff hren w
129. ch nicht erstellt wurden F r die einzelnen Tests wird die Spezifikation der Methoden Klassen etc herangezogen jedoch nicht die dahinter liegende Implementierung funktionsorientiertes Testen Das Ziel besteht darin die Software hinsichtlich der Spezifikationen zu pr fen Diese geben Schnittstellen Definitionen und Ergebnisse vor welche von den einzelnen Komponenten einzuhalten sind und entsprechend gepr ft werden m ssen Ein Black Box Test kann jedoch sehr aufw ndig sein und birgt auch ein weiteres Problem in sich In der Softwareentwicklung werden Komponenten st ndig weiter entwickelt Daraus ergeben sich neue Funktionalit ten die ebenfalls getestet werden m ssen Diese Tests sind jedoch in den Black Box Tests nicht enthalten da diese bereits vor der Komponente entwickelt werden Erfolgreiche Testl ufe bedeuten daher jedoch nicht zwangsweise dass die gesamte Funktionalit t der Komponente zu einem sp teren Zeitpunkt getestet wurde sondern lediglich die urspr ngliche Spezifikation Zus tzlich gibt es noch weitere Verfahren e Grey Box Test e White Box Test 4 3 6 Unit Tests mit Visual Studio NET Einfuhrung und Ausblick NET BlogBook Ausgabe 4 Bei fast allen Fragestellungen in diversen Foren gibt es Fragen zu Fehlern die auf dreierlei Arten auftreten 1 Mangelndes Studieren der zur Verfugung stehenden Quellen Dies inkludiert nicht nur diverse Artikel die es im Internet zu finden gibt ein Beispiel hier
130. chluss gibt es einen Hinweis von mir warum ich pers nlich Kopier Konstruktoren nicht verwenden w rde public class Car NET BlogBook Ausgabe 4 private int maxSpeed 200 private Color color Color Nnite private Driver driver gull public int MaxSpeed get return This Maxspeca Ber this speed value Public Color Color Ser 1 zerurn Chis Seller j ser This color valus public Driver Driver get zeruri This driver j ser 1 this driver value public Cari 7 public Car Car car Chie COlOr taro this MaxSpeed car MaxSpeed Driver d new Driver d Firstname car Driver Firstname d Lastname car Driver Lastname this Bewer dj Es gibt eine Uberladung des Konstruktors welche ein Objekt vom Typ Car entgegen nimmt Hierzu wird ein Deep Copy durchgef hrt und die Daten entsprechend kopiert Dies klingt ja prinzipiell recht einfach und auch ganz gut Was daran passt also nicht Nun man gehe von der Verwendung in einem Framework welches anderen Entwicklern zur Verf gung gestellt wird aus oder davon dass sich der eigentliche Entwickler einige Wochen sp ter nochmals an dieses Projekt setzt Hier sieht er beispielsweise folgenden Code Car c new Car Driver d new Driver d Firstname Norbert d Lastname Eder c MaxSpeed 250 c Color Color Blue c Driver d Car c2 new Car c Auf den ersten Blick ist nicht
131. cht Neben der kostenlosen Express Edition ist es m glich eine Standard Professional oder Enterprise Version mit mehr Features zu erwerben Eine genaue bersicht der Versionen findet man unter der URL https store telligent com FeatureMatrix aspx Edi In diesem Artikel wird die Version 2 1 61025 2 des Community Servers f r ASP NET 2 0 per Web installiert Grunds tzlich ist hierf r zun chst nur der Zugriff auf das Web per FTP n tig Der Download des Community Server ist nach erfolgreicher Anmeldung unter der URL http www communityserver org m glich Neben der Installation per Web Oberfl che ist es ebenfalls m glich entsprechende Rechte vorausgesetzt mit dem Windows Installer die zuk nftige Community einzurichten Vorbereitung Nachdem der Download erfolgreich war und das ZIP Archiv entpackt wurde findet man zwei Ordner mit den Namen Web und SqlScripts vor In diesem Beispiel wird eine neue Community eingerichtet somit kann der Inhalt des Ordners SqlScripts vernachl ssigt werden Aktualisiert man eine vorhandene Installation findet man dort die entsprechenden Scripte f r die Aktualisierung der Datenbank Zun chst muss in der Datei web installer default aspx die Variable INSTALLER ENABLED auf true gesetzt werden Diese Einstellung aktiviert die Installation per Web Oberfl che 9001 INSTALLER ENABLED true Anschlie end kann der Inhalt des Web Ordners per FTP auf den gew nschten Server bertragen werden Zus
132. ct Di Pro 205 120 59 Sheet bject Di Pro 134 103 AY User D Frol 179 104 51 AoleM anager D FProl 1r2 96 46 Sheetltem Di Pro 167 94 51 Campaign D Froj 152 g5 47 ImageSheet bject D Fro 152 o5 47 D ataT racking Li Pro 146 3 51 Sheet byectManager Di Pro 143 Jz 35 Userbl anager D FProl 141 fo 44 AoleSgiD ataLayer D Pro 133 pg 47 UserSqiD ataLayer Di Pro 130 fall 44 ErentLog DP ro 127 be 44 Datal racking anager DP ro 123 fe 35 Fartnerbl anager D Froj 122 65 a0 Partners qlo ataLayer De Pro 117 TextFormatflanager D Frol 116 LampagnManager L Fro 114 PrintT ypebl anager Di Pro 114 Applontext y D Frol 112 CN O0 0000000000000 00000000000 00000 0 Only Code with Total Lines Only Code Comments Comments Blank Hon Blank H 7 294 4 107 2 304 baa 5 461 100 gE 3er 0 114 oo Filter Solution v 3 Ctrl Click headers for multiple sort Abbildung 58 Project Line Counter NET BlogBook Ausgabe 4 Dieses Add In fur VS2003 VS2005 und VC 6 0 kann die Informationen entweder fur die gesamte Solution oder jedes einzelne Projekt anzeigen Zusatzlich ist es moglich die Ergebnisse als CSV oder XML Datei zu exportieren Zumindest f r einen kurzen berblick reicht das Tool v llig aus zudem ist es kostenlos http www wndtabs com download func fileinfo id 17 3 12 Zur korrespondierenden Klammer springen Durch Zufall bin ich he
133. ctual VirtualPath virtualPath Boolean permitNull 163 System Web CachedPathData GetConfigPathData String configPath 382 System Web CachedPathData GetConfigPathData String configPath 243 System Web CachedPathData GetApplicationPathData 68 271 NET BlogBook Ausgabe 4 System Web CachedPathData GetVirtualPathData VirtualPath virtualPath Boolean permitPathsOutsideApp 3385711 System Web Configuration RuntimeConfig GetLKGRuntimeConfig VirtualPath path 189 Der User mit dem dein IIS l uft hat keinen Zugriff auf die IIS Datenbank Entweder du stellst den User um mit dem der IIS l uft oder du f hrst folgenden Befehl im Verzeichnis Systemroot Microsoft NETFrameworkv2 0 50727 aus aspnet regiis ga lt WindowsUserAccount gt 8 3 C Google Web API schon getestet Als ersten Schritt muss man sich die Google API unter http www google com apis downloaden und sich einen Account erstellen Nach dem Account bekommt man eine Google ID zugesendet mit der 1000 Requests pro Tag durchgef hrt werden k nnen Nun als n chsten Schritt einfach ein neues Projekt im Visual Studio erstellen Nun eine Web Referenz auf http api google com GoogleSearch wsdl erstellen und dem Teil am besten den Namen Google geben Nun ist das wildeste erledigt Eine Abfrage sieht dann in weiterer Folge so aus Google GoogleSearchResult r s doGoogleSearch googleID keywords ip 10 false oe false ue ie la E int estResults r estimated
134. d Console WriteLine sqlReader ID sglReader amp lsset Ssqllonn Close i Dieser Code erfullt seinen Zweck Verbindung zur Datenbank wird geoffnet Daten werden gelesen Verbindung zur Datenbank wird geschlossen Was aber passiert mit der Verbindung wenn wahrend des Lesens der Daten eine Exception auftritt Sie bleibt ge ffnet zumindest solange bis der GarbageCollector die Verbindung irgendwann schlie t Tritt dieser Fehler nun fters auf verringert sich die Anzahl der m glichen Verbindungen im Connection Pool bis eine Exception ausgegeben wird H ufig wird jetzt ein Try Catch Finally Konstrukt in die Methode eingebaut NET BlogBook Ausgabe 4 string sql SELECT FROM Tabellel OdbcConnection sqlConn new OdbcConnection OdbcCommand sqlCmd new OdbcCommand sql sqlConn try sqlConn Open OdbcDataReader sqlReader sqlCmd ExecuteReader while sqlReader Read int id Convert ToInt32 sqlReader Name sqlReader Close t rally sqlConn Close Der Code wirkt jedoch un bersichtlich und oft wird im finally Abschnitt trotzdem das Schlie en der Verbindung vergessen bersichtlicher Code der trotzdem im Falle eines Fehlers die Verbindung schlie t erh lt man mit sog scopes Ein scope Ist nichts anderes als ein in geschweifte Klammern eingeschlossener Codeabschnitt Das Objekt welches die Verbindung zur Datenbank aufbaut ist also nur innerhalb dieses
135. d SqlConnection sqlConn new SqlConnection connStringBuilder ToString Mit Hilfe des SgiConnectionStringBuilder Ist es m glich einfach einen syntaktisch korrekten ConnectionString Zu erstellen woraus in weiterer Folge ein Connection Objekt gebildet werden kann Ein eigenes Beispiel Nun sehen wir uns anhand eines eigenen Beispiels die Implementierung des Builder Patterns an Grundlage bilden Adressdaten die in einer XML Datei vorliegen und importiert werden m ssen Den Part des Importierens ersparen wir uns Die erstellten Objekte werden lediglich in eine Liste gelegt und anschlie end per ToString ausgegeben NET BlogBook Ausgabe 4 Builder IParser ABuilder EI AParser Abstract Class Abstract Class Methods Methods Build Parse AddressBuilder A AddressParser Class Class ABuilder AParser A builder Fields Methods a _city AddressParser a _country Parse aP _ street a _streetnumber a _zip amp Properties m city Country Street ih a StreetNumber Zip Methods Build ResetData r rn r Wie in der Abbildung zu sehen ist besteht diese Implementierung des Builder Patterns aus zwei wichtigen Teilen AddressBuilder AddressParser Der Parser selbst ist kein echter Bestandteil des urspr nglichen Builder Patterns wurde jedoch in diesem Beispiel zum Parsen der Adressdaten herangezogen und in das Pattern integriert um die Zust ndigkeiten
136. d StartPr csesst NET BlogBook Ausgabe 4 ServiceController sc new ServiceController processName if sc null Be 8Larti Public void StopProcess ServiceController sc new ServiceController processName if sc null amp amp sc CanStop SC cop gt 2 5 2 Webservice Methoden uberladen In modernen Programmiersprachen k nnen Methoden uberladen werden Somit ist es m glich verschiedene Funktionalit ten abzubilden ohne einen weiteren Methoden Namen zu erstellen public string HelloWorld i return Hello public string HelloWorld string yourName return Hello yourName M chte man diese Methoden allerdings f r einen Webservice zur Verf gung stellen endet dies mit einer unsch nen Fehlermeldung Both X and Y use the message name Z Use the MessageName property of the WebMethod custom attribute to specify unique message names for the methods Der Grund hierf r ist dass Methodennamen innerhalb eines Webservice immer eindeutig sein m ssen Dieses Problem kann mit dem Attribut MessageName gel st werden WebMethod MessageName HelloWorld public string HelloWorld return Hello WebMethod MessageName HelloWorldWithName public string HelloWorld string yourName return Hello yourName Nun muss der Umstand einen weiteren Methodennamen zu kreieren allerdings wieder in Kauf genommen werden NET BlogBook Ausgabe 4 2 6 Win
137. db Test Abbildung 78 Database Publishing Wizard 3 242 NET BlogBook Ausgabe 4 E Datenbankver ffentlichungs Assistent Ausgabespeicherort ausw hlen Wo m chten Sie die Datenbank ver ffentlichen An freiaeaebenen Hostinaanbieter ver ffentlichen Abbildung 79 Database Publishing Wizard 4 An dieser Stelle k nnte der angesprochene Hostinganbieter eingetragen werden E Datenbankverottentlichungs Assistent Veroffentlichungsoptionen Legen Sie vor dem Ver ffentlichen der Datenbank erweiterte Optionen fest Optionen Be 13 El Allgemein Schema qualifizieren True Skript f r Zieldatenbank SQL Server 2005 Vorhandene Objekte im Skript ldsch True Zu ver ffentlichende Datentypen schema und Daten Zu ver ffentlichende Datentypen Generiert ein Skript das nur Schema nur Daten oder aber Schema und Daten enth lt Abbildung 80 Database Publishing Wizard 5 243 NET BlogBook Ausgabe 4 Als Zieldatenbank k nnen SQL Server 2000 und SQL Server 2005 ausgew hlt werden Bei den Datentypen k nnen Schema und Daten Schema bzw Daten eingestellt werden E Datenbankverottentlichungs Assistent Zusammenfassung uberprufen Die im Assistenten ausgew hlten Optionen berpr fen berpr fen Sie Ihre Auswahl El Server local SQLExpress Datenbank Ziel Einzelne Datei CAtemp sql_publishing script sql E Optionen B Allgemein Schema qualifizieren True Skript f r
138. de vorhanden ist M chte man die Standardsprache des Community Server auf Deutsch festlegen muss eine Zeile in der Datei communityserver config ge ndert werden Das Attribut defaultLanguage des Core Nodes enth lt per default den Wert en US Dieser muss mit dem Wert de DE ersetzt werden lt Core defaultLanguage de DE Nun muss nur noch die Ausgabe der Uhrzeiten und des Datums angepasst werden da diese weiterhin im US Format ausgegeben werden Hierf r ist es n tig die Web config Zu ndern Falls folgende Zeile nicht bereits vorhanden ist muss sie eingef gt ansonsten abge ndert werden Wichtig ist die Platzierung in der lt system web gt Section lt globalization culture de DE gt lt globalization gt Nachdem die Web Config gespeichert wurde ist die Lokalisierung abgeschlossen und der Community Server sollte nun die deutsche Sprache verwenden 5 13 Community Server Installation HowTo NET BlogBook Ausgabe 4 gt gt telligent yo community Tak Abbildung 67 Community Server Installation 1 Sucht man eine ASP NET Foren Software trifft man schnell auf dem Community Server der von der Firma telligent entwickelt wurde Die Feature Liste des Community Server ist lang Nach der Installation erh lt man nicht nur ein einfaches Forum sondern vielmehr eine Kommunikations Plattform mit zus tzlicher Unterst tzung von Weblogs und Image Galleries also alles was eine moderne Community Site ausma
139. delta 0 Private int deltay 0 public MoveableBaseControl InitializeComponent private void MoveableBaseControl MouseDown object sender MouseEventArgs e _isMo oving truie _QSltax X gellar 2 73 private void MoveableBaseControl MouseuUp object sender MouseEventArgs e _isMoving false private void MoveableBaseControl MouseMove object sender MouseEventArgs e iE 18Moving amp amp amp Button MouseButtons Lert this Location new Point this Loeation X X delta th1l2 L9SaE19n T 4 1 delta F Im Grunde passiert nicht viel Es wird lediglich festgehalten wann sich das Control bewegen soll und wann nicht MouseDown und MouseUp Bei einem MouseMove wird anschlie end die Position des Controls berechnet Zu beachten ist hier nur dass die MouseEventArgs die Position des Cursors innerhalb des Controls angibt und nicht auf Formular bzw Screen Basis Daher muss das Delta zum Rand des Controls beim MouseDown festgehalten werden um dies sp ter in die Berechnung einflie en zu lassen Dieses Control kann sozusagen als ein Basis Control verwendet werden Zum Test einfach in ein Projekt einbauen auf ein Formular ziehen Anwendung starten und mit der Maus ber das Formular bewegen 2 3 10 AutoScroll f r RichTextBox In der letzten Zeit wurde ich des fteren gefragt wie man denn eine RichTextBox dazu bringt automatisch zu scrollen sobald neuer Text hinzu
140. den welches allerdings nach dem deployen der Website nicht mehr zur Verf gung steht Brennan Stehling hat sich die M he gemacht und Control programmiert die genau f r diese Aufgabe gedacht sind Eine kurze Beschreibung und das Beispielprojekt findet man unter dieser URL Komischer weise funktioniert der Download des Zip Archives nur mit FireFox ansonsten erh lt man eine defekte Datei Eine Anleitung um das Web Seite Administration Tool im Web zu hosten gibt es im Weblog von Alex o B 2 4 12 Custom Controls per Web config registrieren Wie ich bereits in einem anderen Beitrag geschrieben hatte ist es moglich User Controls per Web Config zu registrieren und diese somit auf allen Seiten zu nutzen Nat rlich ist dies auch mit Custom Controls m glich Auch hier muss im Node Controls mit Hilfe des add Tags das Control hinzugef gt und somit referenziert werden Vorher sollte man dieses allerdings per Add Reference zum Web hinzugef gt haben lt pages gt lt controls gt lt add assembly MyCustomControl namespace MyCustomControl tagPrefix CC gt lt Jeontrols gt lt pages gt NET BlogBook Ausgabe 4 Naturlich steht jetzt auch wieder die Visual Studio Intellisense fur dieses Control zur Verf gung 18 lt div gt 11 lt c 9 big Is E blockquote 14 lt boc EH br 15 4 lt htmles button 16 lt 3 CC MyTextBox E3 dfn Abbildung 21 Custom Controls und IntelliSense Den Download d
141. den k nnen bzw nicht aktivieren k nnen der Dienst MSFTESQL wird nicht installiert und ist somit auch nicht verf gbar Abhilfe schafft die Installation des Microsoft SQL Server 2005 Express Edition with Advanced Services Service Pack 2 Hier ist nun alles dabei was man braucht Nein nicht ganz Das Microsoft SQL Server Management Studio Express Service Pack 2 darf auch nicht fehlen 7 19 Upgrade auf SQL Server 2005 Wer seine eigenen SQL Server 2000 auf 2005 updaten m chte oder dies f r einen Kunden tun muss der wird sicherlich gerne auf hilfreiche Ressourcen zur ckgreifen Hier zwei Links die f r Unterst tzung sorgen SOL Server 2005 Upgrade Technical Reference Guide 360 Seiten Lesespass zum Thema Ugrade auf SQL Server 2005 n allen Formen und Varianten mit m glichen Migrations Pfaden und vielen weiteren Informationen Microsoft SOL Server 2005 Upgrade Advisor Der Upgrade Advisor unterst tzt bei den vorzunehmenden Schritten und informiert dar ber Anzumerken sei Der Advisor unternimmt keine Anderungen an der bestehenden Konfiguration 270 NET BlogBook Ausgabe 4 8 1 Verwendete Ports von Microsoft Produkten Das ist zwar jetzt nicht das Kerngebiet meines WeWeblogs aber nachdem ich zuf llig auf diese bersicht gesto en bin m chte ich sie nicht vorenthalten da es vielleicht f r den einen oder anderen n tzlich sein k nnte Network Ports Used by Key Microsoft Server Products 8 2 115S Fehler F
142. den soll und wie die User Informationen lauten Beispielsweise w rde ein ConnectionString wie folgt aussehen Data Source Aronl Initial Catalog pubs User Id sa Password asdasd Die Data Source stellt den Computer dar auf dem der SQL Server l uft Zu achten ist hierbei dass der SQL Server 2005 mit einem Instanznamen angelegt wird welcher im ConnectionString entsprechend anzugeben ist da eine Verbindung sonst nicht aufgebaut werden kann Die Einstellung Initial Catalog beschreibt den Namen der Datenbank auf welche verbunden werden soll User Id ist der zu verwendende Username und Password sollte selbst sprechend sein Weitere Informationen zu den ConnectionStrings sind unter 1 zu finden In C sieht ein Verbindungsaufbau nun wie folgt aus SqlConnection conn new SqlConnection Data Source COMPUTERNAMESOLEXPRESS Initial Catalog DatabaseDemo User Id sa Password MyPassword conn Open conn Close In diesem Fall ist ein SQL Server 2005 Express installiert COMPUTERNAME stellt den Namen des Computers dar und SQLEXPRESS ist der Instanzname des SQL Servers Dieser Name wird im Normalfall bei der Installation eingegeben Ist nicht sicher wie dieser lautet dann kann dies in der Dienste Liste ausgelesen werden Dazu einfach die Dienste anzeigen lassen den SQL Server Dienst suchen in Klammer dahinter steht der entsprechende Instanzname Durch den obigen C Code kann man sich nun zur Datenbank verbinden F r das ffnen de
143. der Objekte sauber zu trennen public class AddressParser AParser AddressBuilder builder null public AddressParser IBuilder builder Builder Al reszBurlder builder 217 NET BlogBook Ausgabe 4 public override void Parse XmlNode data if data null amp 2 Builder i null builder ResetiData XmlNode xnStreet data SelectSingleNode street XmlNode xnStreetNumber data SelectSingleNode streetnumber XmlNode xnZip data SelectSingleNode zip XmlNode xnCity data SelectSingleNode city XmlNode xnCountry data SelectSingleNode country if xnStreet null builder Street znatreet InnerText if xnStreetNumber null bullder StreerNumber znstreetN nber InnerTezt int zip 0 if xnZip null Int 32 IrvParastixn21lB Innerlext out Zip bul lager zip 219 Lt lznl ry I mul builder City SncIty InnerTezt if xnCountry null Dullder Country znlcountry Innerlezt Der AddressBuilder selbst besitzt nun die Aufgabe das eigentliche Address Objekt zu erstellen und zur ck zu liefern public class AddressBuilder ABuilder private string Street null private String Sstreetnumoer null private int _zip private Zcr ng city moll private string country null public string Street ger Terur Thies Streel set this street value public string StreetNumber ger return this strestnumber ser
144. dows Presentation Foundation 2 6 1 Windows Presentation Foundation Teil 2 XAML und Layouts Im zweiten Teil der Tutorials Reihe ber die Windows Presentation Foundation werden die Themen XAML und Layouts behandelt So wird beschrieben was XAML genau ist und wof r es da ist Weiters wird gezeigt welche grundlegenden Layout Elemente zur Verf gung stehen Nat rlich ist auch dieser Teil wieder voll von Beispiel Code und Screenshots zur Veranschaulichung Windows Presentation Foundation Teil 2 XAML und Layouts PDF 2 6 2 WPF Rotation und Skalierung einfach gemacht Besch ftigt man sich n her mit der Materie Windows Presentation Foundation sieht man schon an sehr einfachen Beispielen dass die M glichkeiten schon sehr m chtig sind Beispielhaft zeige ich an dieser Stelle wie einfach ein Button skaliert und gedreht werden kann Dazu wird im Beispiel ein simpler Button erstellt und plaziert ber Schieberegeler ist es m glich die Values f r die Rotation bzw des Zoomfaktors zu setzen Dies sieht dann folgenderma en aus 164 NET BlogBook Ausgabe 4 W Zoom and Rotate Abbildung 51 WPF Rotation 1 Um nun die Funktionalitat zu implementieren ist nichts weiter zu machen als die entsprechenden EventHandler zu setzen Zoomfaktor public void sl derZoon ValueChanged ob ect sender Routedkvenr rgs amp ScaleTransform st new ScaleTransform sliderZoom Value sliderZoom Value this btnTest L
145. e Es wird direkt von der ComboBox abgeleitet Die neue Klasse erh lt die Eigenschaft StatusText mit dessen Hilfe ein entsprechender Text gesetzt werden kann der angezeigt wird wenn kein Item ausgew hlt ist 2 3 2 Meine GUI friert w hrend der Ausf hrung ein was tun Ebenfalls eine oft gesehene Frage Eine Aufgabe wird gerade ausgef hrt und dabei friert die Oberfl che der Anwendung ein Weder ein Fortschrittsbalken wird aktualisiert noch ein Label das den Fortschritt anzeigt Ja selbst beim Verschieben der Form wird diese wei und zeigt keine Informationen mehr an Der Hintergrund liegt einfach daran dass durch eine ausgef hrte Arbeit von dieser Form keine System Message mehr angenommen wird bzw diese nicht verarbeitet werden kann Um dies zu vermeiden und damit der Benutzer nicht irrt mlich annimmt die Anwendung sei abgest rzt bieten sich mehrere L sungen an DoEvents Durch ein Application DoEvents erh lt die Anwendung die M glichkeit andere Events abzuhandeln und die Form neu zu Zeichnen Threading Aufw ndige Aufgaben sollten in einem eigenen Thread ausgef hrt werden Dies kann ber die Klassen des Namespaces System Threading geschehen oder uber einen BackgroundWorker Hier ist jedoch zu beachten dass von Threads nicht direkt auf die GUI Elemente zugegriffen werden kann Hierzu muss mit Invoke gearbeitet werden Wichtig Locking In manchen F llen ist es wichtig bestimmte Code Teile mit einem loc
146. e Hrttpkequest request context Request Exception exception context Server GetLastError Das Exception Objekt beinhaltet nun die Informationen Uber den aufgetretenen Fehler In diesem Beispiel wird einfach der gesamte Inhalt der Exception per E Mail verschickt Wie aber bereits angesprochen waren auch andere Vorgehensweisen denkbar z B eine Persistierung des Fehlers in eine Datei oder Datenbank So ist es moglich Statistiken uber aufgetretene Fehler zu erstellen und auszuwerten Anschlie end sollte dem User eine freundliche Fehlermeldung pr sentiert werden sodass er nicht mit der rohen Fehlermeldung konfrontiert wird Der ErrorHandler wird in der Web Anwendung ber die Web Config registriert Hierf r ist der Abschnitt ht tpModules vorgesehen lt add type WebAppUtils ErrorHandler WebAppUtils name WebAppUtils gt lt httpModules gt lt httpModules gt Anschlie end bernimmt die Bearbeitung des Fehlers das entwickelte Http Module Den Download der Beispielprojekte findet man hier 2 4 50 Verschiedene Programmiersprachen im App_Code Ordner verwenden Im App Code Ordner werden Klassen abgelegt auf die jede ASP NET Page der Applikation zugreifen kann Angenommen man m chte nun eine VB NET Datei in 142 NET BlogBook Ausgabe 4 einem App Code Ordner verwenden der sonst nur C Dateien enthalt Visual Studio straft diesen Versuch mit einer mehr oder weniger langen Fehlermeldung ab Error List 1 Err
147. e ActiveX Komponente ist nun mittels tlbimp exe zu importieren tlbimp exe MyActiveX dll out Interop MyActiveX dll keyfile MyKeyFile snk Nach diesem Vorgang ist die vorhandene Referenz auf die Interop Assembly zu entfernen und die neu erstellte Interop MyActivexX dl1 einzubinden Ein Rebuild sollte nun fehlerlos durchlaufen 2 2 28 Strong named assembly trotz Referenz auf eine ActiveX Komponente Teil 2 Ebenfalls sehr interessant ist das Tool AxImp exe Das ActiveX Control Importer Tool konvertiert Typ Informationen einer COM Typ Library in ein Windows Forms Control Unter Windows Forms ist es nur m glich Controls zu hosten die von der Control Klasse abgeleitet sind Axlmp exe generiert nun einen Wrapper f r ActiveX Komponenten welche unter den Windows Forms verwendet werden k nnen Um also ein ActiveX Control hosten zu k nnen muss ein entsprechendes Wrapper Control erstellt werden Dieses muss zudem von AxHost abgeleitet sein Das Wrapper Control enth lt dabei eine Instanz des zugrunde liegenden ActiveX Controls NET BlogBook Ausgabe 4 und bietet die Moglichkeit darauf zuzugreifen Alle Methoden Eigenschaften und Events konnen genutzt werden Um beispielsweise einen entsprechenden Wrapper fur das Internet Explorer Control zu erstellen sind folgende Befehle auszufuhren sn k shdocvw enk AxImp SWINDIRSSystem32shdocvw dll keyfile shdocvw snk Die beiden ben tigten Dateien AxSHDocVw dll und SHDocVw dll werden
148. e Stellen gegeben unsichere Codestellen entdeckt auf obsolete Klasse hingewiesen und weitere Hilfestellungen gegeben Vor allem NET BlogBook Ausgabe 4 Sourcecode Kommentare sollte in gesundem Ma e durchgef hrt werden auch wenn manche Statistiken behaupten dass sich die meisten Fehler gerade in gut dokumentierten Stellen befinden bzw guter Sourcecode keiner Dokumentation bedarf Dennoch sollten derartige Hinweise ernst genommen und Warnungen aus der Analyse gering gehalten werden 4 3 Software Testing 4 3 1 Das bel Software Testing Gestern hatte ich ein l ngeres Gespr ch mit einem befreundeten Entwickler Basis der Diskussion war das Thema Software Testing in allen Formen Varianten und warum die Akzeptanz so gering ausf llt Fakt ist zumindest laut meiner pers nlichen Erfahrung dass nur sehr wenige Firmen Software wirklich testen Damit meine ich nun weniger das rein zuf llige Finden von offensichtlichen Bugs durch unkontrolliertes an Zuckungen erinnerndes Herumklicken auf der GUI sondern vielmehr der Einsatz von einschl gigen Hilfsmitteln a Unit Tests und Co Wenn ich nun kommuniziere dass es am zus tzlichen Aufwand liegt dann wiederhole ich mich denn dieser d rfte es anscheinend nicht sein Vielmehr daran dass viele Entwickler nur dann Spa am Programmieren haben wenn Neues geschaffen werden kann Beim Schreiben von Tests muss jedoch bereits entwickeltes gepr ft werden in vielen F llen was einer
149. e eine weitere Bestatigung des Users geloscht Fur diesen Fall bietet sich ein kurzer JavaScript Dialog an Daf r ist es zun chst n tig die Spalten ber den Befehl Edit Columns zu editieren mca OEE T ET ATENE oe FirstName LastName ID Auto Format Delete abc abc 0 Choose Data Source SqlDataSource1 er Delete abc abc 1 D Hater abc J Configure Data Source Refresh Schema Delete abc abe 3 pene Edit Columns Delete abc abc 4 Add New Column Edit the Gridview s columns Enable Pakre F Enable Sorting Enable Editing Enable Deleting Enable Selection Edit Templates Abbildung 22 Wirklich l schen im GridView 1 NET BlogBook Ausgabe 4 Das Feld Delete muss anschlie end in ein TemplateField konvertiert werden welches mit einem Klick auf den Link Convert this field into a TemplateField erledigt ist Fields Available fields CommandField properties 3 2 BoundField Oz al hel E FirstName ow E Lasthlame E Appearance FE ID ButtonT ype Link ipl CheckBoxField a CancellmageUr HyperLinkField CancelText Cancel DeleteImageUrl DeleteText Delete EditimageUr a Selected fields EditText Edit FooterText Delete iB Firstame 2 LastName z El m HeaderText The text within the header of this field HeaderImagelrl HeaderText Auto generate fields Convert this field into a TemplateField Refresh Schema Abbildung 23 Wi
150. e leere Tabelle mit dem Namen MyData an das GridView gebunden Die Tabelle enth lt nur eine Spalte mit dem Namen Data lt CC EmptyGridView id grid runat server ShowEmptyTable True EmptyText Keine Daten vorhanden AutoGenerateColumns False DataSourceID SqlDataSourcel gt lt Columns gt lt asp BoundField DataField Data HeaderText Data SortExpression Data gt lt Columns gt lt CC EmptyGridView gt Das abge nderte GridView Control kann in mehreren Projekten eingesetzt werden und bietet den vollen Funktionsumfang des eigentlichen GridView Controls Das gesamte Projekt inkl Beispielapplikation kann hier runtergeladen werden Um das EmptyGridView Control direkt einsetzten reicht dieser Download 2 5 Services 2 5 1 Windows Dienste mit C und NET 2 0 kontrollieren Hier eine kleine Demoklasse die den Umgang mit Windows Diensten zeigt Die Klasse selbst bietet nur die M glichkeit den Status eines Dienstes abzufragen und diesen zu Starten bzw zu Stoppen Weitere M glichkeiten kann den Klassen ServiceController entnommen werden public class ProcessHandler private string processName null public string ProcessName get return this processName set this processName value public ServiceControllerStatus GetProcessState ServiceController sc new ServiceController processName if ise j null return SC oCe lus return ServiceControllerStatus Stopped public voi
151. e nicht erreichbar sein sollten In machen F llen muss aber auf Werte der Klasse wenn instantiiert dann Objekt zugegriffen werden Dies kann auf mehrere Arten passieren e Die Variablen werden mittels public als ffentlich markiert e Es werden Eigenschaften eingef hrt Variante 1 sollte nicht angewendet werden also bleibt im Endeffekt nur Variante zwei Wie sieht das anhand eines Sourcecode Beispieles aus NET BlogBook Ausgabe 4 public class Test private string name null public string Name ger return Chis hams set this name value Wie an diesem Beispiel zu sehen wird in der Variable name ein Wert gespeichert Zugegriffen kann auf diesen Wert mittels der Eigenschaft Name werden Hierzu ist zu beachten dass Eigenschaften unterschiedlich zu Methoden kein nach dem Methodennamen enthalten also auch keine Parameter bergeben bekommen k nnen Weiters gibt es die Bereiche get und set Im get Bereich wird der in name gespeicherte Wert zur ckgegeben Der set Bereich dient dazu den bergebenen Wert in die private Variable zu speichern Das Schl sselwort value beinhaltet hierbei den bergebenen Wert Dies sieht au erhalb der Klasse so aus Test myTest new Test myTest Name mein Name Console WriteLine myTest Name Consolen Ausgabe mein Name Nun gut aber welchen Vorteil hat das ganze nun Ganz einfach Durch eine Property kann beispielsweise eine berpr fung der Werte durchgef hrt
152. eben Der Gewinner ist damit einverstanden dass die relevanten Daten f r die Gewinnubermittlung an den ppedv Verlag weitergegeben werden Dar ber hinaus erfolgt keine Weitergabe der Daten Der Rechtsweg ist ausgeschlossen Die Teilnahme von Mitarbeitern der ppedv AG sowie NET Casts am Gewinnspiel ist ausgeschlossen NET BlogBook Ausgabe 4 ER Strong named assembly trotz Referenz auf eine ActiveX Komponente 33 2 2 28 Strong named assembly trotz Referenz auf eine ActiveX Komponente NET BlogBook Ausgabe 4 NET BlogBook Ausgabe 4 NET BlogBook Ausgabe 4 NET BlogBook Ausgabe 4 NET BlogBook Ausgabe 4 5 25 LINQPad LINQ Ausdr cke testen aed teed NER SIEH EIERN WIESE ACER ISIN NUN ET ESTN 251 6 Microsoft Office 0 0 cece ccc cc cece cece cee ecececeeeeeeeueueeeeseteneeeeseeueneaeesesenetensssnertrsnsss 253 7 6 SQL Server 2005 Custom Datatypes eee tees teee eee eee sees esse eeeees 260 17 1 CH und SQL Server 2003 260 7 8 OODBMS Object Oriented DataBase Management Systeme 263 7 9 SA User unter SQLServer 2005 UMbeNeNNEN 0 cece eee eceeceeeeeececeeeeeseeeeeeeees 264 NET BlogBook Ausgabe 4 NET BlogBook Ausgabe 4 1 NET BLocBook 1 1 Vorwort Die vierte Ausgabe des NET BlogBooks ist im Gegensatz zur dritten Ausgabe wieder mit jeder Menge neuer Eintr gen gef llt Zus tzlich wurde wieder ein Gro teil des Inhalts sowohl auf F
153. ect private static ConfigurationManager instance null private string lt contigPratn null endregion Private Members region Properties lt summary gt ConfigurationPath is used to store the configuration lt summary gt public string ConrtigurarionPacth get teturi This coniigPathy eet this Contigrpath value endregion Properties region ctor lt summary gt Private Constructor lt gt Singleton NET BlogBook Ausgabe 4 lt summary gt private ConfigurationManager endregion ctor region Public Methods lt summary gt Creates a new instance if there wasn t already one created else the available instance will be returned lt summary gt lt returns gt ConfigurationManager instance lt returns gt public static ConfigurationManager GetInstance lock _lockObject iL 7 nstance null instance new ConfiguratiscnhMahagert return instance lt summary gt Read configuration The typename is used as the filename lt summary gt lt typeparam name T gt Any serializable type lt typeparam gt lt param name configuration gt Serializable object lt param gt lt returns gt Given type T lt returns gt public T Read lt T gt T configuration return Read lt T gt configuration GetType Name lt summary gt Read configuration lt summary gt lt typeparam
154. ef hrlicher Code 1 Ist die berpr fung seitens ASP NET deaktiviert wird die Eingabe des Users direkt ausgef hrt sodass ein JavaScript Alert mit dem Hinweis XSS erscheint 137 NET BlogBook Ausgabe 4 we Be Untitled Page lt script Lang meins Internet Expl BEER PostBack f Eingabe Abbildung 37 Gef hrlicher Code 2 In machen F llen ist die Eingabe von HTML oder JavaScript vom User aber ausdr cklich erw nscht ASP NET bietet an zwei Stellen die M glichkeit die berpr fung zu deaktivieren F r die gesamte Applikation kann dies in der Web Config konfiguriert werden lt pages validateRequest false gt lt system web gt lt system web gt Soll die berpr fung nur f r eine Seite deaktiviert werden wird dies ber die gleichnamige Eigenschaft im Page Header erledigt lt S Page Language C AutoEventWireup true CodeFile Default aspx cs inherite Default Valigatekequest Talee a gt Die erste Moglichkeit sollte nur angewendet werden wenn die Anwendung in einer sicheren Umgebung lauft sodass solche Eingaben oder Angriffe von vorne heraus ausgeschlossen werden konnen Ist dies nicht der Fall muss sichergestellt werden das die Eingaben des Users fur die Ausgabe umgewandelt ausgegeben werden Das NET Framework bietet hierfur die Methode HtmlEncode an Diese Methode wandelt nicht Html Konforme Zeichen um sodass diese korrekt im Browser angezeigt werden W
155. egt In einigen F llen kann es nun erw nscht sein diese Dateien in eine einzige zusammen zu fassen Ein Paradebeispiel w re die Vereinfachung des Deployment Prozesses da in diesem Fall lediglich eine Anwendungsdatei ber cksichtigt werden muss abgesehen von anderen Dateien Einstellungen etc die ausgeliefert werden m ssen Als Beispiel dient eine simple Anwendung die nur eine Funktionalit t besitzt das Multiplizieren zweier Integer Werte Daf r wurde zus tzlich zur Windows Forms Anwendung eine Klassenbibliothek angelegt Darin enthalten ist die Klasse Calculator Solution Explorer ILMergeDemo 223 a Solution ILM erg eDemo 2 projects A 34 Properties References E FormMain cs Program cs Bi ILMergeDemo Core E Properties aj References Calculator cs Abbildung 73 ILMergeDemo Solution Explorer Nach einem Build im Release Modus werden die Dateien ILMergeDemo exe und liMergeDemo Core dll angelegt Diese fassen wir nun zu einer einzigen Assembly zusammen Dies geschieht mit dem folgenden Aufruf 237 NET BlogBook Ausgabe 4 ILMerge exe t winexe out ILMergeDemoMerged exe ILMergeDemo exe TLMergeDemo Core dll ILMerge selbst ist eine Konsolen Anwendung die mittels Parameter gesteuert werden kann t filename bzw target filename Hiermit wird eingestellt ob es sich um eine Windows Anwendung eine Konsolenanwendung oder eine Klassenbibliothek
156. ehler beim Zugriff auf die IIS Metabasis Was tun F r diejenigen die nachfolgenden Fehler erhalten habe ich eine ganz simple L sung bei der Hand Serverfehler in der Anwendung TestIIS Fehler beim Zugriff auf die IIS Metabasis Beschreibung Unbehandelte Ausnahme beim Ausf hren der aktuellen Webanforderung berpr fen Sie die Stapel berwachung um weitere Informationen ber diesen Fehler anzuzeigen und festzustellen wo der Fehler im Code verursacht wurde Ausnahmedetails System Web Hosting HostingEnvironmentException Fehler beim Zugriff auf die IIS Metabasis Das zur Ausf hrung von ASP NET verwendete Prozesskonto muss ber Lesezugriff auf die IIS Metabasis z B IIS servername W3SVC verf gen Informationen zum ndern der Berechtigungen f r die Metabasis finden Sie unter http support microsoft com kbid 267904 Quellfehler Beim Ausfuhren der aktuellen Webanforderung wurde einen unbehandelte Ausnahme generiert Informationen ber den Ursprung und die Position der Ausnahme k nnen mit der Ausnahmestapel berwachung angezeigt werden Stapel berwachung HostingEnvironmentException Fehler beim Zugriff auf die IIS Metabasis System Web Configuration MetabaseServerConfig MapPathCaching String siteID VirtualPath path 3492202 System Web Configuration MetabaseServerConfig System Web Configuration IConfigMapPath MapPath String seitelD VirtualPath wvpach 9 System Web Hosting HostingEnvironment MapPathA
157. ehler hin berpr ft als auch inhaltlich verbessert Wer das NET BlogBook bis dato nicht kennt Es handelt sich hierbei um eine Sammlung und berarbeitung von Weblog Beitr gen der in dieser Ausgabe genannten Autoren Im Laufe der Zeit sammelten sich viele hilfreiche Artikel an die nur online zur Verf gung stehen In vielen F llen stellt sich jedoch eine Offline Variante als sehr hilfreich und sinnvoll heraus Haupts chlich bei Programmierarbeiten beim Kunden der aufgrund Sicherheitsrichtlinien keinen Zugriff in das Internet erlaubt oder w hrend einer Zugfahrt mit vergessener UMTS Karte oder aber auch einfach nur zum Ausdrucken und Durchst bern Derzeit umfasst dieses BlogBook die Eintr ge von zwei Weblogs zu unterschiedlichen NET Themen Um die Inhalte aktuell zu halten werden diese einmal im Quartal erweitert und berarbeitet um so neue Inhalte zu schaffen als auch bestehende Inhalte optimaler aufzubereiten Nachfolgend finden Sie eine bersicht der Erscheinungstermine an welchen aktualisierte Ausgaben ver ffentlicht werden 15 Januar 15 April 15 Juli 15 Oktober Neue Versionen k nnen unter http www dotnetcasts com bezogen werden und stehen kostenlos zur Verf gung 1 2 Ziel des Projektes Wie die meisten Projekte wurde auch f r das NET BlogBook ein Ziel definiert Unterschiedliche NET Inhalte von grundlegenden Beispielen zum NET Core Framework ber designtechnische Grundlagen bis hin zur Webentwicklung
158. eine Log Datei geschrieben werden oder eine User Interaktion verlangt wird Wie oben gezeigt k nnen mehrere Exceptions gezielt abgefangen und behandelt werden Im MSDN finden sich zu allen Methoden auch Angaben dar ber welche Exceptions geworfen werden Prinzipiell ist mit diesen Exceptions zu arbeiten und nicht direkt mit Exception selbst finally Dieser Teil des Blockes wird in jedem Fall ausgef hrt also sowohl nach erfolgreichem Durchlauf des try Teiles als auch im Falle eines Fehlers Dadurch bietet es sich an im finally Block Aufr umarbeiten durchzuf hren Dies kann beispielsweise das Schlie en einer Datenbank Verbindung sein Beim catch Block muss nicht zwingend ein Typ angegeben werden Ist dies nicht der Fall dann werden s mtliche Exceptions behandelt Von dieser Schreibweise w rde ich jedoch eher abraten Cry i catch Des Weiteren sollten Exception nicht f r die Ablaufsteuerung einer Anwendung verwendet werden Darunter wird verstanden dass gezielt auf Exceptions abgefragt wird um aufgrund des Exception Typs zu entscheiden welcher weitere Code anschlie end ausgef hrt wird Exceptions sind sehr teuer Dies bedeutet dass dadurch viele Ressourcen verbraucht werden Daher sind Exceptions auch als solche zu behandeln Nat rlich besteht auch die M glichkeit eigene Exceptions zu implementieren Dies macht vor allem bei der Entwicklung von gr eren Frameworks die auch von anderen Entwicklern benutzt werden
159. em Programm wurde es nun zu einem entsprechenden Fehler gelangen class Test N A a Ok N B b Fehler WC es JF Sk Kompilieren wir nun den Code mit folgender Anweisung eee frsal dll ria2 2llL Peet ce Die Typen aus den Assemblies al dil und a2 d11 werden in der Global Namespace Hierarchy abgelegt wodurch ein Fehler entsteht Der Typ N B existiert in beiden Assemblies An dieser Stelle kommen die extern aliases zum Einsatz extern alias X extern alias Y class Test KK XX QwwW Pp e N H 5e aog w Es werden die beiden Aliase x und y deklariert aber die Defintionen der Aliase sind extern abgelegt Der Kompilierungsaufruf muss entsprechend abge ndert werden und sieht so aus esc rixXx al dll eee dll es Unter Verwendung von Visual Studio k nnen die Aliase in der Eigenschaft Aliases der jeweiligen Referenz angegeben werden 2 2 66 Mit IComparable nach mehreren Eigenschaften sortieren Nehmen wir als Beispiel eine Highscore Liste Hierf r m ssen zwei Werte sortiert werden e der erreichte Score absteigend e der Name des Spielers aufsteigend Mit Hilfe der Schnittstelle Comparable kann dies einfach erledigt werden Hierf r ben tigen wir die Datenklasse Highscore welche besagtes Interface implementiert fusing System NET BlogBook Ausgabe 4 using System Collections Generic using System Text namespace HighscoreTest public class Highscore IComparable Private p
160. em auch die Performance 2 2 12 C Welche Datei repr sentiert einen Prozess Da manche Prozesse mehrfach ausgef hrt werden bzw werden m ssen ist es manchmal gut zu wissen welche DLL oder Anwendung der Ursprung eines Prozesses ist Das nachfolgende Beispiel zeigt wie eine die Informationen zur gesamten Prozessliste ausgegeben werden Achtung Die Prozesse idle und System besitzen kein main module Process processes Process GetProcesses foreach Process p in processes Ery Console WriteLine p ProcessName p MainModule FileName catch Exception ex Console WriteLine p ProcessNanme Console WriteLine ex Message 2 2 13 Zeitmessung einfach gemacht Soll ein Vorgang performant sein empfiehlt es sich unterschiedliche Ans tze zu testen Diese m ssen dann nat rlich nicht nur auf Ressourcen Verbrauch sondern auch in zeitlicher Hinsicht getestet werden Dies kann nat rlich mit Hilfe von DateTime und TimeSpan erledigt werden Das NET Framework 2 0 enth lt hier jedoch auch noch andere Mittel Stopwatch aus dem System Diagnostics Namespace Stopwatch kann dazu verwendet werden verbrauchte Zeiten zu messen Start und Stop sind die entsprechenden Methoden Die Besonderheiten 1 Bei einem Stop wird die bereits verbrauchte Zeit nicht zur ckgesetzt D h bei einem neuerlichen Start beginnt der Z hler nicht bei Null sondern inkludiert die bereits verbrauchte Zeit Mit Reset kann der Wert auf
161. en In einigen F llen muss mit den Dateizugriffs Rechten gearbeitet werden So muss die ACL Access Control List ausgelesen und angepasst werden Hier ein Code Snippet welches den Umgang mit den entsprechenden Klassen aus dem NET Framework 2 0 zeigt Kurze Beschreibungen gibt es als Code Kommentare Creating a testfile Console WriteLine Creating XML File XmlDocument doc new XmlDocument XmlNode root doc CreateKlement root d c AppendChild r ot doc Save C temptest xml Console WriteLine Getting FileSecurity Getting Access Control List ACL of the file FileSecurity fSec File GetAccessControl C temptest xml Get Access Right Type Type accessRightType fSec AccessRightType Console WriteLine AccessRightType accessRightType FullName Get Owner of the file string fileOwner fSec GetOwner typeof System Security Principal NTAccount Value Console WriteLine Owner fileOwner System Environment NewLine Get Access Rules of the file AuthorizationRuleCollection authRuleColl fSec GetAccessRules true true typeof System Security Principal NTAccount Iterate through all Access Rules foreach FileSystemAccessRule rule in authRuleColl Console WriteLine Control Type rule AccessControlType ToString Console WriteLine Identity rule IdentityReference Value Console WriteLine Inheritance Flags rule InheritanceFlags ToString
162. en Klickt man nun die erste CheckBox der Liste an halt die Shift Taste gedr ckt und klick anschlie end die letzte CheckBox werden automatisch alle zwischenliegenden Controls markiert ProductID ProductName ProductPrice l Item 1 12 99 Z Item 2 15 99 3 Item 3 16 99 4 Item 4 17 99 Abbildung 17 Mehrere CheckBox Controls markieren Diese Funktionalit t soll per JavaScript umgesetzt werden um ein PostBack und somit einen erneuten Aufbau der Liste zu vermeiden 107 NET BlogBook Ausgabe 4 Zunachst ist es notig eine Liste mit allen vorhandenen CheckBox Controls IDs aufzubauen Hierfur bietet sich ein Array an welches spater mit Hilfe einer for Schleife durchlaufen werden kann protected void Eridvienl_BDataBoundtobjeot sender Event rgs e i string js chkCollection new Array int index 0 foreach GridViewRow row in GridViewl Rows Checkbox chkBox Checkbox row Celle 3 FandControl chkBox ja 4s WIE Seca LIL 97 97 ShkBoz Attr hutes A94 f onelick SHittClicki Idee 3 indext je J2 cupecring G Jelena 1 JJ Clientsceript BRegistertlientseriptBl ck fthis Ger Tyge t ClickScript 75 true Bei dieser Gelegenheit wird jedem CheckBox Control die Methode ShiftClick hinzugef gt welche beim Event onclick angerufen werden soll und als Parameter die Position innerhalb der Arrays entgegen nimmt Um die gedruckte Shift Taste zu erkennen i
163. en XML Serializer n tzt das Einf gen dieser Referenzen wenig wenn sie durch die Datenbank nicht dargestellt werden k nnen Abfragen sind nat rlich auch in dieser Form noch auf der Datenbank m glich ohne alle Daten zu laden aber durch die Vermischung von SQL und XPATH etc w rde ich meinen dass der Performance Vorteil eher gering ausf llt gt d rfte wohl im Minusbereich angesiedelt sein Und zu guter Letzt Diese Variante w rde kein gemeinsames Ablegen von Objekten und relationalen Daten implizieren Das einzige was Sinn machen w rde w re das Ablegen von relationalen Informationen Metadaten etc zu Objekten aber ich denke das bernimmt ohnehin die Indizierung f r uns NET BlogBook Ausgabe 4 7 4 SQL Server 2005 Erstellung einer Replikation Wer eine Replikation unter dem SQL Server 2005 erstellen muss bzw will der findet im nachfolgenden Tutorial eine Anleitung Alle notwendigen Schritte werden anhand von Screenshots und Beschreibungen aufgezeigt und sollten recht einfach nach zu vollziehen sein Datenreplizierung unter dem SQL Server 2005 1 1 MB 7 5 SQL Server 2005 Managed Code Dieses Tutorial soll zeigen wie managed Code in diesem Fall wird C benutzt unter dem SQL Server 2005 verwendet werden kann Managed Code unter dem SQL Server 2005 213 KB 7 6 SQL Server 2005 Custom Datatypes Eine Einf hrung in die benutzerdefinierten Datentypen unter dem SQL Server 2005 bietet das unten verlinkte Dokume
164. erdeutlicht 2 2 88 Generische Typ Informationen auslesen Wer viel mit Reflection arbeitet der bekommt es von Zeit zu Zeit nat rlich auch mit generischen Datentypen zu tun Vielfach wird die Frage gestellt wie man hierbei an die Typ Informationen der generischen Parameter gelangt Die L sung ist denkbar einfach Dictionary lt int string gt dict new Dictionary lt int string gt Type dictType dict GetType Console WriteLine IsGenericType dictType IsGenericType foreach Type t in dictType GetGenericArguments Console WriteLine Argument Typ t FullName if dictType IsGenericParameter foreach Type t in dictType GetGenericParameterConstraints Console WriteLine Contraint t FullName Type typeDef dictType GetGenericTypeDefinition Console WriteLine TypeDefinition typeDef FullName Dieses kurze Beispiel zeigt wie die Typen der generischen Parameter ausgelesen werden k nnen So sieht das Ergebnis aus IsGenericType True Argument Typ System Int32 Argument Typ System String TypeDefinition System Collections Generic Dictionary 2 Es lohnt sich in weiterer Folge sich genauer mit den angebotenen Methoden und Eigenschaften der Klasse Type zu besch ftigen 2 2 89 Haufigkeiten von W rtern in einer Liste berechnen Heute fand ich eine Frage vor wie denn ein Array bestehend aus unterschiedlichen Namen durchlaufen werden kann um die einzelnen Namen und die Anzahl der Vorkommen a
165. ersichtlich dass die Daten aus dem Objekt in das neu zu erstellende Objekt kopiert werden Hierzu ist ein Blick in die Klasse notwendig Ein Schritt der nicht sein muss Stattdessen empfiehlt es sich das Interface ICloneable Zu verwenden oder mit MemberwiseClone Zu arbeiten Je nachdem welche Kopiermethode verwendet werden soll 197 NET BlogBook Ausgabe 4 4 1 4 Serviceorientierte Architekturen Grundlagen Serviceorientierte Architektur SOA ist wohl ein haufig gebrauchter Terminus in der heutigen Zeit Wer sich beispielsweise naher mit der Windows Communication Foundation WCF beschaftigen mochte sollte sich zuvor in die Grundlagen der SOA einarbeiten Wie die Bezeichnung vermuten lasst besteht SOA aus lose gekoppelten Diensten die jeweils bestimmte Aufgaben kapseln und unabhangig voneinander bezogen werden konnen Ein Dienst wird von einem Service Provider angeboten der Client nennt sich Service Consumer Ein einzelner Dienst stellt unterschiedliche Funktionen Operationen zur Verfugung die von einem Consumer aufgerufen werden k nnen Dabei wird ein Service ber eine Schnittstelle Contract definiert Die Schnittstelle beschreibt also welche Funktionalit ten und Nachrichten angeboten werden Hierbei ist zus tzlich darauf zu achten dass der Client die Implementierung der Funktionalit t nicht kennt da diese vom Service gekapselt wird Dadurch ist es sehr einfach m glich die Funktionalit t selbst zu ndern ohne
166. ervices GetUninitializedObject ist es m glich Objekte von Klassen mit privaten Konstruktoren kein ffentlicher Konstruktor vorhanden zu erstellen Hier eine Beispielklasse public class TestClass NET BlogBook Ausgabe 4 private TestClass public string GetMessage return This is a message Diese kann mit GetUninitializedObject instantiiert werden wogegen Createlnstance eine MissingMethodException wirft und uns darauf aufmerksam macht Fur dieses Objekt wurde kein parameterloser Konstruktor definiert Einsatzmoglichkeiten daf r werden sich sicherlich f r manche finden 2 2 81 C BinaryFormatter SerializationException und dynamisch geladene Assemblies Zwei Solutions In der ersten Solution befindet sich eine Windows Forms Anwendung Diese referenziert eine Assembly aus der zweiten Solution In der zweiten Solution befindet sich eine Konsolen Anwendung welche eben erw hnte Assembly per Assembly GetAssembly l dt Zu erw hnen sei ebenfalls dass folgende Klassen enthalten sind e Datenklassen diese werden serialisiert e Commands siehe Command Pattern Nun gut In der Windows Forms Anwendung werden die einzelnen Commands konfiguriert und per BinaryFormatter serialisiert Dabei ergibt sich jedoch ein kleines Problem Da die Konfigurationen in der Windows Forms Anwendung serialisiert wurden hierzu muss angemerkt werden dass sich die Klasse welche die Konfigurationen liest und auch w
167. es Beispielprojekts findet man hier 2 4 13 Login Cookie des Community Server verwenden Betreibt man neben dem Community Server eine weitere Anwendung welche auch die ASP NET Membership Controls nutzt macht es Sinn das Login Cookie in beiden Anwendungen zu nutzen Der User muss sich somit nur einmal einloggend um in beiden Anwendungen arbeiten zu k nnen Die Anwendungen selbst m ssen innerhalb der gleichen Domain ausgef hrt werden z B www domain de und www domain de forum Weiterhin ist es n tig in beiden Web Config folgende Einstellungen hinzuzuf gen oder anzupassen falls diese bereits vorhanden sind lt machineKey validationKey xxxx decryptionKey xxxx validation SHA1 gt Die Werte f r die einzelnen Attribute k nnen entweder direkt aus der Web Config des Community Servers bernommen oder selbst erstellt werden Des Weiteren muss der Eintrag Authentication gleich sein lt authentication mode Forms gt lt forms name CommunityServer protection All timeout 60000 loginUrl default aspx slidingExpiration true gt lt authentication gt L scht man nun die Cookies im Browser und meldet sich erneut kann wird das Cookie ebenfalls in der anderen Anwendung benutzt 2 4 14 Wirklich l schen im GridView 114 NET BlogBook Ausgabe 4 Das GridView in Verbindung mit den DataSource Controls bietet von Haus aus die Moglichkeit Datensatze zu loschen Allerdings werden die Datensatze ohn
168. es Ergebnisses In diesem Sinne sind wir f r alle Verbesserungsvorschl ge dankbar Ebenfalls nehmen wir jegliche Unterst tzung gerne an sofern sie diesem Projekt dienlich ist 1 5 Rechtlicher Hinweis S mtliche Inhalte des NET BlogBooks entstammen den Federn von Kai Gloth und Norbert Eder Dementsprechend d rfen die Inhalte nicht ohne Zustimmung kopiert vervielf ltigt oder anderweitig verwendet werden Eine Nichteinhaltung zieht rechtliche Konsequenzen nach sich NET BlogBook Ausgabe 4 2 NET FRAMEWORK Dieses Kapitel behandelt das NET Framework Dies bedeutet hier sind zahlreiche Hilfen Ratschl ge und Diskussionen zu s mtlichen Framework Themen aufgelistet Es finden sich Informationen zu Windows Forms zum Basis Framework zu ASP NET und vielem mehr 2 1 Allgemein 2 1 1 Klassen und Namespace Informationen erfolgreich finden Informationen zu Klassen k nnen auf unterschiedlichste Weise gefunden werden Die grundlegenden M glichkeiten betreffen e Object Browser e Microsoft Developer Network Der Object Browser ist u erst hilfreich wenn beispielsweise nach Klassen gesucht wird jedoch der Namespace nicht bekannt ist Alle Klassen die in bereits referenzierten Assemblies vorhanden sind k nnen so gefunden werde Dies betrifft alle Klassen der NET Framework Core Zus tzlich k nnen Methoden Eigenschafts und Vererbungs Informationen bezogen werden Microsoft steckt sehr viel Aufwand und M he in das Micr
169. et deletedFolder mNamespace GetDefaultFolder olFolderDeletedlItens For Each mItem In deletedrFrolder Items mitem Delete Next End Sub Getestet wurde mit geloschten Emails Kontakten Aufgaben und Notizen unter Verwendung von Microsoft Office 2003 6 4 MS Outlook Mails mit Shortcut als gelesen markieren Das gelesen markieren funktioniert unter Outlook nur wenn man zuvor die entsprechenden Mails markiert und dann STRG Q druckt Manchmal mochte man jedoch alle Mails in einem ausgew hlten Folder als gelesen markieren und zwar mit Hilfe eines Shortcuts Hier gibt es die Info wie das funktioniert Zuerst ist folgendes Makro anzulegen Sub SetAllRead Dim mItem As Mailltem If Outlook Activekxplorer CurrentFolder UnReadItemCount gt 0 Then For Each mItem In Outlook ActiveExplorer CurrentFolder Items mItem UnRead False Next End Ir End Sub In meinem Beispiel nennt sich das Makro SetAllRead Nach dem Erstellen ist das Men Extras Anpassen zu w hlen In der Lasche Befehle nun einfach den Eintrag Makros in der linken Liste ausw hlen Das gerade erstellte Makro sollte in der NET BlogBook Ausgabe 4 rechten Liste verfugbar sein Mit der linken Maustaste einfach das Makro anfassen und in eine Toolbar ziehen Jetzt kommt der entscheidende Teil bezuglich Shortcut Mit einer rechten Maustaste auf die eben erstellte Schaltflache Achtung das Anpassen Fenster muss noch geoffnet sein erscheint ein Menu in dem
170. et werden Der Aufruf sieht folgenderma en aus aspnet_compiler v MyIISWebApplication MyTargetPath MylISWebApplication muss als solche im IIS registriert sein MyTargetPath gibt den Pfad an in welchen die vorkompilierte Anwendung gespeichert werden soll Hier sind vor und nach der Pfadangabe Anfuhrungszeichen zu setzen wenn der Pfad Leerzeichen enth lt Gegebenenfalls muss der Pfad zu aspnet compiler exe in die Umgebungsvariablen hinzugef gt werden damit das Tool global aufgerufen werden kann Zu finden ist das Tool unter NET BlogBook Ausgabe 4 C windir Microsoft NET Framework v2 0 50727 Aus dem Zielverzeichnis kann nach der Generierung die vorkompilierte Version entnommen und verwertet werden Weitere Commandline Schalter und zus tzliche Informationen k nnen im MSDN gefunden werden 2 4 58 ASP NET URL aus lokalem Pfad generieren Mit Server MapPath kann sehr einfach der lokale Pfad zu einer Datei generiert werden In manchen F llen ist jedoch der umgekehrte Weg notwendig Aus einem vorhanden Pfad soll eine URL erstellt werden Nachfolgendes Code Snippet zeigt wie dies geht private String ReverseMapPath String PhysicalFilePath String AppPath HttpContext Current Server MapPath string url Biring Formac le PhysicalFilePath Replace AppPath Replace return url 2 4 59 ASP NET Session Informationen zur richtigen Zeit auslesen F r eine Webanwendung werden meist Sess
171. f erlaubt Mit diesem Schritt ist die Programmierung des Http Module abgeschlossen Die Web Anwendung selbst ist f r dieses Beispiel einfach gehalten und besteht lediglich aus einer DropDownListe mit dem verf gbaren Themes und einem Button welches das ausgew hlte Theme best tigt 148 NET BlogBook Ausgabe 4 le ode E Untitled Page Theme default Change Abbildung 46 Theme Auswahl Damit das Http Module mit der Arbeit beginnen kann muss es in der Web Config registriert werden Dies wird im Abschnitt HttpModules erledigt lt add name Tools type Tools ThemeChanger Tools gt lt httpModules gt lt httpModules gt Der OnClick EventHandler des Buttons speichert das ausgew hlte Theme per Session Objekt und f hrt anschlie end ein Redirect auf die Seite aus Dies ist n tig da das Http Module schon l ngst aufgerufen wurde bevor der OnClick EventHandler das Ereignis bearbeitet hat Somit kann das Theme erst im zweiten Durchgang ausgelesen werden protected void cmdChangeTheme Click object sender EventArgs Session SelectedTheme ddlTheme SelectedValue Response Redirect Request CurrentExecutionFilePath Anschlie end bleibt die Theme Auswahl des Users erhalten bis die Session abgelaufen ist Allerdings ist es ebenfalls sehr einfach dieses Beispiel zu erweitern und die Einstellung in einer Datenbank oder XML Datei zu persistieren Das Beispielprojekt kann
172. findet man diesen unter dem Men punkt Geplante Tasks Windows Vista benennt diesen Bereich als Aufgabenplanung Die Einrichtung hier ist selbsterkl rend und kann per Assistenten durchgef hrt werden 145 NET BlogBook Ausgabe 4 Abbildung 44 Aufgabenplaner Dieses Beispielprogramm sollte lediglich als Vorlage verwendet und entsprechend der Anforderungen erweitert werden Wie oben bereits angesprochen ware eine Benachrichtigung per E Mail ein Datei Logging oder das Einlesen der URLs aus einer Textdatei denkbar Das Beispielprojekt kann hier heruntergeladen werden 2 4 54 Einzelne Zellen des GridView einf rben Mit Hilfe der Einf rbung bestimmter Zellen des GridView in Abh ngigkeit zu deren Inhalt ist es m glich den User direkt auf etwas aufmerksam zu machen In diesem Beispiel soll der GridView Betrachter auf Preise die jenseits der 200 EUR liegen hingewiesen werden ww Untitled Page ID Name Price 1 Chair 100 20 2 Tale M 3 Desk 150 20 4 Couch Sa g easy char 100 00 Abbildung 45 Zellen in GridView einfarben Die Vorgehensweise ist einfach Nachdem die Zeile eingefugt wurde muss das Feld Price uberpruft und entsprechend eingefarbt werden Das GridView wirft einen Event mit dem Namen OnRowDataBound nachdem jeweils eine Zeile eingef gt wurde In diesem Fall ist es also nur erforderlich einen Handler f r dieses Event zu definieren und ihn im GridView zu registrieren lt asp
173. g scheint bei vielen NET Programmierern noch nicht richtig angekommen zu sein Immer wieder finden sich in diversen Beispielen und Fragen traurige Konstrukte die haupts chlich negative Erscheinungen zu Tage f rdern Also Beispiel sei hier ein neulich gesichteter Code gezeigt werden nicht kopieren BIY StreamReader sr new StreamReader path string text sr ReadToEnd sr Close catch Exception ex Das Ergebnis Nun ist die Datei nicht vorhanden wird eine Exception geworfen und auch abgefangen aber es passiert damit nichts Es erfolgt weder eine Meldung an den User noch ein Log Eintrag um etwaige Fehler zu einem sp teren Zeitpunkt nachvollziehen zu k nnen Ein weiterer Effekt ist dass beim Testen durch den Entwickler alles funktioniert was nat rlich nicht stimmt Nun gut aber wie soll das Exception Handling dann wirklich umgesetzt werden Ganz einfach Der grundlegende try catch Block sieht so aus cry i Implementierung catch IOException ex Fehlerbehandlung f r IO Fehler catch Exception ex Fehlerbehandlung f r andere Fehler t Finally NET BlogBook Ausgabe 4 Abschlussarbeiten Hier noch eine genaue Beschreibung try Im try Teil des gesamten Blockes erfolgt die Implementierung der tats chlichen Funktion catch Hier ist die Fehlerbehandlung zu implementieren Dies kann realisiert werden indem die Fehlermeldungen bzw zus tzliche Eintr ge in
174. ge Performance Deshalb sollte bei der Abarbeitung von gro en und vor allem vielen Bildern diese Variante nicht herangezogen werden EXIF Bibliotheken sollten durchaus einfach zu finden sein Hier dennoch eine m gliche Library die jedoch nicht auf Geschwindigkeit hin von mir getestet wurde EXIFextractor NET BlogBook Ausgabe 4 2 2 85 C Der as Operator Einfuhrung as Operator Der as Operator ist ahnlich einer Cast Operation Im Gegensatz zu einem Cast liefert as jedoch keine Ausnahme Exception sondern gibt null zur ck Ein Beispiel object o new MyDemoClass MyDemoClass mdc o as MyDemoClass Die Cast Variante w rde wie folgt aussehen object o new MyDemoClass MyDemoClass mdc MyDemoClass o Ein quivalent zum as Operator k nnte so formuliert werden MyDemoClass demoClass object o new MyDemoClass o is MyDemoClass MyDemoClass o null F r benutzer definierte Konvertierungen muss ein Cast verwendet werden da dies durch den as Operator nicht abgebildet wird nur Referenzen und Boxing Performance Bez glich der Performance gibt es einen kleinen Unterschied der sich allerdings erst bei einer hohen Anzahl an Durchl ufen auswirkt Ein Test mit 1 Milliarde Iterationen zeigte einen deutlichen Unterschied sollte jedoch in der Praxis in dieser Form nicht allzu oft vorkommen Hier die Testanwendung using System using System Collections Generic using System Text using System Dia
175. geben Mochte man einen zufalligen Datensatz aus einer Datenbank Tabelle anzeigen kann man dies aufwendig per C Code losen Allerdings gibt es eine viel einfachere Methode direkt per SQL SELECT TOP 1 Feld FROM Tabelle ORDER BY NEWID Die Anweisung NEWID generiert einen eindeutigen Wert vom Typ uniqueidentifier In Verbindung mit einem ORDER BY erh lt man nun einen zuf lligen Datensatz Dieses Vorgehen funktioniert ebenfalls unter MySQL allerdings mit einer etwas abgewandelten Syntax SELECT Feld FROM Tabelle ORDER BY RAND LIMIT 1 7 15 Autoinkrement Wert nach INSERT INTO auslesen H ufig verwendet man in Tabellen einer Datenbank einen inkrementellen ID Wert um Datensatze eindeutig zu identifizieren Mochte man nun diesen ID Wert nach dem INSERT direkt weiterverwenden drangt sich im ersten Moment die Losung auf direkt NET BlogBook Ausgabe 4 nach dem INSERT ein SELECT auf die h chste ID abzusetzen und den Wert somit auszulesen Verwendet man diese L sung l uft man allerdings Gefahr eine falsche ID zu bekommen Es ist durchaus m glich dass zwischen dem INSERT und dem SELECT einer Session bereits ein weiterer Datensatz einer anderen Session eingef gt wurde In diesem Beispiel verwende ich eine Stored Procedure um zwei Datens tze in unterschiedliche Tabellen einzuf gen Die erste Anweisung gibt einen inkrementellen Wert zur ck welcher in der zweiten Anweisung verwendet wird CREATE PROCEDURE so Tes
176. geben sich immer wieder des Abends Kurzdiskussionen Zu bestimmten Themen Hier nun die Frage bezuglich typisierter Collections strongly typed collections und wie diese in der Praxis anzuwenden sind Anstatt Generics via List lt Person gt ZU verwenden wurde sich anbieten eine PersonCollection mittels public class PersonCollection List lt Person gt zu erstellen und diese zu nutzen Ist das sinnvoll Pers nlich bevorzuge ich die Generics Variante da hier auf den ersten Blick ersichtlich ist was auch tats chlich gemeint ist Lesbarkeit und Verst ndnis des Codes Die zweite Variante w rde ich vorziehen wenn zus tzliche Funktionen implementiert werden sollen 2 2 21 Reflection Geschwindigkeitstest Da ich mir heute wieder mal einen O R Mapper genauer angesehen habe Name der Redaktion bekannt ist mir ein sehr wesentlicher Punkt aufgefallen Nat rlich arbeiten diese Frameworks mit Reflection Selten wird jedoch tats chlich auf Geschwindigkeit gesetzt so eben das Framework welches ich heute in die Finger bekommen habe Daraufhin musste ich gleich einen Test machen Der Testfall ist ein sehr einfacher der im Normalfall keine wesentliche Last verursacht Es wird aus einer Assembly lediglich ein bestimmter Typ aufgrund seines NET BlogBook Ausgabe 4 Namens geladen und alle Eigenschaften ausgegeben Die ganze bung wird 200 000 Mal ausgef hrt was in einer mittelgro en Anwendung nicht sehr viel ist Wenn man da
177. gef gt wird wenn diese beispielsweise als Ausgabe f r Log Informationen verwendet wird Hier wie ich es mache NET BlogBook Ausgabe 4 this LogRtb SelectionStart this LogRtb Text Length this LogkRtb Text My additional Jog text sas this LogRtb ScrollToCaret 2 3 11 Mehrzeiliges Editieren von String Eigenschaft im Eigenschaften Fenster Unter Visual Studio 2005 NET 2 0 ist es m glich Properties des Typs String mehrzeilig zu editieren Description abell v DoubleBuffered labell Enabled Description Solution Explore Abbildung 13 Mehrzeiliges Editieren Erstellt man ein benutzerdefiniertes Steuerelement sollen eigene String Eigenschaften idealerweise ebenfalls mit dieser Hilfe ausgestattet werden Hierzu ist ein entsprechendes Attribut zu setzen Localizable true Editor System ComponentModel Design MultilineStringEditor System Design Version 2 0 0 0 Culture neutral PublicKeyToken bO3f5f7flld50a3a typeof UITypeEditor public string Description get return this DescriptionLabel Text set this DescriptionLabel Text value Ab sofort bietet das benutzerdefinierte Steuerelement ebenfalls dieses Feature an und mehrzeiliger Text kann bequem eingegeben werden 2 3 12 UserControls im Skype Stil selbst erstellt Beitr ge zur Erstellung von UserControls finden sich im Internet wahrlich viele Dennoch wird immer wieder danach gefragt wodurch ich mich schlie lic
178. gnostics namespace Aslest class Program static void Main string args Stopwatch sw new Stopwatch object o new MyDemoClass Sw Start for int 0 1 amp 121000000000 2 MyDemoClass mdc o as MyDemoClass SsWw 2L 0pl Console WriteLine as sw ElapsedMilliseconds sw Reset sw Start for int i 0 i lt 1000000000 i NET BlogBook Ausgabe 4 MyDemoClass mdc MyDemoClass o SW o COP Console WriteLine cast sw ElapsedMilliseconds Console ReadKey public class MyDemoClass Output as 6135 cast 5583 Fazit In vielen F llen w re der as Operator einem Cast vorzuziehen da hier einer eventuellen Exception vorgebeugt werden kann im Falle eines Casts m sste davor via is Operator berpr ft werden ob es sich um den gew nschten Typ handelt Auf jeden Fall muss das Objekt anschlie end auf null berpr ft werden 2 2 86 Enterprise Library NLog Trace Listener im Eigenbau Eventuell hat sich der werte Leser die Enterprise Library 1 bereits einmal genauer angesehen Wenn nicht dann m chte ich zuerst ein paar einf hrende Worte loswerden Die Enterprise Library besteht aus sogenannten Blocks Jeder Block besitzt eine eindeutige Aufgabe Beispielsweise gibt es den Logging und den Exception Handling Block Der Vorteil besteht darin dass es mit Hilfe der Blocks das Verhalten ber die Konfiguration App config Web config
179. gt public static string GetUrlResponse string url string username string password string content null WebRequest webRequest WebRequest Create url if username null password null NetworkCredential networkCredential new NetworkCredential username password webRequest PreAuthenticate true webRequest Credentials networkCredential WebResponse webResponse webRequest GetResponse StreamReader sr new StreamReader webResponse GetResponseStream Engoding ASCLI StringBuilder contentBuilder new StringBuilder while l sr Peek contentBuilder Append sr ReadLine contentBuilder Append r n content contentBuilder ToString return content Tostring 7 Der Aufruf sieht wie folgt aus string responseFromUrl GetUrlResponse http www google de null null 2 2 55 ApplicationPath in C Konsolenanwendungen Ab und zu ben tigt man mal den aktuellen Pfad indem die Konsolenanwendung ausgef hrt wird In Winforms Anwendungen bekommt man dieses ber NET BlogBook Ausgabe 4 Application StarupPath zur ck geliefert In der Konsolenanwendung fehlt diese Klasse allerdings Damit ich trotzdem den aktuellen Pfad auslesen kann habe ich folgende Zeilen geschrieben static string ApplicationPath get return Path GetDirectoryName System Reflection Assembly GetExecutingAssembly Location 2 2 56 Read From Clipboard Vielleicht gan
180. h hinreissen lie eine kurze Demo zu erstellen Gezeigt wird wie ein ProgressBar im Skype Stil erstellt wird Grundlegend ist eine neue Klasse zu erstellen welche von UserControl ableitet Da NET BlogBook Ausgabe 4 das Control via GDI gezeichnet wird muss an dieser Stelle das OnPaint Event berschrieben werden was wir entsprechend im Konstruktor mitteilen m ssen this SetStyle ControlStyles OptimizedDoubleBuffer true this SetStyle ControlStyles AllPaintingInWmPaint true this Serstyle Control tyles UserPaint true Wird ControlStyles UserPaint auf true gesetzt m ssen alle notwendigen Aktualisierungen der Oberfl che selbst vorgenommen werden Die beiden weiteren Styles sind lediglich Hilfen die ein Flackern beim Neuzeichnen verhindern bzw unterdr cken sollen Ist dieser Schritt getan muss die Logik implementiert werden Dazu geh ren die entsprechenden Eigenschaften zur Bestimmung des Minimums Maximums und des aktuellen Values wie wir es von einer Standard ProgressBar gewohnt sind Wurde auch dies erledigt geht es daran das Control zu zeichnen Hierzu werden ich allerdings den gesamten Sourcecode des UserControls auflisten using System using System Collections Generic using System ComponentModel using System Drawing using System Data using System Text using System Windows Forms using System Drawing Drawing2D namespace SkypeLookControls public partial class SkypeProgressBar
181. hen Objektes cachen und so diverse Vorg nge beschleunigen k nnen Das sind jedoch nicht die einzigen M glichkeiten So gibt es noch Synchronization Proxies und viele weitere Ein einfaches Grundger st eines Proxies findet sich nachfolgend using System using System Collections Generic using System Text namespace ProxzyFarttern class Program static voii Main string args CalculatorProxy proxy new CalculatorProxy Console WriteLine string Forma 22 17 10 proxy ada l4 1773 Console WriteLine string Former i 12 17 Console Read 0 proxy Sub 12 17 public interface ICalculator decimal Add decimal x decimal y decimal Sub decimal x decimal y xe No a class Calculator 2 ICalculator public decimal Add decimal x decimal y recur x y ae decimal Sub decimal x decimal y recurn xX y Public class Galeulats frozsy ICalculator private Calculator calculator new Calculator public decimal Add decimal x decimal y return Calculator Agd x y ee decimal Sub decimal x decimal y return Calculator subix y NET BlogBook Ausgabe 4 Dies stellt die einfachste Variante eines Proxies dar Ein vereinfachter Protection Proxy konnte beispielsweise so aussehen Erweiterung des obigen Beispiels using System using System Collections Generic using System Text using System Security namespace ProxyFartern class Program
182. hen Varianten getestet werden soll Sinnvollerweise wird der Unit Tests parallel zur zu testenden Klasse entwickelt Dadurch erhoht sich zwar der Aufwand fur die Entwicklung von Klassen man bedenke aber das gro e ABER Durch die standigen Test Durchlaufe kristallisieren sich sehr schnell Fehler heraus bzw wo es nach einer durchgef hrten nderung ein wenig zwickt Sollte dann doch einmal ein Fehler durchrutschen kann mit Hilfe der Unit Tests dieser recht schnell nachvollzogen bzw berhaupt gefunden werden Das erspart sehr viel Zeit Vermutlich mehr als man sich durch das Nichtschreiben von Unit Tests sparen w rde Jeder Leser kann sich nun selbst ein Bild davon machen Einfach die durchschnittliche Anzahl der Bugs heranziehen und kurz dar ber nachdenken wie schwer so manche davon zu finden ist Viele davon w ren mit Unit Tests erst gar nicht zustande gekommen Ich hoffe dieser Beitrag regt zum Nachdenken und Nachrechnen an und liefert so f r jeden von Euch ein Ergebnis bezgl der Sinnhaftigkeit von Unit Tests 4 3 3 Grundlagen Testgetriebene Entwicklung test driven Development Die testgetriebene Entwicklung kommt aus dem Bereich der agilen Softwareentwicklung und legt fest dass Software Tests vor der Entwicklung der zu testenden Komponenten erstellt werden Zur Verwendung kommen so genannte Grey Box Tests Diese vereinen die Vorteile der White Box Tests 1 und der Black Box Tests 2 in sich 1 Die Software Tests werden
183. his Width this Height _borderColor _borderWidth ButtonBorderStyle Solid _borderColor _borderWidth ButtonBorderStyle Solid _borderColor _borderWidth ButtonBorderStyle Solid borderColor _borderWidth ButtonBorderStyle Solid g Dispose ReleaseDC Handle NDC Zus tzliche Erweiterungen sind nat rlich denkbar und k nnen gerne von jedem vorgenommen werden 2 2 83 C Feststellen ob eine Assembly signiert wurde strong named Wurde eine Anwendung signiert dann m ssen ebenfalls alle referenzierten Assemblies signiert also strong named sein Aussnahme Assemblies werden zur Laufzeit geladen In diesem Fall muss diese nicht signiert sein Wie kann man nun aber feststellen ob eine Assembly signiert wurde oder nicht Hier ein kurzes Code Beispiel Assembly asm Assembly GetAssembly typeof TheType if asm null AssemblyName assembly asm GetName byte key assembly GetPublickey bool isSigned key Length gt 0 Console WriteLine Is signed 0 isSigned Dies kann sehr nutzlich sein wenn beispielsweise Plugins geladen werden die jedoch signiert sein sollten Hier gilt es jedoch aufzupassen Wird eine Assembly in die aktuelle Anwendungsdom ne geladen kann die Assembly nicht mehr explizit entladen werden Es empfiehlt sich daher die Assembly ber einen Remote Proxy in NET BlogBook Ausgabe 4 eine eigene Anwendungsdomane zu laden auf Signierung hin zu berpr fen und bei Beda
184. hl auf SQL Server Authentication NET BlogBook Ausgabe 4 a ty dah X Ea Or O Q 3 3 c 2 lt w m lt m a m oO oom J 3 w a m S i server Community Server Database Login Select the database login that Community Server will use to connect to the database IP address or Server Name windows Authentication SQL Server Authentication Username Password Done internet 100 Abbildung 69 Community Server Installation 3 Der Installer versucht nun eine Verbindung mit der Datenbank herzustellen War dies erfolgreich kann die gew nschte Datenbank ausgew hlt werden Wr Q http test veloursnebel de installer Default aspx iv bed x 0 i Iel 2 gt w wt Q community Server Web Installer fa gt A dh ir Ge i SCIVO Select Database Instance Choose the database where you would like to to install Community Server Available databases im Done internet 100 Abbildung 70 Community Server Installation 4 Nun k nnen verschiedene Optionen ausgew hlt werden die die Einrichtung der Datenbank beeinflussen NET BlogBook Ausgabe 4 Script ASP NET MemberRoles Diese Option installiert die ASP NET Memberroles Da lediglich der Community Server die Datenbank verwendet kann diese Option aktiviert bleiben Nutzen mehrere Anwendungen die ASP NET Memberroles muss diese Option deaktiviert werde
185. hout grid e Support for two languages C and Java e Declaration parser for class members to edit them faster e Strict syntactical semantical controlling e Configurable diagram styles e Multilanguage user interface e Printing saving to image Geplante Features e Association name role and cardinality fields e Zooming in out e Packages e Class and member comments for documenting e Source generator e Disassemble NET assemblies Es lohnt sich auf jeden Fall das Projekt im Auge zu behalten 5 25 LINQPad LINQ Ausdrucke testen Joseph Albahari hat ein Tool geschrieben mit dem es auf einfache und schnelle Weise m glich ist LINQ Ausdr cke zu testen hnlich dem SQL Query Analyzer Das Tool unterst tzt sowohl LINQ to Objects als auch LINQ to SQL und LINQ to XML Nach dem Download kann das Tool direkt ohne Installation gestartet werden vorausgesetzt das NET Framework 3 5 Beta 2 ist installiert NET BlogBook Ausgabe 4 Mehr Infos sowie den Download gibt es hier NET BlogBook Ausgabe 4 6 Microsort OFFICE 6 1 Word 2007 Custom Ribbons erstellen Im Beitrag Word 2007 Winamp Controller habe ich bereits ein Beispiel fur Custom Panes gezeigt Dieser Beitrag zeigt nun wie einfach ein Custom Ribbon Ribbons werden die neuen Menuleisten unter Office 2007 genannt erstellt werden kann Fur den Moment muss man sich mit dem Sourcecode zufrieden geben Entsprechende Tutorials sind in Arbeit und werden demn chst ver ffentl
186. hreren Jahren nutze ich das Visual Studio Addin CopySourceAsHtml um Sourcecode in Html umzuwandeln Leider gibt es momentan noch keine Visual Studio 2008 Version Trotzdem ist es m glich das Addin zu nutzen Zun chst m ssen alle zugeh rigen Dateien aus dem Visual Studio 2005 Addins Ordner in den Visual Studio 2008 Add Ins Ordner kopiert werden Unter Windows XP befinden sich die Dateien im Pfad NET BlogBook Ausgabe 4 C Dokumente und Einstellungen lt BENUTZER gt Eigene Dateien Visual Studio lt 2005 gt lt 20008 gt AddIns CopySourceAsHtml AddIn CopySourceAsHtml dll CopySourceAsHtml dll config CopySourceAsHtml pdb Nun muss die angegebene Visual Studio Version in der Datei CopySourceAsHtmi AddiIn auf 9 0 ge ndert werden lt xml version 1 0 encoding UTF 16 standalone no gt lt Extensibility xmlns http schemas microsoft com AutomationExtensibility gt lt HostApplication gt lt Name gt Microsoft Visual Studio Macros lt Name gt lt Version gt 9 0 lt Version gt lt HostApplication gt lt HostApplication gt lt Name gt Microsoft Visual Studio lt Name gt lt Version gt 9 0 lt Version gt lt HostApplication gt lt Addin gt lt FriendlyName gt CopySourceAsHtml lt FriendlyName gt lt Description gt Adds support to Microsoft Visual Studio 2005 for copying source code syntax highlighting and line numbers as HTML lt Description gt lt Assembly gt CopySourceAsHtml dl1l lt Assemb
187. hscoreList Sort Debug WriteLine Highscore Debug Nriteline 1 ee eu wi foreach Highscore hscore in highscoreList Debug WriteLine hscore Wie zu sehen ist gar nicht so schwierig und keinesfalls aufw ndig 2 2 67 Eigenschaften und Zugriffsmodifizierer Man nehme folgendes Interface Interface public interface IPerson string Firstname get set string Lastname get set DateTime Birthday get Dieses Interface beschreibt dass die Eigenschaft Birthday nur gelesen werden darf ein Setzen ist nicht moglich Um dies aber in der Assembly zu erlauben in der sich auch das Interface befindet kann folgendes definiert werden public class Person Person private string Tirstname null Private string lastname null private DateTime birthday public string Firstname get 1 return this firatname ser 1 tils Tirstoame yalues j public string Lastname get 1 returni thie lastname set 1 this lastname value public DateTime Birthday get 1 return this Birthday internal ser I this Birthday value j NET BlogBook Ausgabe 4 Der internal Zugriffsmodifizierer sorgt dafur dass der Setter in derselben Assembly aufgerufen werden kann Dies ist in vielen Fallen sehr hilfreich 2 2 68 Generische Methoden und deren Aufruf Einfach auf der Zunge zergehen lassen oder in eine Consolen Anwendung kopieren und austesten class Program static void
188. i F Aschtschreibpr fung Ei Optionen lt gt Server Error in ValidationSummary Application Compilation Error Description An error occurred during the complalion of a resource required to service this request Please resiew the following specific error details and modify your Source Gade re Compiler Error Message CSHG The type name WebFoemi does mod exist in ihe type System Web U Pisi onno Vakdallanzurmesany Source Error Line 149 public webformi_aspx Line 150 string dependencies Line 151 C Validationsummnary webForml this appRelativevirtualPath wehforml aspx Line 152 if Ciglobal 4SP webforml_aspx 0_initialized false Line 153 global ASP webforml_aspx _stringkesource this Readstr inghesourcel Source Pile CN ref MET Framework 0 S07 SiTemporary ASP HET Files bakdabormummery idalje Ge ea pp Web webionmi asp odcabfdi zzerpsdd ce Line 151 Version Information Merosofl NET Framework Version 0 50727 42 ASP NET Verseer 0 50727 42 Fertig Abbildung 31 Reservierte ASP NET Projektnamen Der Grund fur die Fehlermeldung ist klar nur hatte Visual Studio die Namen der Projekte bzw DLLs vielleicht schon beim Anlegen auf reservierte Worter Uberprufen sollen Ich denke dabei an unbedarfte User die Ihr erstes Projekt vielleicht TextBox nennen gerade weil Sie mit diesem Control beginnen 2 4 33 SiteMap menu with icons M chte man Icos in der Sitemap verwenden sollte man sich
189. i wird erstellt xml version 1 0 gt lt Assembly gt lt Namespace Name norberteder gt lt Namespace Name com gt lt Namespace Name 1lib gt lt Namespace Name globalization gt lt Type Name Translator gt lt Method Sig instance string get DefaultLanguage gt lt Method Sig instance void set _Defaultlanguage string gt lt Method Sig instance string get CurrentLanguage gt lt Method Sig instance void set CurrentLanguage string gt lt Method Sig instance void RegisterGlobalizationFile string gt lt Method Sig instance void Initialize gt lt Demand gt lt PermissionSet version 1 class System Security PermissionSet gt lt IPermission version 1 class System Security Permissions FilelOPermission mscorlib Version 2 0 0 0 Culture neutral PublicKeyToken b77a5c561934e089 PathDiscovery AllFiles gt lt PermissionSet gt lt Demand gt san l302 gt lt PermissionSet version 1 class System Security PermissionSet gt lt IPermission version 1 class System Security Permissions FilelOPermission mscorlib Version 2 0 0 0 Culture neutral PublicKeyToken b77a5c561934e089 PathDiscovery AllFiles gt lt PermissionSet gt lt Sandbox gt lt Method gt lt Method Sig instance string Translate struct TranslatorSelector string gt lt Method Sig class Translator get GetTranslator gt lt Method Sig void cctor gt lt
190. ic Menu Creator Beispiel Sollten zu diesem Beispiel Fragen auftauchen dann k nnen diese nat rlich ber die Kommentar Funktion gestellt werden Der Download liegt als Visual Studio 2005 Solution vor 2 3 4 UserControls eines Namespaces finden Auf die Frage hin wie man denn alle UserControls eines bestimmten Namespaces herausfinden kann um diese dann dynamisch in ein Container Control zu verfrachten schrieb ich eine kleine Testanwendung die zeigt wie man alle Klassen aus einem bestimmten Namespace bekommt Zus tzlich wird die Information ausgegeben ob es sich dabei um ein UserControl handelt oder nicht Download Beispiel Projekt VS 2005 Solution 40KB Bei dieser L sung ist jedoch anzumerken dass sich ein Namespace auch ber mehrere Assemblies hinweg erstrecken kann Dies wurde nicht ber cksichtigt Das Beispiel sollte auch eher einen Denkanstoss geben als eine fix fertige Solution liefern 2 3 5 NET 2 0 ComboBox und AutoComplete Unter NET 2 0 gibt es eine sehr einfache M glichkeit der ComboBox eine AutoComplete Funktion bzw eine Vorschlags Funktion zu verpassen Dazu einfach folgende Schritte ausf hren NET BlogBook Ausgabe 4 1 AutoCompleteCustomSource setzen zus tzlich zur normalen DataSource 2 AutoCompleteMode auf Suggest stellen 3 AutoCompleteSource auf ListItens stellen Fertig ist die Hexerei und der User freut sich uber die verbesserte Usability Statt Suggest Punkt 2 gibt es auch noch wei
191. icht Soviel sei verraten Ein wenig Windows Presentation Foundation und schon kann es losgehen Das Endergebnis des Beispiels 1 sieht folgenderma en aus Ea al mer oe Eg Documentl Microsoft Word IX Home Insert Page Layout References Mailings Review View Add Ins User Info T Tab ie Insert User Info Ul Group This is my username Abbildung 87 Word 2007 Custom Ribbons erstellen Das Beispiel liegt in einer Visual Studio 2005 Solution vor und wurde in C erstellt Zu diesem Thema steht bereits ein Tutorial 2 zur Verf gung NET BlogBook Ausgabe 4 1 Download Word 2007 Custom Ribbon Beispiel 2 Zur Tutorials Page 6 2 MS Outlook Makros reloaded So nachdem es gestern den Mail mittels Shortcut als unread markieren Tag gegeben hat hab ich noch ein kleines Makro gebaut welches mir mittels Shortcut den Junk E Mail Folder und auch gleich den Geloschte Objekte Order leert Damit ist s per Tastendruck sauber im Outlook Hier nun das Makro Sub RemoveJunkAndDeleted Dim mItem As Mailltem Dim mNamespace As NameSpace Dim junkFolder As MAPIFolder Dim deletedFolder As MAPIFolder Set mNamespace Application GetNamespace MAPI Set junkFolder mNamespace GetDefaultFolder olFolderJunk For Each mItem In junkFolder Items mItem Delete Next Set deletedFolder mNamespace GetDefaultFolder olFolderDeletedlItens For Hach mItem In deletedFolder Items
192. ie Strings unter NET intern behandelt werden Strings sind unter NET immutable Das bedeutet dass sie nicht ver nderbar sind Man nehme das folgende Beispiel string muh muh muh kuh Hier sieht das ganze so aus dass zuerst ein String Objekt mit dem Value muh gebildet wird M chten wir an muh den String kuh anh ngen passiert folgendes Es wird ein neues String Objekt am Heap erzeugt Die Gr te L nge des String Objektes betr gt muh Length kuh Length Nun wird das Ergebnis aus muh kuh in das neue String Objekt kopiert Das alte String Objekt muh wird nun f r die Garbage Collection freigegeben Was sagt uns das jetzt Es sollte wenn m glich der StringBuilder verwendet werden Dieser zahlt sich aber erst nach einigen String Operationen aus da die Instantiierung des StringBuilders nat rlich auch Kosten verursacht Ich nehme hier als Richtwert 5 bis 7 String Operationen 2 2 38 Einf hrung Garbage Collector Garbage Collection unter C sieht im Prinzip folgenderma en aus NET BlogBook Ausgabe 4 Der GC wird meist dann angetriggert wenn der Heap Speicher aufgebraucht sprich voll ist manuell gestartet wird oder wenn ein anderes Programm mehr Speicher benotigt als aktuell noch frei ist Der GC iteriert durch den Heap und markiert zuerst jedes Objekt als Garbage also setzt es auf zu verwerfen Danach wird nochmals jedes Objekt rekursiv berpr ft ob Referenzen darauf zeigen es also
193. ieder schreibt nicht in der besagten Assembly befindet und in der zweiten Solution mit der Konsolen Anwendung dynamisch geladen werden sollte wurde eine SerializationException geworfen Beim Binary Formatter wird unter anderem die genaue Assembly Bezeichnung Versionsnummer etc hinterlegt die zwar in diesem Fall zusammenpassen w rde aber dennoch konnten die entsprechenden Typen nicht gefunden werden Referenz war gesetzt Assembly wurde in die aktuelle AppDomain geladen Ein Ausweg ist hierbei das Setzen der Eigenschaft Binder des BinaryFormatters Durch eine Ableitung der Klasse SerializationBinder kann das Verhalten wie Typen geladen bzw gefunden werden selbst beeinflusst werden In meinem Fall habe ich folgendes fabriziert was dann auch wunderbar funktionierte public class Binder SerializationBinder public override Type NET BlogBook Ausgabe 4 BindToType string assemblyName string typeName Type type null string shortAssem assemblyName Split 0 Assembly assemblies AppDomain CurrentDomain GetAssemblies foreach Assembly assem in assemblies if shortAssem assem FullName Split 0 type assem GetType typeName break return Type Wer weiterf hrende Informationen diesbez glich ben tigt wird entweder via Google f ndig oder stellt seine Frage einfach als Kommentar Ich versuche diese dann zu beantworten 2 2 82 C Rahmenfarbe beim Panel ndern Durch das
194. ieht schlie lich folgenderma en aus Abbildung 14 Progressbar im Skype Stil 2 4 ASP NET 2 4 1 ViewState und TextBox Control Das Attribut EnableViewState gibt an ob der Zustand des zugeh rigen Controls im ViewState gespeichert werden soll Dies ist nat rlich auch bei dem TextBox Control der Fall Allerdings ist nach einem PostBack der Zustand noch immer vorhanden obwohl das Attribut auf false gesetzt wurde Der Grund hierf r ist das PostBack selbst Wird ein Formular abgeschickt werden die Daten per POST oder GET an die Zielseite geschickt Da die Zielseite gleich der Quellseite ist stehen somit die Daten auch ber PostBacks hinweg zur Verf gung M chte man den Zustand des Controls explizit zur cksetzen muss dies manuell erledigt werden 2 4 2 Bilder im GridView anzeigen Bilder im GridView anzuzeigen erscheint den meisten erfahrenen ASP NET Usern als ziemlich einfach Dennoch wird diese Frage h ufig in Foren gestellt Zusammenfassend kann man sagen dass es wirklich mehr als einfach ist wenn man nur die richtigen Schritte kennt Dieses Beispiel geht davon aus dass die Bilder im Dateisystem vorliegen und der Name in einem Feld der Datenbank gespeichert ist NET BlogBook Ausgabe 4 Column Name Data Type Allow Mulls Fo ant Marne warchar S0 Surname warchar S0 ImageName varchar Abbildung 15 Bilder im GriedView 1 Nachdem eine Verbindung zur Datenbank per SqlDataSource Control hergestellt wurde k n
195. iendung reagieren zu k nnen Definiert man z B die Dateiendung rss in der Web Config leitet man die Verarbeitung an eine entsprechend Klasse die das IHttpHandler Interface implementiert weiter Diese Klasse bernimmt nun die Ausgabe des XML welches man hinter der Endung rss erwarten w rde In diesem Beispiel ist es aber lediglich gewollt ein Bild per Stream auszugeben F gt man eine ashx Datei dem Projekt hinzu findet man eine Klasse mit der Methode ProcessRequest und der Eigenschaft IsReusable vor using System using System Web public class ClIImage IHttpHandler public void ProcessRequest HttpContext context context Response ContentType text plain context Response Write Hello World public bool IsReusable get return false NET BlogBook Ausgabe 4 Um den Zugriff auf den SessionState und somit den gespeicherten Text in der Session zu ermoglichen muss die Generic Handler Klasse zunachst um das Interface TRequiresSessionState erweitert werden public class CIImage IHttpHandler IRequiresSessionState Anschlie end muss der Code zum Erstellen des Bildes in die Methode ProcessRequest kopiert und der ContentType entsprechend der Ausgabe ver ndert werden public void ProcessRequest HttpContext context i context Response ContentType image jpg Captchalmage Captchalmage ci new Captchalmage Captchalmage context Session CaptchalmageText ToString 200 50 Cent ry S
196. igen Gesichtspunkt sollte aber durchaus klar sein wann eine Verwendung sinnvoll ist und wann weniger 2 2 75 Anonymous Delegates Dem einen oder anderen m gen anonyme Methoden oder beispielsweise anonyme Typen wie sie mit C 3 0 kommen bekannt sein In diesem Beitrag m chte ich ein wenig ber anonyme Delegates schreiben und wozu diese ben tigt werden sind ohnehin sehr hnlich zu anonymen Methoden Zuerst gleich das Beispiel anhand dessen die Erkl rungen vorgenommen werden using System using System Collections Generic using System Text namespace AnonymousDelegatesSample public class Book public string Title public decimal Price public class Person public string Firstname public string Lastname public List lt Book gt Booklist public decimal Discount public DiscountCalculator CalculationMethod public delegate decimal DiscountCalculator decimal price public class Example private decimal CalculateDiscount decimal price return price new decimal 0 05 public void ShowExample DisgountEalsulatsr default sale new DiscountCalculator CalculateDiscount Diseo9untlaleulator specialcustomer calo delegate decimal price return price new decimal 0 09 by Book bookl new Book book1 Title ASP NET for dummies bookl1 Price new decimal 35 99 Book Book2 new Book Book2 Title C for dummies Book2 Price new decimal 49 99 List lt Book gt bookList
197. il wurde ich nun mehrfach gefragt ob es auch m glich ist Spalten auf Read Only zu setzen und die Spalte locked nicht anzuzeigen Hier nun die zugegeben schnelle L sung protected void GridViewl RowDataBound object sender GridViewRowEventArgs e if e Row RowType DataControlRowType DataRow CheckBox chk CheckBox e Row Cells 2 FindControl CheckBox1 if chk Checked e Row Cells 3 Enabled false e Row Cells 2 Visible false Die Spalte locked wird mit Hilfe der Eigenschaft Visible einfach ausgeblendet Wichtig ist dass diese Anweisung au erhalb der i Anweisung ausgef hrt wird da ansonsten die berschrift der Spalte weiterhin angezeigt wird 2 4 17 Read Only Datens tze im GridView Die Aufgabe ist es bestimmt Zeilen im GridView auf Read Only zu setzen und somit die M glichkeit diese zu l schen oder zu bearbeiten zu deaktivieren In diesem Beispiel wird folgendes Datenbank Layout verwendet Data Column Name Data Type Allow Mulls int varchar 50 varchar 50 bit Abbildung 26 Readonly Datensatze im GridView 1 Die Spalte locked zeigt an ob die Spalte bearbeitet oder gel scht werden darf Zun chst muss das SqlDataSource Control konfiguriert werden Neben dem Connection String und dem Select Command werden auch Update und Delete Command ben tigt NET BlogBook Ausgabe 4 Anschlie end kann das GridView konfiguriert und an das SqlDataSource Control gebunden werden Bis
198. in Parameter vom Typ int namens value1 dann darf der es nicht sein dass der Typ derselbe bleibt sich jedoch der Name ndert Diese M glichkeit besteht nicht berschreibung Beim berschreiben einer Methode sieht dies anders aus In diesem Fall bleibt die Signatur dieselbe Das hei t weder der Ruckgabewert noch der Methodenname noch die Parameter auch nicht deren Typen Parameternamen Anzahl der Parameter ndern sich Hier ndert sich der Innenteil der Methode sprich die Funktionalit t Beispielsweise wird public virtual int Calc int valuel int value2 return valuel value2 ZU return valuel value we override int Calc int valuel int value2 Einsatzgebiete berladung wird beispielsweise verwendet wenn eine Methode mehrere optionale Parameter besitzen soll bzw unterschiedliche Eingangswerte haben soll um Grunde aber entsprechend der Parameter eine entsprechende Aufgabe l st berschreibung kommt bei der Vererbung zu tragen So kann eine Basisklasse die Implementierung einer Methode vorschreiben die jedoch bei jeder Ableitung eine unterschiedliche Aufgabe besitzt aufgrund der weiteren Verwendung jedoch immer die gleiche Signatur besitzen muss 4 1 3 Kopier Konstruktor in C Unter vielen Sprachen ist ein Kopier Konstruktor standardm ig f r ein Objekt vorhanden Bei C ist dem nicht so Nachfolgend m chte ich kurz zeigen wie ein Kopier Konstruktor in C realisiert wird Im Ans
199. inblick in das Thema Unit Tests unter Visual Studio und zeigt durchaus dass sich dahinter keine komplizierten Abl ufe NET BlogBook Ausgabe 4 verbergen Stobert man ein wenig in den angegebenen Internet Ressourcen herum k nnen sehr schnell gute und hilfreiche Ergebnisse erreicht werden Referenzen 1 http www testdriven net 2 http www nunit org 4 3 7 Nicht ausgef hrte UnitTests mit TestDriven NET Grade wieder druber gestolpert Mit TestDriven NET ist es m glich UnitTests bequem aus Visual Studio zu starten und auszuwerten ber das Kontextmen der Projektmappe ist es au erdem m glich alle vorhandenen Tests des Projekts zu starten Allerdings sollte man darauf achten dass die Test Klassen auch tunlichst als public gekennzeichnet sind Ansonsten werden diese Tests nicht ausgef hrt Wer noch nie etwas von UnitTests oder TestDriven NET geh rt hat sollte einen Blick in die aktuelle Ausgabe der Zeitschrift Visual Studio one werfen und sich den Artikel Visual Studio goes Unit Testing von Norbert Eder zu Gem te f hren 4 3 8 Externes Configuration File benutzen Heute musste ich in einer Konsolen Anwendung ein Configuration File benutzen dass nicht direkt zur Anwendung gemappt ist Noch in blasser Erinnerung an das 1 1 Framework hatte mich mich schon mit dem Gedanken abgefunden mir einen XML Parser zu schreiben der die entsprechend Eintr ge sucht Tats chlich aber bietet das Framework 2 0 daf r entsprechende
200. ine Zeile Code System DateTime Now ToString Beispiel 16 08 1881 12244331 Weiter ist es m glich mit den Methoden ToShortDateString ToLongDateString ToShortTimeString und ToLongTimeString jeweils das Datum oder die Uhrzeit in kurzer und langer Form auszugeben M chte man allerdings das Datum z B im Format 16 09 1981 13 44 51 formatieren sind Einsteiger h ufig versucht dies per Replace zu l sen Allerdings bietet C eine berladung der Methode ToString an sodass ein Format in Form eines String bergeben werden kann Dieses Format wird mit K rzeln angegeben Das K rzel yyyy steht z B f r ein vierstelliges Jahr Beispiel 2007 w hrend das K rzel MM den aktuellen Monat Beispiel 06 ausgibt Das oben gezeigte Problem kann nun sehr einfach gel st werden System DateTime Now ToString dd MM yyyy HH mm ss Beispiel 16 09 1981 15 46 34 Auf diese Weise sind viele verschiedene Ausgaben moglich ohne den aufwendigen Umweg uber String Operationen gehen zu mussen Eine komplette Ubersicht der Format Kurzel ist in der MSDN vorhanden 2 3 Windows Forms NET BlogBook Ausgabe 4 2 3 1 ComboBox als DropDownList kann kein Text gesetzt werden Wer eine ComboBox verwendet und die Eigenschaft DropDownStyle auf DropDownList gesetzt hat kann keinen Text mehr setzen Dadurch entf llt auch die M glichkeit einen Default Text zu setzen wenn kein Item ausgew hlt ist wurde Dem kann durch eine kurze und
201. inen Blick auf die MSBuild Scripts f r Sandcastle werfen 5 4 ReSharper UnitRun kostenloser Testdriven NET Gegenspieler Von JetBrains gibt es ein kostenloses Visual Studio Add In mit dem Unit Tests ausgefuhrt werden konnen ReSharper TestRun 1 Unterstutzt werden folgende Testing Frameworks e NUnit e csUnit Ein n herer Blick auf dieses Tool lohnt sich auf jeden Fall 1 UnitRun Homepage NET BlogBook Ausgabe 4 5 5 CCTray CruiseControl NET Build Fortschritt im berblick CCTray 1 Damit l sst sich der Build Progress berwachen und das Tool erlaubt es in einige Operationen einzugreifen 1 CCTray Website 5 6 CCNetConfig Konfigurationsdateien einfach erstellt Wer eine CruiseControl NET 1 CruiseControl NET Installation sein Eigen nennt dem d rfte CCNetConfig 2 als Unterst tzung hilfreich sein Mittels grafischer Oberfl che k nnen damit CC NET Konfigurations Dateien einfachst erstellt werden v CCNetConfig Ele View Help DEAZ CruiseControl MA Test Project Triggers Tasks gt Publishers ae Project Extensions Abbildung 63 CCNetConfig 1 CruiseControl NET 2 CCNetConfig Name AnifactDirectory External Links Labeller ModificatonDelaySeconds FublishExceptions SourceContral State WebUUrl WorkingDirectory EEE en u ER 0 tems Default The name of your project This must be unique for any given CruiseControl NET server a
202. ing return ConvertStringToByteArray fileContent Dazu braucht man nat rlich noch eine Methode die den Stream zum Client schickt private void DownloadFile byte file string filename Response AddHeader Content disposition attachment filename filename Response AddHeader Content Length file Length ToString Response ContentType application octet stream Response BinaryWrite file Response End Interessant ist jetzt nat rlich die Methode ConvertStringToByteArray Diese konvertiert wie der Name schon sagt einen String in ein Byte Array mit Hilfe der Klasse UnicodeEncoding byte ConvertStringToByteArray string stringToConvert return new UnicodeEncoding GetBytes stringToConvert NET BlogBook Ausgabe 4 Mehr muss man im ersten Moment auch nicht machen Mit diesen paar Zeilen spart man sich nun den Umweg ber das Filesystem und schickt den Stream der Datei direkt zum Client Das Beispielprojekt kann man hier herunterladen 2 2 52 Fehlender Namespace Wahrscheinlich kennt die Shortcuts schon jeder aber ich bin gerade erst durch Zufall drauf gesto en Wenn man Klassen verwendet deren Namespace noch nicht eingebunden ist springt man entweder mit den Cursor an den Anfang der Datei und f gt diesen per Hand hinzu oder man verwendet den Shortcut Shift Alt F10 private void GenerateFile i StringBuilde protected void sender Ewi f System Text St
203. ing des Bildes weshalb auch der gesamte Html Code entfernt werden muss In der Page Load Methode wird das Bild erstellt und an den OutputStream des Response Objektes gesendet protected void Page Load object sender EventArgs ej Captchalmage ci new Captchalmage Session CaptchaImageText ToString 200 20 Century 221291595 7 Response Clear Response ContentType image jpeg NET BlogBook Ausgabe 4 ci Image Save this Response OutputStream ImageFormat Jpeg ci Dispose Die Seite Default aspx bernimmt die Anzeige des Captcha Images und auch die Generierung der angezeigten Zeichen Ein einfacher Htmlimage Tag wird verwendet um das Bild anzuzeigen Die berpr fung bernimmt ein CustomValidator der die eingegebenen Zeichen mit denen der Session vergleicht lt img src CIImage aspx gt lt br gt lt asp TextBox ID txtCaptchaText runat Server gt lt br gt lt asp CustomValidator ID valCaptcha runat server ErrorMessage Bitte geben Sie den korrekten Code ein Display dynamic OnServerValidate CheckCaptcha gt lt br gt asp Button IDe cmise r runat server onclick cmdGo Click Text punit CausesValidation true gt Die Zeichen werden mit Hilfe der Random Klasse erstellt und anschlie end in der Session gespeichert protected void Page Load object sender EventArgs e if IsPostBack Session CaptchalmageText GenerateRandomCode private stri
204. ings diese Moglichkeit Durchgefuhrt konnen diese beiden Aktionen mit ALTER LOGIN werden ALTER LOGIN sa DISABLE ALTER LOGIN sa WITH NAME sys admin 7 10 SQL Server 2000 Felder zur Replikation hinzufugen In manchen Fallen ist es notwendig Zu einer Datenbank neue Felder hinzuzufugen Wird nun diese Datenbank auf einen weiteren Server repliziert ergeben sich hier die einen oder anderen Probleme Die beste Erfahrung habe ich mit der Stored Procedure sp repladdcolumn gemacht Mit Hilfe dieser Stored Procedure wird das Feld in der zu replizierenden Datenbank Publication eingetragen und zur Replikation hinzugef gt Wichtig hierbei ist dass die Replikation vor der nderung gestoppt werden muss exec sp repladdcolumn source object Tabellenname column Spaltenname typetext float NULL publication to add all Danach muss der Snapshot erneut erstellt und nach Abschluss dessen die Replizierung wieder gestartet werden Mit der Stored Procedure sp addarticle kann brigens eine neue Tabelle erstellt werden die ebenfalls zur Replizierung hinzugef gt wird 7 11 SQL Server 2000 Einschr nkungen bei Replikation Bei der Replikation unter dem Microsoft SQL Server 2000 gibt es eine vorkonfigurierte Einschr nkung bei text ntext und image Feldern Die Feldgr e bei der Replizierung ist auf 65536 Zeichen beschr nkt Wird nun in ein Feld ein gr erer Wert eingef gt kommt es zum folgenden Fehler 264
205. ioniert Die Quelle kann ein x beliebiges Datenbank Management System darstellen Die Verwendung gestaltet sich einfach public static void BulkCopy Sql Connection connection string destinationTable DataTable dataTable SqlBulkCopy sbc new SqlBulkCopy connection spc DestinationTableName destinationTable sbc WriteToServer dataTable In diesem Beispiel wird einer Methode eine gultige Verbindung zu einem SQL Server der Name der Zieltabelle als auch eine DataTable ubergeben Mit diesen Informationen ist es m glich die gesamten Daten der DataTable in die Zieltabelle zu kopieren Hier gilt es zu beachten dass die Methode WriteToServer weitere Uberladungen besitzt mit der beispielsweise auch ein DataRow Array kopiert werden kann Der Typ SqglBulkCopy bietet jedoch noch weitere M glichkeiten Durch die Eigenschaft NotifyAfter ist es m glich eine Benachrichtigung zu definieren Wird beispielsweise ein Wert von 1 000 gesetzt wird nach 1 000 verarbeiteten Datens tzen das Event SqlRowsCopied ausgel st Dadurch ist es m glich eine Fortschrittsanzeige zu realisieren NET BlogBook Ausgabe 4 Weitere Informationen zum Thema Bulk Copies mit dem Microsoft SQL Server finden sich unter http msdn2 microsoft com en us library system data salclient sqlbulkcopy aspx 7 18 Volltext Suche und SQL Server 2005 Express Wer unter SQL Server 2005 Express die Volltext Suche verwenden m chte wird diese eventuell nicht fin
206. ions ben tigt Darin werden diverse Informationen abgelegt um von unterschiedlichen Seiten darauf zugreifen zu k nnen Bei der Verwendung von eigenen UserControls kann es vor allem f r ASP NET Neulinge sehr schnell zu einigen Missverst ndnissen und Fehlverhalten kommen Daher m chte ich anhand eines kurzen Beispiels erkl ren worauf generell zu achten ist Ausgangssituation Erstellt werden soll eine kleine Webanwendung welche aus einem simplen Men und einem Login besteht Sowohl das Men als auch das Login wird ber ein von System Web Ul UserControl abgeleitetes Steuerelement dargestellt Nach einem erfolgreichen Login soll das Men weitere zus tzliche Men punkte aufweisen Umsetzung Da f r diese Anwendung eine Session ben tigt werden wurde eine eigene Klasse SessionData erstellt die grundlegende und f r die Anwendung wichtige Informationen enth lt Haupts chlich handelt es sich dabei um Informationen zum User die an unterschiedlichen Stellen ben tigt werden und nicht berall nachgeladen werden sollen NET BlogBook Ausgabe 4 Zus tzlich wurde eine Klasse SessionList erstellt welche alle aktuellen Sessions zugeteilt bekommt und bestimmte Funktionalit ten aufweist die fur das Session Handling notwendig sind Pr fung auf G ltigkeit ist die Session bereits abgelaufen usw Diese Klasse wird in der Global asax im Eventhandler Application_Start instanziiert Die Default aspx stellt die Haupteinstiegs
207. ird diese Methode im oberen Beispiel verwendet sieht die Ausgabe wie folgt aus ia che Untitled Page lt script Language JavaScript gt alert X55 1 lt script gt PostBack Eingabe lt script Language JavaScnpt gt alert XSS lt scnpt gt Abbildung 38 Gefahrlicher Code 3 Mehr Informationen zu diesem Thema gibt es unter folgenden Links http www asp net fag RequestValidation aspx NET BlogBook Ausgabe 4 http www microsoft com technet archive security news exsumcs mspx mfr true http de wikipedia org wiki Cross Site_Scripting Das Beispielprojekt kann hier runtergeladen werden 2 4 46 Zuletzt ge ndert am automatisch anzeigen Heute wurde ich per E Mail gefragt ob es m glich ist das Datum und die Uhrzeit anzuzeigen an dem die aktuelle ASPX Datei das letzte Mal ver ndert wurde In diesem Beispiel wird ein einfaches Custom Control diese Aufgabe erledigen Nat rlich ist dies nicht der Weisheit letzter Schluss Man kann dieses kleine Beispiel jedoch sehr gut erweitern und seinen Bed rfnissen anpassen Ein Custom Control wird ber ein Class Library Projekt erstellt Fa New Project Project types Templates Visual C Visual Studio installed templates Windows E Windows Application Database 4 Windows Control Library EM console Application Starter Kits CR ASP NET AJAX Enabled Web Application ASP NET Web Application _ 2 ASP NET Web Service Application Other
208. jekte erstellen Oft m ssen Objekte dynamisch bzw generisch erzeugt werden In den meisten F llen wird zu Activator Createlnstance oder Activator CreateInstance lt gt gegriffen Die Erzeugung ber den Activator ist jedoch nicht die schnellste Einen wesentlich performantereren Ansatz liefern uns die FormatterServices Hier eine Objekt Erzeugungs Klasse welche beide Varianten implementiert public class ObjectGenerator public T GenerateObject lt T gt return T FormatterServices GetUninitializedObject typeof T public T ActivateObject lt T gt return T Activator Createlnstance lt T gt Erzeugen wir und f r jede Variante in einer Schleife 10 000 Objekte sehen wir eine kleine berraschung Zuerst der Code ObjectGenerator og new ObjectGenerator Stopwatch sw new Stopwatch Console Write Generate Object Formatter sw Start Tor tint i Us 1 lt 10000 i TestClass tc og GenerateObject lt TestClass gt SW SCOP Console WriteLine sw ElapsedMilliseconds sw Reset Console Write Generate Object Activator sw St art for int 1 I 1 lt 19009 Ii H TestClass tc og ActivateObject lt TestClass gt BY Scop ty Console WriteLine sw ElapsedMilliseconds Console Readkey Nun die berraschung Generate Object Formatter 3 Generate Object Activator 21 Und jetzt kommt der eigentliche Clou Mit Hilfe von FormatterS
209. k oder anderen entsprechenden Blockierungs Mafsnahmen zu versehen Dadurch kann der gleiche Code nur von einem einzigen Thread aufgerufen und ausgef hrt werden Dies kann mit einem DoEvents nicht ausreichend gel st werden In solchen F llen sollte auf jeden Fall Threading verwendet werden 2 3 3 Men s dynamisch mit Hilfe einer XML Datei erstellen In manchen F llen macht es Sinn bestimmte Teile einer Anwendung dynamisch erstellen zu lassen Ob es sich dabei um Men s handelt um Eingabefelder oder NET BlogBook Ausgabe 4 auch anderen Dingen Immer wieder st t man auf entsprechende Fragen oft mit keinem wirklich guten Beispiel vor allem fur NET Newcomer Hier nun ein Beispiel f r das dynamische Erstellen eines Men s aus einem XML File heraus Wie funktioniert das Die XML Datei beschreibt die Hauptmenu Eintrage als auch die Untermen s Informationen wie Name Text welche Methode welcher Klasse bei einem Klick aufgerufen werden soll sowie ob der Menueintrag beim Startup der Anwendung verf gbar ist werden daruber gesteuert Fur jeden Hauptmen Eintrag existiert eine eigene Klasse welche die entsprechenden Methoden zur Verf gung stellt Fur diese werden ber den DynamicMenuHandler automatisiert Delegates erstellt die das Click Ereignis an diese Methoden weiterleiten und den dahinterliegenden Code ausf hren Die gleiche Vorgehensweise kann auch f r andere Zwecke verwendet missbraucht werden Download Dynam
210. kt geschrieben werden private void printDoc PrintPage object sender PrintPageEventArgs e String tTextToPfrint Test Ausdruck Font printFont new Font Arial 18 FontStyle Bold e Graphiecs Drawstrring text Tofrint printFont Brushes Black 10 25 In diesem Fall wird angegebene Text mit in der Schrift Arial Schriftgr e 18 und fett auf den Koordinaten x 10 und y 25 gedruckt Es lohnt sich auch einen Blick auf die PrintPageEventArgs Zu werfen 2 2 41 AppDomains und Memory berwachung Folgende Konstellation e ein Prozess e mehrere AppDomains Dies k nnte beispielsweise ein Plugin System sein in welchem Plugins zur Laufzeit wieder entladen werden k nnen Nun macht es doch in manchen F llen Sinn eine berwachung des Speichers einzuf hren Schlie lich muss man in bestimmten Umgebungen wissen wieviel Speicher durch welches Modul verbraucht wird Und zwar im Echtbetrieb und nicht in einer Testumgebung Durch AppDomains k nnen unterschiedliche Module Anwendungen etc wunderbar NET BlogBook Ausgabe 4 innerhalb eines Prozesses getrennt werden Eine Kommunikation durch NET Remoting ist moglich jedoch ist jede AppDomain fur sich abgeschottet Das macht auch durchaus so Sinn Ein Punkt jedoch wurde anscheinend von Microsoft nicht bedacht Den Speicherverbrauch kann ich mit NET Boardmitteln nur fur einen Prozess bestimmen was aber nicht immer ausreicht Wenn schon mehrere Anwendungs D
211. lic abstract void Execute Alle Commands die nun vom abstrakten Command ableiten m ssen die Eigenschaft Message nicht mehr implementieren da diese bei der Ableitung bernommen wird Lediglich die Methode Execute ist Zu berschreiben Dies wird anhand des folgenden Sourcecodes gezeigt public class ConcreteCommand Command region ICommand Members public override void Execute this Message This is a concrete command implementation endregion Hier passiert nichts anderes als dass die Eigenschaft Message mit einem String bef llt wird NET BlogBook Ausgabe 4 Weiters wird von mir noch eine Klasse Executor benutzt der fur die Ausfuhrung der Commands zustandig ist public class Executor public void ExecuteCommand ICommand ic ic Execute Wie hier zu sehen ist wird ein ICommand bergeben der anschlie end ausgef hrt wird Dadurch kann jeder beliebige Command ausgef hrt werden und eine Erweiterung ist nur dann notwendig wenn der Executor selbst diverse neue Features bekommt Zusammenfassung Da im Falle des Command Patterns nur mehr die einzelnen Commands implementiert werden m ssen das ausf hrende Framework sich jedoch nicht ndert eignet sich dieses Pattern sehr gut f r eine Client Server Kommunikation und wird daher auch oft eingesetzt wenn Clients beispielsweise mit Web Services interagieren Nachfolgend findet sich ein kleines Testprogramm welche
212. llt die einfachste Variante eines Proxies dar Ein vereinfachter Protection Proxy k nnte beispielsweise so aussehen Erweiterung des obigen Beispiels using System using System Collections Generic using System Text using System Security namespace ProxzyPattern NET BlogBook Ausgabe 4 class Program static void Main string args try CalculatorProxy proxy new CalculatorProxy test2 Console WriteLine string Fomar 12 17 Console WriteLine Scring lt Formac ie 17 0 proxy Add 12 17 0 proxy Sub 12 17 catch Exception ex Console WriteLine ex Message Console Read public interface ICalculator decimal Add decimal x decimal y decimal Sub decimal x decimal y public class Calculator ICalculator public decimal Add decimal x decimal y recur X F yj public decimal Sub decimal x decimal y return X yi Public clase Calculatorrrosy ICalculator private Calculator calculator new Calculator Private string password Trest private string givenPassword null public CalculatorProxy string password this givenPassword password public decimal Add decimal x decimal y if this SQivenFassward this password return calculator Add x y else throw new SecurityException Not allowed Add public decimal Sub decimal x decimal y if CNIS givenFasswerd this pass
213. ly gt lt FullClassName gt JTLeigh Tools CopySourceAsHtml Connect lt FullClassName gt lt LoadBehavior gt 1 lt LoadBehavior gt lt CommandPreload gt 0 lt CommandPreload gt lt CommandLineSafe gt 0 lt CommandLineSafe gt lt Addin gt lt Extensibility gt Anschlie end kann ber den Add In Manager das Tool aktiviert und sofort verwendet werden NET BlogBook Ausgabe 4 CopySourceAsHtml to Microsoft Visual Abbildung 61 Visual Studio Add In Manager 3 25 Visual Studio Plugin f r Community Server Wer haufig Code Snippets in den Community Server Blogs oder Foren postet wird sich uber das Visual Studio Plugin von Zeddy Iskandar freuen Dies erlaubt ein einfaches Copy amp Pase von Quellcode in den Community Server I 5 aip Refactor 99 100 Create Unit Tests 101 Insert Snippet Surround With 102 102 Go Ta Definition Mehr Informationen gibt es unter http geeks netindonesia net blogs zeddy archive 2007 04 25 Visual Studio Plugin for Community Server aspx NET BlogBook Ausgabe 4 4 1 Allgemein 4 1 1 Continuous Integration kenn ich nich Nein Dann durfte ein Artikel von Martin Fowler 1 zu diesem Thema 2 wirklich weiterhelfen Continuous Integration is a software development practice where members of a team integrate their work frequently usually each person integrates at least daily leading to multiple integrations per day Each integratio
214. m Falle des Falles muss der Entwickler ohnehin selbst entscheiden ob dies sinnvoll ist oder nicht Wird die Berechnung anderweitig verwendet ist es sicherlich sinnvoll diese in eine eigene Methode zu kapseln Andernfalls kann durchaus ein anonymer Delegate verwendet werden 2 2 6 C 3 0 Keyword var Nein var steht hier nicht in nostalgischer Verbindung zu Visual Basic Vielmehr handelt es sich streng genommen auch nicht wirklich um ein Schl sselwort Keyword Schl sselw rter d rfen ja nicht in Klassen Strukturen etc verwendet werden var hingegen sehr wohl Aber unabh ngig dieser Tatsache was verbirgt sich dahinter Beginnen wir mit einem kleinen Beispiel var htTemp new Hashtable In diesem Fall versucht der Compiler auf den Typ von strList zu schlie en was auch kein Problem darstellt da dieser ohnehin durch new Hashtable definiert wird Es entf llt also die lange und nat rlich auch unsch ne und redudante Darstellung a la Hashtable htTemp new Hashtable Manche mogen nun der Meinung sein dass sich C dadurch von der starken Typisierung verabschiedet Dem ist jedoch nicht so Wurde die Variable deklariert wird auf inren Typ geschlossen und zugewiesen Der Typ kann an einer spateren Stelle nicht mehr verandert werden wie dies beispielsweise unter VB NET moglich ist Ebenfalls sei zu betonen dass var auch nur bei der Initialisierung verwendet werden kann NET BlogBook Ausgabe 4 2 2
215. m wiederholende Funktionalit t oder Quellcode auszulagern H ufig ndert sich aber dennoch ein kleiner Teil von Seite zu Seite Um diese Anforderung abbilden zu k nnen und die Flexibilit t das Controls zu erh hen ist es m glich UserControls um eigene Eigenschaften zu erweitern In diesem einfachen Beispiel soll das UserControl einen Text ber die Eigenschaft MyValue engegennehmen und diesen ber ein Literal Control ausgeben lt UC WebUserControl ID uc1 runat server MyValue Test 1 gt Hierfur ist nichts weiter notig als in der Code Behind Datei des UserControls ein neues Property hinzuzuf gen private string myValue public string MyValue get return myValue set myValue value NET BlogBook Ausgabe 4 I Die eigentliche Funktionalit t um den Text auszugeben ist nun nur noch Formsache protected void Page Load object sender EventArgs e lit Text this myValue Wird dieses UserControl nun im Kopf einer Webseite oder per Web Config registriert steht die Eigenschaft welche im Code Behind angelegt wurde sofort im IntelliSense zur Verf gung lt uCc WebUserControl Ib uci runat server n f gt lt br gt A Enable Theming a lt br gt A EnableViewState lt UC WehlserL ntrol IDe us2 runat serve Fe ih i liv gt a orm gt F OndbortTransaction Den Download des Beispielprojekts findet man hier 2 4 65 GridView anzeigen obwohl keine Daten vorhanden
216. mItem Delete Next End Sub Dieses Makro ist wieder wie gestern im Beitrag 1 einzubinden Als Shortcut habe ich ein k vergeben da dies noch nicht benutzt wird PS Den Junk E Mail Folder immer schon sauber halten Denn Outlook archiviert diesen Ordner standardm ig mit was ich zwar nicht verstehe ist aber so Einfach die Folder Eigenschaften ffnen und die Archivierung deaktivieren 1 MS Outlook Mails mit Shortcut als gelesen markieren 6 3 MS Outlook Makros reloaded 2 Vor einiger Zeit habe ich ein kleines VBA Makro ver ffentlicht mit dem es einfach m glich ist die Ordner Junk E Mail und Gel schte Objekte zu leeren siehe MS Outlook Makros reloaded Alex Bierhaus hat mich nun auf einen Fehler dieses Makros hingewiesen den ich in der Hitze des Gefechts bersehen hatte 254 NET BlogBook Ausgabe 4 In den geloschten Objekten befinden sich naturlich nicht nur geloschte Emails sondern auch geloschte Kontakte Notizen Aufgaben etc Hierbei wurde ein Fehler ausgelost und die Objekte wurden nicht geloscht Hier nun eine marginal geanderte Variante die nun einwandfrei funktionieren sollte Sub RemoveJunkAndDeleted Dim mItem As Object Dim mNamespace As NameSpace Dim junkFolder As MAPIFolder Dim deletedFolder As MAPIFolder Set mNamespace Application GetNamespace MAPI Set junkFolder mNamespace GetDefaultFolder olFolderJunk For Each mItem In junkFolder Items mItem Delete Next S
217. meldung hat eine ganz einfache Ursache Nachdem die Anwendung in einen anderen Ordner bzw eine andere URL Kopiert wurde muss die Datei lt Projektname gt csproj webinfo angepasst werden NET BlogBook Ausgabe 4 Diese Datei wird geschrieben sobald eine Anwendung erstellt wird lt Web URLPath http www url de Anwendung csproj gt lt VisualStudioUNCWeb gt lt VisualStudioUNCWeb gt Nachdem der Pfad angepasst wurde kann man die Anwendung ohne Probleme ffnen Verwendet man die Visual Studio Funktion Projekt kopieren muss man sich keine Gedanken um die Anpassung dieser Datei machen 2 4 30 Controls anhand der ID rekursiv suchen Schon vor l ngerer Zeit habe ich mir eine kleine Methode geschrieben um Controls auf einer ASP NET Seite per ID zu finden Vielleicht hat der eine oder andere ja Verwendung daf r public static Control FindControlRecursive Control root string id if root ID id relurn Foot foreach Control in root Controls 7 Control t FindControlRecursive c id if t null return t return null 2 4 31 AnkhSVN TortoiseSVN und ASP NET Verwendet man die TortoiseSVN ASP NET Version wird statt dem Standard Admin Ordner svn der Ordner svn erstellt Visual Studio 2003 hat ein Problem mit Ordnern deren Namen mit einem Punkt beginnen weshalb dieser Workaround gew hlt wurde Nun kann es vorkommen dass AnkhSVN bei Starten eines Projekts den Ordner
218. members lel Source Control Parameter information El Text Editor ae a settings i General ee Sta ee _ Enable virtual space 2 All Languages i _ Word wrap Gf Basic Show visual glyphs for word wrap Apply Cut or Copy commands to blank lines when there is no selection Display i Be v Line numbers amp Farmattin sti EA ipa Enable single dick URL navigation 2 i C C v Navigation bar BC Danach sollte Intellisense wieder verf gbar sein Ein anderer Weg k nnte ebenfalls zielf hrend sein Vor der Deinstallation des ReSharpers in dessen Optionen IntelliSense wieder zur ck an Visual Studio geben Vermutlich sollten dann die oben angef hrten Einstellungen nicht mehr getroffen werden Gewinncode 27AC97U 3 18 Visual Studio 2005 Refactoring Performance verbessern Mit zunehmender Projektgr e wird auch das integrierte Refactoring st ndig langsamer bis es schlie lich berhaupt nicht mehr verwendbar ist u erst schlimm ist dies bei Web Projekten Hintergrund ist der dass so gut wie jeglicher Content f r das Refactoring herangezogen wird Eine M glichkeit einzelne Projekte auszuw hlen oder bestimmte Teile der Solution nicht mit einzubeziehen ist ebenfalls nicht vorhanden Dennoch gibt es eine kleine Variante welche das Refactoring deutlich beschleunigt Wie in vielen F llen ist die L sung ber die Registry m glich 1 Alle offenen Visual Studio 2005 Instanzen schlie en NET BlogBook Ausga
219. ml ge Fa a m a Bi 79 oO Pie i U a Er Ep a poi ee ee a Pail UEY Ta KOO m HE el p ee a re on Bei 1 a Tan am E wer TEE oT re ei a rn Baba GEN O Haa 1 i HEL ke ee Ti a E Bereet i a Fe ai P Hi imi hook ig HHL Pee A TE ee a ee bal j i a Em ET ly Hy Sp a i ee et ge en a Ei Zr rk T D iji IE 5 m j TT A T E E s BEL Eu eee a ee Tet ge aie a et nr ne ar ie r Abbildung 40 ViewState Helper 140 NET BlogBook Ausgabe 4 Das Tool ist kostenlos und ben tigt lediglich das NET Framework in der Version 2 0 Mehr Infos und den Download findet man unter http www binaryfortress com aspnet viewstate helper 2 4 48 Caching Membership Roles Profiles Web Architektur und AJAX Daniel Walzenbach hat in seinem WeWeblog einige Interessante Links zum Thema ASP NET geposted die in jeden Fall ein Blick wert sind 3 stufige Web Architektur fur ASP NET VB NET oder C A Multipart Series on ASP NET 2 0 s Membership Roles and Profile Caching Tutorial for Web Authors and Webmasters Au erdem gibt es von Microsoft Learning einen kostenlosen 2h Online Kurs zum Thema ASP NET AJAX 1 0 https www microsoftelearning com eLearning courseDetail aspx courseld 3568 2 4 49 Fehlerbehandlung per Http Module Mit einem HTTP Module ist es m glich Fehler in Web Anwendungen zu protokollieren ohne den vorhandenen Code der Anwendung zu ver ndern Die Aufgabe eines solchen Modules sollte es sein dem User eine
220. n NET BlogBook Ausgabe 4 El Enterprise ssh NAHEN ao Eh helt pi dite ge that Age a ihe bie Sty IIOP iB EE fi Mp tpg RN ExceptionLoggingDemol App config r eben ad Settings i Data Access Application Block a E Environments i D Exception Handling Application Block amp L DemoException El Exception ey Logging Handler 2 an Application Block A SA Filters a T Category Sources El Y General M NLog Trace Listener 5 8 Special Sources nti All Events fal a Logging Errors amp Warnings _ ill NLog Trace Listener i Unprocessed Category ee Trace Listeners ae gt NLog Trace Listener et A Formatters bast 4 TextFormatter Abbildung 10 NLog Trace Listener Als Verbesserung k nnte hier ein eigener Formatter erstellt werden welcher die Daten in einer besser lesbaren Form in unseren NLogTraceListener schreibt Hier nun der Download des Beispiel Projektes Download NLog Trace Listener Demo 1 Download Enterprise Library 3 1 May 2007 2 2 87 Rekursive Methoden mit Hilfe eines Stacks abbilden Rekursionen werden recht gerne f r unterschiedlichste Zwecke eingesetzt Beispielsweise um ein bestimmtes Steuerelement auf einem Formular oder darunterliegenden Containern zu finden Allerdings muss eine Rekursion nicht immer sein Der Nachteil einer Rekursion besteht im zahlreichen Aufruf derselben Methode Methodenaufrufe sind kostspielig und und sollten daher nicht bertrieben werden In einigen F llen der
221. n Script Community Server Ist diese Option aktiviert wird das Standard Community Server Schema installiert Bei einer Neuinstallation wird diese Option nat rlich ben tigt Create Community Auch diese Option wird benotigt wenn eine Neuinstallation statt findet und installiert eine neue Community Im n chsten Schritt wird der erste Benutzer der Community angelegt der gleichzeitig auch die Aufgabe des Administrators bernimmt Neben der URL der Community wird ein Username ein Passwort und die E Mail Adresse f r den zuk nftigen Administrator ben tigt Au erdem wird in diesem Beispiel die Option Create Sample Data ausgew hlt Ben tigt man die Beispieldaten nicht kann man diese Option nat rlich auch deaktivieren Community Server Web Installer Windows Internet Explorer Ir Q http test veloursnebel de installer Default aspx ical we community Server Web Installer wl Mr dah ihr Gy ie 3 community server Create new Community Enter the following information to create a new Community Server instance in the database Community Uri example domain com Enter the username password and email address you would like to use for the administrator account of your new Community Server site Username Password oooe The password must be at least 5 characters Admin Email Address kai veloursnebel de Create Sample Data Previous Next gt Ai Done internet 100
222. n Assembly Dateien werden dadurch nicht gelockt und k nnen von neuen Versionen berschrieben werden Aber wie kann man nun selbst ShadowCopies realisieren Unter der Annahme dass in einer Anwendung verschiedene AppDomains geladen werden sind drei Dinge notwendig s mtliche Einstellungen k nnen ber die Klasse AppDomainSetup gemacht werden 1 ShadowCopy aktivieren AppDomainSetup ShadowCopyFiles muss hier auf true gesetzt werden Zu beachten ist allerdings dass es sich bei dieser Property um einen String handelt 2 Wo sollen die ShadowCopies erstellt werden Hier gibt es zwei Eigenschaften die interessant sind AppDomainSetup CachePath und AppDomainSetup ApplicationName CachePath Stellt das Verzeichnis dar in welches die Assemblies kopiert werden sollen ApplicationName ist der Name der Anwendung Das ganze sieht nun so aus dass im CachePath ein Unterverzeichnis mit dem unter ApplicationName angegebenen String erstellt wird Darunter befinden sich dann die ShadowCopies Wird darauf verzichtet kommt der eigentlich dafur zustandige Pfad zum Handkuss Suserprofile S local settings application data assembly ShadowCopies in diesem Pfad werden automatisch wieder geloscht Werden beide Eigenschaften korrekt gesetzt und damit ein eigener CachePath verwendet muss man sich auch selbst um das L schen der Dateien k mmern 3 Was soll kopiert werden Nat rlich muss auch angegeben werden welche Assemblies kopiert werden sollen Die
223. n NCover leistet jedoch auch gute Dienste Lohnt sich der Einsatz Egal ob nun ein kostenloses Code Coverage Tool oder ein kommerzielles eingesetzt wird insgesamt wird die Qualit t der Unit Tests und somit der gesamten Software erh ht Daher Sehr empfehlenswert 5 18 C VB NET Code Converter Todd Anglin hat zusammen mit Telerik einen C VB NET VB NET C Code Converter entwickelt Neben einer bereits in der Beta befindlichen Online Version und ein Widget f r Yahoo soll es in naher Zukunft ebenfalls eine Version f r den Google Desktop und die Windows Sidebar geben Mehr Informationen gibt es unter http telerikwatch com 2007 03 announcing new code converter html Nachtrag Anscheinend verwendet der Code Converter nichts anderes als die SharpDevelop Parser Bibliotheken wie man im Abschnitt About nachlesen kann Das Original findet man also hier neben der bereits erh ltlichen Offline Variante 247 NET BlogBook Ausgabe 4 5 19 IE pro Internet Explorer 7 Add on Das IE Opro Add on erweitert den Internet Explorer 7 um ein paar n tzliche Funktionen Nach der Installation ist es m glich z B m glich mit Mausgesten zu arbeiten oder nach einem Absturz alle ge ffneten Tabs wiederherzustellen Au erdem kann eine komplette Seite direkt als Bild abgespeichert werden IE70pro ist kostenlos und kann unter folgender URL bezogen werden http www ie7pro com Dort gibt es nat rlich auch die komplette Featurelist
224. n der Datenbank gef llt ist Ist dies der Fall kann mit dem Vergleich und anschlie ender Einfarbung begonnen werden Das Beispielprojekt kann hier heruntergeladen werden 2 4 55 ASP NET Themes per Programmcode ndern Benutzt eine Web Anwendung Themes wird das aktive Theme innerhalb Web Config festgelegt ber das Property Page Theme ist es au erdem m glich diesen Wert zur Laufzeit zu ndern Allerdings kann dieses Property nur im PreInit Event ver ndert werden weiterhin muss die Einstellung bei jedem Request neu gesetzt werden Ein Http Module schafft in diesem Fall Abhilfe Einmal in der Web Config registriert setzt das Modul bei jedem Request das Theme Ein Http Module ist ein Assembly das bei jeder Anforderung einer ASP NET Seite aufgerufen wird Weiterhin haben Http Modules die M glichkeit direkt in die Anforderungspipeline einzugreifen und z B aufgrund von bestimmten Zust nden 147 NET BlogBook Ausgabe 4 definierte Aktionen auszufuhren In diesem Fall wird wie oben bereits erwahnt das Theme gesetzt Beginnt man mit der Programmierung eines Http Module muss zunachst das Interface IHttpModule implementiert werden Visual Studio generiert in diesem Fall die beiden Methoden Init und Dispose An die Methode Init wird ein Objekt vom Typ HttpApplication bergeben Mit Hilfe dieses Objekts muss ein neuer EventHandler registriert werden public void Init HttpApplication context context PreReques
225. n einen Wertetype Boxing und Unboxing verursachen zus tzlichen Aufwand daher sollten diese Operationen vermieden werden Je h ufiger der entsprechende Code Bereich ausgef hrt wird desto weniger empfiehlt sich die Verwendung Es sei an dieser Stelle bemerkt dass auch der Aufruf von virtuellen Methoden die Strukturen von System Object erben unter den Begriff Boxing fallen Beispiel TOS ering Empfohlene Vorgehensweisen Um Boxing und Unboxing zu Vermeiden und somit auch etwaige Performanceprobleme empfiehlt es sich einige Punkte einzuhalten Hier eine unvollst ndige Liste e Werden Strukturen definiert sollten die Methoden GetHashCode Equals und ToString berschrieben werden e Bestehen Methoden die Parameter vom Typ object besitzen die jedoch zur bergabe von Werttypen verwenden werden empfiehlt es sich berladungen zu definieren die auf den jeweiligen Werttyp abgestimmt sind e Anstatt object Parameter zu verwenden empfiehlt sich die Verwendung von Generika Wann soll Boxing Unboxing eingesetzt werden Manche m gen mir jetzt vielleicht widersprechen aber ich pers nlich empfehle Boxing und Unboxing nicht einzusetzen Selbst bei Code Teilen die nur selten ausgef hrt werden empfiehlt es sich beispielsweise auf Generika zu setzen oder NET BlogBook Ausgabe 4 berladungen f r die entsprechenden Werttypen zu schaffen Dadurch erh hen sich zum einen die bersichtlichkeit die Verst ndlichkeit und vor all
226. n is verified by an automated build including test to detect integration errors as quickly as possible Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly This article is a quick overview of Continuous Integration summarizing the technique and its current usage 1 Martin Fowler 2 Continuous Integration 4 1 2 Uberladen vs berschreiben Da ich heute wieder auf eine Verwechslung dieser beiden Begriffe engl Override Overload gesto en bin m chte ich diese kurz hier erkl ren berladung Beim Uberladen wird die Signatur einer Methode ver ndert Der Methodenname ndert sich jedoch nicht Was sich hierbei ndert sind die Parameter bzw die Anzahl der Parameter Der R ckgabetyp kann sich ndern jedoch m ssen die Parameter unterschiedliche Typen aufweisen oder die Anzahl der Parameter muss unterschiedlich sein Was ist die Signatur Unter der Signatur versteht man die Definition einer Methode sprich mehr oder weniger der Methoden Rumpf Beispiel NET BlogBook Ausgabe 4 public string CalcValue int valuel int value2 Was darf hier nun ge ndert werden Wie gesagt der Methoden Name muss ident bleiben Eine Anderung des obigen Beispiels zu public string CalcValue int valuel double value2 w re erlaubt Dies bedeutet nun dass sich auch die Typen der Parameter ndern k nnen Besteht allerdings nur e
227. n und IntelliSense Wie zu sehen ist ist hierf r das Schl sselwort var zu verwenden Die Definition erfolgt inline und definiert welche Eigenschaften der neue Typ hat Selbst IntelliSense kennt die neuen Eigenschaften Anonyme Typen kennzeichnen sich dadurch aus dass sie keinen zugewiesenen Namen besitzen dies ist auch in der Typen Beschreibung siehe IntelliSense ersichtlich Werden im gleichen Scope zwei anonyme Typen definiert welche die gleiche Signatur besitzen kann der erste Type den zweiten einfach bernehmen wie nachfolgend zu sehen var person new Firstname Norbert Lastname Eder CarsCount 1 var anotherferson new Firstname Der Lastname Tester CarsCount 2 person anotherPerson Abbildung 8 Kompatible anonyme Typen Wozu werden anonyme Typen nun gebraucht Zum einen wurden anonyme Typen nat rlich f r LINQ eingef hrt Diese werden dort NET BlogBook Ausgabe 4 haufig verwendet und bilden daher eine Notwendigkeit Aber auch fur andere Zwecke konnen sie verwendet werden Grunds tzlich bieten sich anonyme Type dann an wenn ein Typ kurzfristig fur die Ausgabe etc ben tigt wird aber nicht f r die gesamte Anwendung zur Verf gung stehen muss In diesem Fall muss also keine eigene Klasse erstellt werden welche schlussendlich nur an einer einzigen Stelle verwendet werden w rde Wann anonyme Typen einzusenden sind bleibt jedem Entwickler selbst berlassen Unter dem ob
228. ne s 2 2 70 Schl sselwort sealed Von einer Klasse die mit dem sea led Schl sselwort gekennzeichnet ist kann nicht vererbt werden sealed versiegelt Dies bedeutet dass Erweiterungen nicht gew nscht sind bzw eine weitere Abstraktion ohnehin sinnlos w re Aufrufe an versiegelte Klassenmember k nnen durch Laufzeitoptimierungen beschleunigt werden Beispiel public sealed class TestClass private int a private int b 0 IE p blic int 2 i ger 1 returni This SF j set 1 Chis a value public int B get return this D ser t this valne j Erg nzungen Strukturen structs sind per Definiton sealed und k nnen daher nicht vererbt werden Eine Verwendung von sealed gemeinsam mit abstract Ist nicht erlaubt da man bei einer abstrakten Klasse davon ausgehen kann dass die konkrete Implementierung nicht existiert NET BlogBook Ausgabe 4 2 2 71 Unregelm igkeiten beim Implementieren einer abstrakten Klasse Beim Ableiten von einer abstrakten Klasse k nnen bekanntlich mittels STRG SHIFT F10 die zu implementierenden Methoden automatisch eingef gt werden Dies sieht dann beispielsweise so aus public override void BeginTransaction throw new Exception The method or operation is not implemented Allerdings frage ich mich warum keine NotimplementedException verwendet wird welche bereits seit NET 1 0 im Framework vorhanden ist 2 2 72 C Arbeit
229. nen die angezeigten Felder des GridView ber das Kontextmenu und den Punkt Edit Columns konfiguriert werden In diesem Dialog muss ein ImageField Control hinzugefugt werden Uber die Eigenschaften DataImageUrlField und DatalmageUrlFormatString kann nun eingestellt werden welches Datenbankfeld verwendet werden soll und wo die Bilder im Web vorliegen Der Platzhalter 0 im Wert der Eigenschaft DatalmageUrlFormatString wird vom GridView Control automatisch mit dem Inhalt des Feldes DatalmageUrlField ersetzt so dass ein g ltiger Verweis auf ein Bild ausgegeben wird Abbildung 16 Bilder im GridView 2 Das Ergebnis ist ein zus tzliches Feld in Form einer Grafik Den Download des Beispielprojekts findet man hier 2 4 3 Mehrere Spalten im DataTextField der DropDownList Leider ist es nicht m glich in der Eigenschaft DataTextField des DropDownList Controls mehr als eine Spalte anzugeben Allerdings kann man mit Hilfe eines kleinen SQL Tricks diese Gegebenheit umgehen SELECT Name Surname AS FullName FROM Persons Diese Syntax fasst zwei vorhandene Spalten zusammen und gibt diese unter dem Namen FullName im Ergebnis aus Eingebaut in das SylDataSource Control kann diese neue Spalte auch schon verwendet werden lt asp SqlDataSource ID SqlDataSourcel runat server ConnectionString lt ConnectionStrings ConnectionString gt NET BlogBook Ausgabe 4 SelectCommand SE
230. new List lt Book gt NET BlogBook Ausgabe 4 bookList Add bookl bookList Add Book2 List lt Person gt personList new List lt Person gt Person personl new Person personl Firstname Norbert personl Lastname Eder personl BookList bookList person CalcularionMeriiod specialcustomer calc personList Add personl Person person2 new Person person2 Firstname Alf person2 Lastname Dudldei person2 BookList bookList personz CalculationMethod default calc personList Add person2 foreach Person p in personLlist decimal price 0 foreach Book b in p BooklList price b Price p Discount p CalculationMethod price Console WriteLine String Formeacp 70 Lice 12 discount p Firstname gt Lastname p Discount Tostring i Console WriteLine Press any key Console ReadKey Zuerst ein kurze Erkl rung wozu dieses Beispiel dient Grunds tzlich gibt es zwei Klassen Zum einen die Person und zum anderen das Book Wir gehen also davon aus dass eine Person B cher kauft und diese in einer Collection aufbewahrt werden Nun soll je nach Kundenstatus ein Rabatt berechnet werden Zur Erkl rung Dies kann nat rlich auch auf eine andere vermutlich einfachere Art und Weise implementiert werden Dieses Beispiel dient lediglich der Veranschaulichung von anonymen Delegates Grunds tzlich ist in diesem Beispiel ein blicher Delegate definiert public
231. new XmlDocument doc Load categories xml XmlNode xnRoot doc SelectSingleNode categories XmlTextReader xtr new XmlTextReader new StringReader category ToXml XmlNode xnCategory doc ReadNode xtr xnRoot AppendChild xnCategory Wie zu erkennen ist wird dazu der Xml TextReader verwendet da dadurch einfach Xml Fragmente eingelesen werden konnen Mit Hilfe der Methode ReadNode des Xml Document Objektes kann nun ein Node generiert werden welcher anschlie end dem Dokument hinzugef gt wird Anzumerken ist auch dass die Methode Toxml des Objektes category ein entsprechendes XML Fragment aus dem besagten Objekt generiert und als String zur ck liefert 2 2 65 Extern aliases Namespace aus verschiedenen Assemblies nutzen Das NET Framework lt 2 0 unterst tzte lediglich eine einzelne Namespace Hierarchie In diese wurden die Typen der referenzierten Assemblies geladen und konnten anschlie end verwendet werden Dies ist allerdings eher unsch n wenn beispielsweise die gleiche Assembliy allerdings in unterschiedlichen Versionen verwendet werden muss oder eine ben tigte Assembly zuf llig denselben Namespace benutzt wie eine ganz andere Mit extern aliases ist dieses Problem zu l sen Gegeben sind zwei Assemblies Assembly a1 dll namespace N Public class pubiie class W D gt Assembly a2 dll namespace N public class public class OW NET BlogBook Ausgabe 4 Bei nachfolgend
232. ng GenerateRandomCode Random random new Randon string captchaCode for iint i Us 4 0S Act captchaCode String Concat captchaCode random Next 10 ToString return captchaCode Bei Formularen deren Daten sofort nach dem Submit sichtbar sind wie z B f r G steb cher oder Kommentare f r Weblog Eintr ge ist diese Absicherung durchaus sinnvoll Auch die hier gezeigte einfache Implementierung spricht daf r Sp testens jedoch nachdem ein Robot mehrere Eintr ge verfasst hat wird sie sogar absolut erforderlich Das Beispielprojekt findet man hier Das Sourceforge Beispiel inkl Captcha Control Klasse hier Wird dieses Beispiel in einer Anwendung mit Themes verwendet muss dies beachtet werden 2 4 23 User Controls per Web config registrieren Wer oft mit User Controls arbeitet hat sich vielleicht schon dar ber beschwert die User Controls auf jeder Seite registrieren zu m ssen ASP NET 2 0 bietet allerdings die M glichkeit dies zentral in der Web config Zu erledigen 124 NET BlogBook Ausgabe 4 Dazu muss die Web config im Node system web angepasst und folgender Code hinzugefugt werden lt pages gt eonL rnls gt lt add tagPrefix UC tagName World2 src UC MyUserControll ascx gt lt conLrols gt lt pages gt Dieser sorgt daf r dass das User Controls MyUserControll nun f r das gesamte Web registriert ist Nat rlich mit voller Intellisense Unterst tzung im Visual
233. ngen sollte die Log Date in ein Verzeichnis geschrieben werden welches nicht ber das Web zug nglich ist 3 Fehlertexte die an den User gehen sollten unbedingt zuvor angepasst werden D h ein eigener Wortlaut muss deklariert werden 4 Schlie lich bleibt noch zu erw hnen dass dem User nicht jeder Fehler sichtbar gemacht werden muss Mit vielen Fehlern kann der Unser ohnehin nichts anfangen und sie verwirren ihn nur Ergo immer berlegen ob die Benachrichtigung im speziellen Fall sinnvoll ist oder nicht 2 2 14 C 3 0 Anonyme Typen Nachdem ich bereits uber Anonymen Delegates auch unter NET 2 0 verfugbar als auch dem unter C 3 0 neuen Keyword var geschrieben habe mochte ich ein wenig uber Anonyme Typen schreiben NET BlogBook Ausgabe 4 Anonyme Typen sind ahnlich zu anonymen Methoden dazu kommen wir dann auch in einem der nachsten Blogbeitrage Dies bedeutet dass anonyme Typen inline gebildet werden konnen Um dies zu verdeutlichen gleich ein kleines Beispiel using system using system Collections Generic using aystem Ling using System Text namespace AnonymousTypesbemo class Program i static void Mainistring args i var myIype new Firstname Norbert Lastname Eder myType 4 Equals Firstname string a Firstname I GetHashCode E GetTyoe Anonymous Types T 4 ais new string Firstname string Lastname E Lastname Q Tostring Abbildung 7 Anonyme Type
234. nistrator eingeloggt hat ist es moglich uber den Menupunkt Control Panel die weitere Konfiguration der Community vorzunehmen Weitere Informationen zur Installation und Konfiguration des Community Server findet man unter der URL http docs communityserver org Au erdem ist ein weiteres deutsches Tutorial von Alex Bierhaus unter der URL http Awww codezone de DetailPage Codezone GUID b6454095 59bf 4 74d be09 cb68a126c424 verfugbar Erfolgreich eingesetzte Installation findet man unter folgenden Adressen insbesondere erw hnenswert ist das offizielle ASP NET und XBox Forum von Microsoft e www hive net e Weblogs msdn com e forums asp net e forums xbox com e www glengamoi com NET BlogBook Ausgabe 4 5 14 SQL Server Web Data Administrator Es gibt nicht nur den ASP Net EnterpriseManager 1 um per Web Frontend SQL Server Datenbank zu administrieren sondern auch den SQL Server Web Data Administrator 2 von Microsoft 1 http www aspenterprisemanager com 2 http www microsoft com downloads details aspx FamilyiID CO39A798 C5 7A 419E ACBC 2A332CB F959 amp displaylang en 9 15 1LMerge im Einsatz Mit Hilfe des ILMerge Tools k nnen mehrere Assemblies zu einer einzigen Assembly zusammengef gt werden Vor allem bei gr eren Projekten entsteht nicht nur eine einzige ausf hrbare Datei Durch die Kapselung der Funktionalit t in unterschiedliche Bibliotheken werden diese als eigenst ndige Assemblies abgel
235. nn mit Erich Gamma Nach seiner Promotion an der Universitat Zurich 1991 ging er in die USA und verfasste zusammen mit Richard Helm Ralph Johnson und John Vlissides das Buch Design Patterns Elements of Reusable Object Oriented Software In diesem Buch wurden 23 Design Patterns beschrieben Dies verhalf den Entwurfsmustern zum Durchbruch Die vier Autoren sind gemeinhin auch unter Gang of Four GoF bekannt Zur Ubersichtlichkeit verwendete die GoF ein einheitliches Schema um die Design Patterns zu beschreiben Nachfolgend eine kurze Ubersicht Mustername und Klassifikation Zweck Synonyme Motivation Anwendbarkeit Struktur Beteiligte Klassen Akteure Zusammenspiel der involvierten Klassen Vor und Nachteile Implementierung Beispielcode Praxiseinsatz Querverweise Anhand dieses Schemas konnte ausreichend Information zum entsprechenden Design Pattern geliefert werden Wann ist es einsetzbar etc 4 5 3 Command Pattern Das n chste Pattern welches ich in meiner Rubrik Patterns vorstellen m chte ist das Command Pattern Defintion Das Command Pattern erm glicht die Repr sentation von Aktivit ten in eigenst ndigen Objekten Was bedeutet dies in der Praxis Innerhalb der selben Struktur k nnen unterschiedliche Commands ausgef hrt werden die jeweils eine bestimmte Aufgabe besitzen Unabh ngig davon welche Aufgabe ein Command hat muss das ausf hrende Konstrukt nicht ver ndert werden Zus tzlich besteht die
236. ns tze ausgegeben Und schon sind wir mit unserem Beispiel fertig 2 8 2 Artikelserie LINQ Die einen oder anderen werden das Blog von ScottGu kennen Denjenigen die es nicht kennen sich jedoch mit LINQ anfreunden m chten dem sei seine Artikelserie zum Thema LINQ to SQL ans Herz gelegt Part 1 Introduction to LINQ to SQL Part 2 Defining our Data Model Classes Part 3 Querying our Database Part 4 Updating our Database Part 5 Binding Ul using the ASP LingDataSource Control Part 6 Retrieving Data Using Stored Procedures Part 7 Updating our Database using Stored Procedures Part 8 Executing Custom SQL Expressions Part 9 Using a Custom LINQ Expression with the control Fur den Einstieg und fur die Schaffung von tiefergehendem Know How ist diese Artikelserie absolut zu empfehlen 2 9 Sonstiges 2 9 1 Erfolgsr ckmeldung aus eigenen Anwendungen Folgender Sachverhalt Eigene Anwendungen vorzugsweise Konsolen Anwendungen werden im Batch ausgef hrt beispielsweise via NAnt MSBuild etc Im Batch soll auf Abbruchbedingungen gepr ft und entsprechend reagiert werden Wie kann dies einfach mit NET 2 0 gel st werden Eigentlich ganz einfach Wieder einmal hilft der System Environment Namespace Mit Hilfe der Eigenschaft ExitCode besteht die M glichkeit einen solchen zu setzen O Null ist 172 NET BlogBook Ausgabe 4 standardm ig gesetzt und bedeutet dass die Anwendung erfolgreich ausgef hrt wurde Nun k
237. nt Datentypen unter dem SQL Server 2005 338 KB 7 7 C und SQL Server 2005 Immer wieder sto e ich auf Anfragen wie denn genau eine Anbindung an den SQL Server 2005 mit C oder VB NET funktioniert Grunds tzlich gibt es dazu zahlreiche Tutorials im Internet die meisten jedoch auf Englisch Diese Tatsache scheint dann doch sehr viele abzuschrecken Daher habe ich mich entschlossen ein Tutorial zu diesem Thema zu verfassen um eine entsprechende deutschsprachige Ressource bereitstellen ZU konnen Inhalt 1 Einfuhrung 2 Verbindung herstellen 3 Daten abfragen 4 Daten hinzufugen 5 Zusammenfassung 1 Einfuhrung Fur den Zugriff auf den SQL Server 2000 oder 2005 ist hierbei unerheblich werden vom NET Framework alle notwendigen Funktionen zur Verfugung gestellt Diese verstecken sich im Namespace System Data SgqlClient Fur den SQL Server k nnten zwar auch die Klassen aus dem Namespace System Data OleDb verwendet werden jedoch ist der DataProvider unter SqlClient auf den SQL NET BlogBook Ausgabe 4 Server optimiert und sollte au er andere triftige Gr nde sprechen dagegen verwendet werden 2 Verbindung herstellen Nun starten wir damit eine Verbindung zum SQL Server herzustellen Dazu verwenden wir die Klasse SqlConnection aus dem oben angegebenen Namespace Der Klasse SqlConnection muss ein ConnectionString bergeben werden Dieser definiert wo der SQL Server zu finden ist welche Datenbank verwendet wer
238. ntsprechenden Installations Hinweise der Hersteller verweisen Bei TestDriven NET ist lediglich die Installationsdatei zu starten Daraufhin wird das Add In im Visual Studio registriert und steht fortan zur Verf gung Vorabeiten Um nun f r ein neues oder bereits bestehendes Projekt Unit Tests anzuwenden sind Kleine Vorabeiten notwendig Idalerweise empfiehlt es sich Unit Tests in ein eigenes Projekt auszulagern Dieses Projekt muss nat rlich Teil der Visual Studio Solution sein Nach dem Anlegen dieses Projektes ist eine Referenz auf die nunit framework dll zu setzen Ist dies geschehen kann es mit einem konkreten Beispiel weitergehen Ein konkretes Beispiel Gehen wir davon aus dass unser Projekt einen Logger besitzt Dieser hat die Aufgabe allf llige Fehler in eine Logdatei zu schreiben Nat rlich muss dieser getestet werden ob er auch den an ihn gestellten Anforderungen gerecht wird Dazu erstellen wir eine TestKlasse LoggerTest Die neue Klasse muss zus tzlich mit dem Attribut TestFixture markiert werden Danach erstellen wir die NET BlogBook Ausgabe 4 einzelnen Methoden welche die einzelnen Tests darstellen Beispielsweise konnte dies folgenderma en aussehen public void LoggerLog try Logger log new Logger log LogPath C temptemp log log bog beer 3 Assert IsTrue true catch Exception ex Assert Fail ex Message Wie an diesem Beispiel zu sehen ist
239. ob es bereits eine Instanz gibt Wenn nicht wird eine neue erstellt ansonsten wird die bestehende Instanz zur ckgegeben Prinzipiell kann die Methode GetInstance auch als Getter Property abgebildet werden Die Thread Sicherheit bringt uns in diesem Fall das Schl sselwort lock Diesem kann als Parameter ein Objekt welches gesperrt werden soll bergeben werden Solange das bergebene Objekt durch einen Lock gesperrt wird kann kein anderer Thread darauf zugreifen Weitere Informationen zu diesem Thema sind unter anderem im WeWeblog von Dirk Primbs zu finden 4 5 5 Proxy Pattern Ein Proxy kann an vielen Stellen eingesetzt werden Grundlegend handelt es sich dabei um einen Platzhalter fur das tats chlich aufzurufende Objekt Das hei t es leitet vom gleichen Interface ab besitzt die gleichen Methoden leitet aber alle Anfragen an das dahinter liegende Objekt weiter Aber welchen Vorteil besitzt dieses Pattern nun Durch dieses Pattern ist es m glich nderungen und Pr fungen einzuf hren ohne das eigentliche Objekt ab ndern zu m ssen So k nnen beispielsweise Sicherheitspr fungen stattfinden Protection Proxy Dies bedeutet dass das Proxy Objekt zuerst berpr ft ob der Aufrufer ber die notwendigen Rechte verf gt bevor der Aufruf weitergeleitet und abgearbeitet wird Weiters wird h ufig ein Remote Proxy verwendet der die Anfrage kodiert an das echte Objekt sendet die Antwort dekodiert und zur ck gibt Dieser
240. ogramm zu schreiben und somit sehr flexibel auf neue Anforderungen reagieren zu k nnen Ein einfaches Konsolenprogramm w rde in diesem Fall ausreichen Das NET Framework bietet mit den Klassen HttpWebRequest und HttpWebResponse eine M glichkeit an per Programmcode Webseiten einzulesen und das Ergebnis in einem String zu speichern static string ReadUrl string url HttpWebRequest webRequest HttpWebRequest WebRequest Create url HttpWebResponse webResponse HttpWebResponse webRequest GetResponse Stream stream webResponse GetResponseStream StreamReader streamReader new StreamReader stream string html streamReader ReadToEnd return html Diese Methode nimmt die URL als Parameter entgegen und stellt per HttpWebReguest eine Verbindung her Das Objekt webResponse liest die R ckgabe aus und speichert diesen per GetResponseStream in einem String ab Existiert die URL nicht wird eine Exception ausgel st die dann abgefangen werden sollte Denkbar w re hier eine Benachrichtigung per E Mail oder ein Eintrag in ein Log File Das Konsolenprogrammm selbst nimmt die geforderte URL als Aufruf Parameter entgegen static v id Main string args if args Length 0 Console WriteLine Url is missing return Console WriteLine ReadUrl args 0 Um das ausgew hlte oder selbst geschriebene Programm zu einem fest definierten Zeitpunkt aufzurufen bietet sich der Task Manager an Unter Windows XP
241. ohoolbook j context Response Clear context Response ContentType image jpeg ci Image Save context Response OutputStrean System Drawing Imaging ImageFormat Jpeg ci Dispose Die Variable context vom Typ HttpContext ermoglicht die Ausgabe Ein Aufruf der Seite Climage ashx zeigt nun das Bild an und birgt keine unerwarteten Probleme in sich Den Download des erweiterten Beispielprojekts findet man hier 2 4 21 Using themed css files requires a header control on the page Mit dieser Fehlermeldung wird die Verarbeitung der ASP NET Seite quittiert sobald man das von mir beschriebene Captcha Control in eine Seite implementiert die Themes verwendet ASP NET erwartet den Head Tag in Form eines Server Controls damit die entsprechen Theme Informationen eingebunden werden k nnen lt head runat server gt Allerdings gibt es ASPX Seiten in denen dieser Tag nicht vorhanden ist In oben genanntem Beispiel bernimmt die Seite CIImage aspx das Streaming des Captcha Images und somit wurde dieser Tag zu Fehlern fuhren Um dieses Problem zu l sen hatte ich zun chst das Attribut EnableTheming Im Page Header auf false gesetzt Diese Einstellung bewirkt dass die Seite w hrend der Verarbeitung der Themes nicht ber cksichtigt wird Allerdings st rt sich der ASP NET Page Parser noch immer am fehlenden Tag und beendet den Aufruf mit derselben Fehlermeldung Es f hrt also kein Weg am Tag vorbei NET BlogBook Ausgabe 4
242. omanen in einem Prozess laufen konnen dann sollte der Speicherverbrauch auch entsprechend weit herunter gebrochen werden konnen Funktioniert aber nicht Ausweg Nun man sieht sich den Heap Speicher auf CLR Ebene an siehe CLR Profiler Damit weif amp man nun wie viele Objekte geladen sind wie viele Referenzen auf ein einzelnes Objekt zeigen und wie viel Speicher sie verbrauchen Nachteil Die Daten zu den Objekten liegen allerdings im Stack Wie an diesen Speicherverbrauch herankommen Wei ich noch nicht muss es aber auch fast eine L sung geben 2 2 42 C Daten zwischen zwei Formularen austauschen Immer wieder wird die Frage gestellt wie denn Daten zwischen zwei Formularen ausgetauscht werden k nnen Hierf r habe ich kurz ein kleines Testprogramm geschrieben welches genau dies zeigen soll Im Projekt sind zwei Formulare zu finden und eine Klasse DataExchange Diese wird von beiden Formularen verwendet und enth lt die entsprechenden Daten Aber seht euch doch einfach das Projekt an Bei Fragen kann ich immer noch weiterhelfen Download Source DataExchange zip Das Projekt wurde unter NET 1 1 erstellt sollte aber auch unter 2 0 lauff hig sein 2 2 43 C und Eigenschaften Eigenschaften sind ffentliche Eigenschaften von Klassen die private Member kapseln Das klingt jetzt kompliziert ist es aber nicht Prinzipiell ist es so dass einfache Variablen in Klassen immer privat und daher von au erhalb der Klass
243. on for simple task oriented workflow in an ASP NET web application A workflow model is used to automate work order requests at a small example company It includes three pre defined roles which each play a part in the work order creation approval and monitoring The starter kit may be modified for other workflow models to suit other small web based task management systems Den Download und weitere Infos gibt es hier Mehr Informationen zur Windows Workflow Foundation gibt es unter folgenden Links Windows Workflow Foundation WF Tutorials And Samples Hands on Labs for Windows Workflow Foundation Die Microsoft Windows Workflow Foundation Eine Einfuhrung fur Entwickler 2 6 5 WPF in Windows Forms verwenden In einem kleinen Projekt musste ich WPF Controls in einer Windows Form verwenden Wer vor eben solcher Geschichte steht sollte einen Blick auf den Artikel Hosting aWPF Control in aWindows Forms Application Interessante Sache Edit Da dieser Artikel noch auf eine Beta aufbaut m chte ich hier kurz die notwendigen Schritte erl utern da sich doch etwas ge ndert hat WPF Control erstellen Im ersten Schritt muss ein entsprechendes WPF Control erstellt oder ein vorhandenes benutzt werden In meinem Beispiel habe ich ein einfaches UserControl erstellt lt UserControl x Class AddinTestApp LoginControl xmins http schemas microsoft com winfx 2006 xaml presentation xmins x http schemas microsoft com winfx 2006 xaml Heigh
244. or A 0 Warnings i 0 Messages Description amp 1 The files AppCodeLang App_Code VB TestClassVB vb and amp ppCodeLang App_Code CS TestClassCS cs use a different language which is not allowed since they need to be compiled together Abbildung 41 ASP NET Unterschiedliche Programmiersprachen Der Grund fur die Fehlermeldung ist der Umstand dass der gesamte Inhalt des App_Code Ordner als Assembly kompiliert wird Innerhalb dieses Assemblies ist nur die jeweils ausgewahlte Sprache zulassig Nun hat man die Moglichkeit den gesamten Inhalt der VB NET Datei in C Code zu portieren Bei sehr umfangreichem Code kann dies schnell in sehr viel Arbeit ausarten Eine zweite Moglichkeit ware den Code per Hand in ein Assembly auszulagern und dies in der Applikation zu referenzieren ASP NET selbst bietet allerdings eine weitere Moglichkeit an die das Problem sehr schnell lost lt compilation debug true gt lt codeSubDirectories gt lt add directoryName VB gt lt codeSubDirectories gt lt oompi lation gt Diese Einstellung gibt dem Compiler die Anweisung dass der Ordner VB des App Code Verzeichnisses in ein separates Assembly ausgelagert werden soll Anschlie end startet die Anwendung ohne die zu Anfang genannte Fehlermeldung Den Download des Beispielprojekts findet man hier 2 4 51 machineKey Generator Auf ASP NETResources com findet man einen Generator um schnell und unkompliziert Keys f r die berpr fung und
245. osoft Developer Network MSDN Darin finden sich unter zahlreichen Artikeln und Hilfestellungen auch die Dokumentationen zu den einzelnen NET Framework Versionen Jede Klasse des NET Frameworks ist darin aufgelistet und gro teils mit Beispielen versehen So lassen sich die entsprechenden Namespaces finden als auch Hinweise wie die Klassen verwendet werden ob sie threadsicher sind und viele weitere Informationen Ein muss f r jeden NET Entwickler Weitere Ressourcen Zus tzlich finden sich eine Menge weiterer Ressourcen zum Thema NET im Internet Wer Beispiele sucht ist auf CodeProject gut aufgehoben Wer st ndig aktuelle Informationen Informationen zu neuen Technologien und oder Erfahrungsberichte sowie kurze Code Beispiele sucht der sollte sich auf NET Heute umsehen Zus tzlich finden sich eine Menge Foren wie die MSDN Foren Zu guter Letzt finden sich viele Personen aus der Community die doch meistens ein offenes Ohr f r den NET Nachwuchs besitzen Wer ein wenig guten Willen zeigt wird sicher nicht abgewiesen 2 1 2 Wo beginne ich als Anf nger NET BlogBook Ausgabe 4 Diese Frage wird immer wieder gestellt Womit soll begonnen werden wie beginnt man ein Projekt was ist zu beachten und viele weitere Fragen warten darauf beantwortet zu werden Nun im Grunde ist es nicht ganz so einfach und Anf nger haben oft das Gef hl von der Informationsflut quasi erschlagen bzw ertr nkt zu werden Doch es ist nicht ganz
246. ows Dienst und kann folgende und weitere Dateitypen indizieren DOC PDF XLS PPT RTF HTML TXT XML Ein Blick auf diese Tools sollte sich als durchaus lohnen 5 2 GUI fur Windows Installer XML WiX Windows Installer XML d rfte dem einen oder anderen durchaus bekannt sein NET BlogBook Ausgabe 4 The Windows Installer XML WiX is a toolset that builds Windows installation packages from XML source code The toolset supports a command line environment that developers may integrate into their build processes to build MSI and MSM setup packages Nun auch hier wird es ahnlich wie bei Sandcastle mit der Konfiguration ein wenig zeitintensiver Daf r gibt es aber Abhilfe CalmWix Es gibt zwar einige grafische Oberfl chen fur WixX aber CalmWix verspricht die funktionsreichste zu sein bzw generell zu werden Ein erster Screenshot zeigt die ansprechende Oberflache im Stil von Visual Studio 2005 gehalten und lasst auf wesentlich mehr hoffen Ein Release gibt es noch nicht aber wer mochte kann sich den Sourcecode genauer ansehen 5 3 Sandcastle Helferleins Wer Sandcastle als Ersatz f r beispielsweise NDoc einsetzt oder einsetzen m chte dem sei ein Blick auf zwei Helferlein zu empfehlen Sandcastle Help File Builder Eine grafische Oberfl che welche die Bedienung und Konfiguration von Sandcastle vereinfacht Sandcastle Add in Add in f r Visual Studio 2005 Und wer noch immer nicht genug hat der kann noch e
247. pare string filel string file2 int filelbyte int file2byte FileStream fsl FileStream fs2 Determine if the same file was referenced two times if filel file2 Return true gt indicate that the files are the sane return true Open the two files fsl new FileStream filel FileMode Open fs2 new FileStream file2 FileMode Open Check the file sizes If they are not the same the files are not the same if fsl Length fs2 Length ie the file tsl Closet fs2 Close JI Petu urn false to indicate files are different return false Read and compare a byte from each file until either a non matching set of bytes is found or until the end of filel is reached do Read one byte from each file filelbyte fsl ReadByte file2byte fs2 ReadByte while filelbyte file2byte amp amp filelbyte 1 f Close the files Tsl Closet fs2 Close Return the success of the comparison filelbyte is equal to file2byte at this point only if the files are NET BlogBook Ausgabe 4 the same return filelbyte file2byte 0 Den Artikel dazu findet man unter http support microsoft com default aspx scid kb EN US 320348 2 2 49 Ressourcen schonen Datenbanken besser ffnen und schlie en Viele Programme und insbesondere ASP NET Seiten verwenden Datenbanken um Daten zu speichern und zu verwalten Grunds tzlich
248. pty Table gesetzt wird zuerst der Kopf der Tabelle inkl der berschriften eingef gt Weiter wird eine leere Zeile hinzugef gt die den Text der Eigenschaft EmptyText anzeigt protected override int CreateChildControls System Collections IEnumerable dataSource bool dataBinding int numRows base CreateChildControls dataSource dataBinding if numRows 0 amp amp ShowEmptyTable Table table new Table table ID this ID GridViewRow row base CreateRow 1 1 DataControlRowType Header DataControlRowState Normal DataControlField fields new DataControlField this Columns Count this Columns Copyroitields 0 this InitializeRow row fields table Rows Add row row new GridViewRow 1 1 DataControlRowType DataRow DataControlRowState Normal TableCell cell new TableCell cell ColumnSpan this Columms Count cell Width Unit Percentage 100 cell Controls Add new LiteralControl EmptyText row Cells Add cell table Rows Add row this Controls Add table return numRows Um das abge nderte GridView zu verwenden muss es um Webprojekt referenziert und per Web Config registriert werden NET BlogBook Ausgabe 4 lt add assembly EmptyGridView namespace EmptyGridView tagPrefix CC gt lt Concrols gt lt c ntr ls gt Ist dies geschehen k nnen die Eigenschaften direkt per Intellisense aufgerufen und gesetzt werden In diesem Beispiel wird ein
249. r servername droplogins droplogins EXEC sp addserver Bserver Eservearpr perty servername tlocal local Damit wird die Serverregistrierung gel scht und neu gesetzt mit dem Wert aus dem Feld SERVERPROPERTY ServerName Wird ein Server umbenannt betrifft dies nur diese Eigenschaft der eigentliche Servername bleibt jedoch davon unber hrt Weiters sollte die Stored Procedure sp dropserver Mit droplogins aufgerufen werden um etwaige vorhandene Remotelogins ebenfalls zu l schen Andernfalls kann der Server nicht neu registriert werden Nach diesen Schritten ist der SQL Server neu zu starten und es kann nun versucht werden die Replikation zu konfigurieren Nun sollte es funktionieren 257 NET BlogBook Ausgabe 4 Der urspr ngliche Tipp ist auf der Microsoft Support Seite 1 zu finden jedoch ohne den droplogins Hinweis 1 Replication setup is not successful when SQL Server is deployed by using a disk Image 7 2 SQL Server 2005 Output Klausel Eines der neuen Features des SQL Server 2005 ist die OUTPUT Klausel die Transact SQL um eine n tzliche Funktion erweitert Durch die Angabe der OUTPUT Klausel k nnen in INSERT UPDATE und DELETE Anweisungen die betroffenen Datens tze oder Teile davon beispielsweise die Primary Key Werte zur ckgegeben werden Dies ist beispielsweise bei einem INSERT sehr interessant wenn die vergebene ID im weiteren Ablauf ben tigt wurde Diese konnte bisher via SELECT Iden
250. r CSV Datei angegeben werden An die Parameter FIELDTERMINATOR und ROWTERMINATOR bergeben wir das Semikolon und den Zeilenbruch Per TABLOCK sperren wir die Tabelle f r die Zeit des Imports und mit FIRSTROW 2 geben wir an dass unsere Daten ab der zweiten Zeile beginnen Die komplette Anweisung kann nun an ein SqlCommand Objekt bergeben und ausgef hrt werden NET BlogBook Ausgabe 4 Wenn es keinen Fehler gibt sollte das Programm unmittelbar nach dem Start bereits fertig sein Naturlich kann man dieses Beispiel noch beliebig ausbauen und auch die BULK INSERT Anweisung bietet noch wesentlich mehr Parameter an Wie man anhand der oberen Parameter vielleicht schon erkennen konnte kann man einen BULK INSERT auch auf andere Dateiformate als das CSV Format anwenden Das Beispielprojekt findet man unter der URL http www veloursnebel de Code BulklInsert zip 7 17 Daten Transfer mittels SqlBulkCopy beschleunigen Daten von einem Datenbank System auf das andere zu verschieben ist an sich keine gro e Sache Interessant wird es dann wenn Performance gefragt ist Wird das Ziel durch einen Microsoft SQL Server repr sentiert gibt es seit NET 2 0 die Klasse SqlBulkCopy die hier sehr gute Dienste leistet Durch ein BulkCopy ist es m glich eine gesamte DataTable zu transferieren ohne s mtliche Commands einzeln abzusetzen An dieser Stelle sei darauf hingewiesen dass ein SqlBulkCopy nur mit einem Microsoft SQL Server als Ziel funkt
251. r Verbindung ist die Methode Open zu verwenden Close sorgt fur das Schlie en der Verbindung 3 Daten abfragen Da wir nun eine Verbindung aufbauen k nnen erfolgt der n chste Schritt Daten abzufragen Hierf r werden die Klassen SglCommand und SqlDataReader verwendet Folgender Code bernimmt das f r uns SqlCommand com new SqlCommand SELECT FROM tPerson conn oq lDateaReader reader com ExzecuteReadert while reader Read NET BlogBook Ausgabe 4 Console WriteLine ID 0 Firstname 1 Lastname 2 reader 0 ToString reader 1 ToString reader 2 ToString reader Close Hier passiert nun folgendes Zuerst erstellen wir einen SqlCommand der auf der Datenbank ausgef hrt werden soll Als Parameter bergeben wir ein SQL Statement und die ge ffnete Verbindung conn Danach instanzieren wir einen SqiDataReader Dieser ist f r das Auslesen der Daten zust ndig Der Befehl com ExecuteReader sorgt daf r dass der Command ausgef hrt wird und ein DataReader zur ckgegeben wird Mit dem DataReader kann Datensatz f r Datensatz durch das Ergebnis iteriert werden was wir auch mit Hilfe der while Schleife tun Nachdem die Daten bezogen wurden ist der DataReader wieder zu schlie en Darin geben wir die Daten lediglich auf der Console aus Die Ausgabe w rde wie folgt aussehen ID 2 Firstname Test Lastname Person ID 1 Firstname Norbert Lastname Eder ID 3 Firstname
252. rPaint true this SetStyle ControlStyles OptimizedDoubleBuffer true this SetStyle ControlStyles AllPaintingInWmPaint true Taiti this Resize new Eventhandler SkypeProgressBar Resize void SkypeProgressBar Resize bJject sender EventArgs a pola ee this Invalidate this Updace ti private void Init chis b rderPolats new Poin gt Point pl new Point 3 1 Point p2 new Point this Width 3 1 Point p3 new Point this Width 1 3 Foint p new Point this Width 1 this H ight 3 Point pS new Point this Width 3 this Height 1 Point p6 new Point 3 this Height 1 Point p7 new Point 1 this Height 3 Point p8 new Point 1 3 Point py new Point a 1 this borderPoints 0 pl this DPorderFoints 1 BZ Enis borderfoints 2 pa this borderP lnts 3 p4 Chis BborderPaintel 4 po this b rderP lnte os DE Chis berderf lnts le pi this b rderPolnts 7 pe this BborderPfointe 8 py lt summary gt j 7 Raises the lt see cref E System Windows Forms Control Paint gt lt see gt event lt summary gt lt param name e gt A lt see cref T System Windows Forms PaintEventArgs gt lt see gt that contains the event data lt param gt protected override void OnPaint PaintEventArgs e base OnPaint e Point points new Point 4 Point pl new Point 0 0 Point p2
253. rbindungen etc benutzt sollte eine Methode Finalize vorhanden sein Diese wird bei der Freigabe des Objektes aufgerufen und somit k nnen verwendete Resourcen auch entsprechend behandelt bzw tats chlich freigegeben werden Hier ist zu beachten dass die Finalize Methode der Basisklasse auch aufgerufen wird Weiters immer einen try catch Block darum ziehen Eine weitere M glichkeit besteht durch das Dispose Pattern Hier ist eine Methode Dispose zu implementieren Durch den Aufruf von Dispose werden alle teuren Resourcen entsprechend freigegeben wie auch in der Finalize Methode muss hier der Code f r die Freigabe der Ressourcen manuell eingetragen werden Die Ressourcen werden durch diesen Aufruf sofort freigegeben ausser man wartet auf den Garbage Collector Die sch nere Variante besteht darin das 1IDisposable Interface zu implementieren Dadurch wird die Methode Dispose vorgeschrieben und muss entsprechend implementiert werden Nat rlich g be es an dieser Stelle noch mehr zu sagen aber das sollte als kurzer berblick durchaus reichen NET BlogBook Ausgabe 4 2 2 39 Wie die benotigten Rechte einer Assembly feststellen Mir hat sich die Frage gestellt wie man moglichst einfach die fur die Ausfuhrung einer Assembly notwendigen Rechte herausfinden kann Unter NET 2 0 ist dies recht einfach durch das Tool permcalc m glich Aufruf permcalc Show norberteder com lib dll Ausgabe Folgende XML Date
254. rch kleine Anpassungen unterschiedlichste Typen abgewickelt werden was sich sehr schnell positiv auswirkt und zudem alle fur die passende Aufgabe notwendigen Schritte trennt Dadurch lassen sich diese entsprechend anpassen bzw ganzlich ersetzen Download Builder Pattern Demo 4 5 7 Proxy Pattern Beschreibung und Beispiele Ein Proxy kann an vielen Stellen eingesetzt werden Grundlegend handelt es sich dabei um einen Platzhalter fur das tats chlich aufzurufende Objekt Das hei t es leitet vom gleichen Interface ab besitzt die gleichen Methoden leitet aber alle Anfragen an das dahinterliegende Objekt weiter Aber welchen Vorteil besitzt dieses Pattern nun Durch dieses Pattern ist es m glich nderungen und Pr fungen einzuf hren ohne NET BlogBook Ausgabe 4 das eigentliche Objekt ab ndern zu m ssen So k nnen beispielsweise Sicherheitspr fungen stattfinden Protection Proxy Dies bedeutet dass das Proxy Objekt zuerst berpr ft ob der Aufrufer ber die notwendigen Rechte verf gt bevor der Aufruf weitergeleitet und abgearbeitet wird Weiters wird h ufig ein Remote Proxy verwendet der die Anfrage kodiert an das echte Objekt sendet die Antwort dekodiert und zur ck gibt Dieser Vorgang ist unter anderem dann interessant wenn Application Domains erstellt werden sollen die zur Laufzeit die M glichkeit bieten sollen entladen werden zu k nnen Schlie lich w re da noch Cache Proxies die bestimmte Daten des eigentlic
255. reak this WriteLine this Formatter Format data as LogEntry else this WriteLine data ToString public override void Write string message LogManager GetCurrentClassLogger Log _ logLevel message public override void WriteLine string message NET BlogBook Ausgabe 4 LogManager GetCurrentClassLogger Log loglevel message Insgesamt werden drei Methoden uberschrieben wobei ansich nur zwei Methoden tatsachlich benotigt werden TraceData Write WriteLine Wichtig sind zwei Dinge Durch das Uberschreiben der Methode TraceData kommen wir an den TraceEventType Dieser gibt an um welches Fehler Level es sich handelt Critical Error Warning Info Dies benotigen wir um es an NLog weitergeben zu k nnen Der Rest besteht ansich im Aufruf der Methode WriteLine unter Einbindung des zugewiesenen Formatters Schlie lich muss noch eine App config eingebunden werden In dieser Konfigurations Datei wird die Konfiguration der Enterprise Library hinterlegt Per rechter Maustaste auf die App config kann die Enterprise Library Configuration gestartet werden welche sich mittlerweile netterweise ins Visual Studio integriert Zur Konfiguration m ssen die Eintr ge f r das Exception Handling und f r das Logging hinzugef gt werden Beim Logging verwenden wir unseren CustomTraceListener Dazu ist eine Assembly anzugeben unser separates Projekt Zu beachten ist hier folgendes NE
256. reich wenn Objekte auf null hin berpr ft werden soll Es wird die Linke Seite evaluiert Ist diese nicht null wird der linke Wert zur ckgegeben andernfalls der rechte Variante mit void foo string v String r v null 7 null v Variante mit dem Operator void 10951 string y String 2 y 77 null 2 2 17 Lese und Schreibrechte einer Datei berpr fen Kaum ein Entwickler berpr ft bei Dateizugriffe ob der aktuell angemeldete User auch tats chlich ber die entsprechenden Rechte verf gt Hintergrund ist wohl dass die meisten User mit einem Administrator Account was zumindest Windows betrifft angemeldet sind Hier eine einfache M glichkeit die Lese bzw Schreibrechte einer Datei abzufragen public class FileRightsReader public static bool IsReadable string filename WindowsIdentity principal WindowsIdentity GetCurrent f File Exists filename FileInfo fi new Filelnfo filename AuthorizationRuleCollection acl fi GetAccessControl GetAccessRules true true typeof SecuritylIdentifier NET BlogBook Ausgabe 4 ror int 1 OF 1 lt 21 1 4 System Security AccessControl FileSystemAccessRule rule System Security AccessControl FileSystemAccessRule acl if principal User Equals rule IdentityReference 1f System Security AccessControl AccessControlType Deny Equals rule AccessControlType if int FileSystemRights Read amp
257. rf also falls nicht signiert die neue Dom ne wieder zu entladen 2 2 84 EXIF Informationen mit C und Boardmitteln auslesen Neulich musste ich aus JPEG Dateien EXIF Daten auslesen Hierzu gibt es unterschiedliche M glichkeit So kann man sich auf externe Bibliotheken verlassen welche diese Funktionalit t anbieten oder es wird mit Hilfe der NET 2 0 Boardmittel umgesetzt Ich habe mich f r die zweite Variante entschieden die zwar einen entscheidenden Nachteil mit sich bringt der in meinem Fall jedoch nicht schlagend wurde Performance So musste ich nur das Erstellungsdatum des Bildes auslesen hier konnte ich nicht das Dateidatum heranziehen da das Bild eventuell nachbearbeitet wurde Das kann mit folgendem Code realisiert werden public class ExifReader public string ReadkxifDate Image image PropertylItem items image PropertyItems foreach PropertyItem pi in items if pi Id 306 string val System Text Encoding Default GetString pi Value return val return n a Die Eigenschaft Propertyltem ld repr sentiert grundlegend einen HEX Wert welcher angibt welche Informationen sich im Propertyltem befinden Dadurch k nnte dieses Beispiel wesentlich erweitert werden S mtliche IDs sind unter dem angegebenen Link ersichtlich Der angegebene Nachteil besteht nun darin dass f r diese Variante jedes Image beispielsweise ber Image FromFile geladen werden muss Dies kostet jede Men
258. ringBuilder Abbildung 5 Fehlender Namespace 1 Sehr n tzlich ist auch Ctrl Tab Dieser zeigt eine bersicht aller ge ffneten Dateien und Tool Fenster an EEE elas Ather Taal Wiehe oibr Piles oy Soko ire Defam yita Web UE Page af Poper ties beia bjer sender Svemtargs SH Server bier pe Sarl Page Ti Perding Checks Sent u Error Last l yo Tecan blaue AS AT Seren Pace C Development eria ring be feat wege ei Clickiohject sender Abbildung 6 Fehlender Namespace 2 2 2 53 Daten aus dem Clipboard in einer Konsolenanwendung verwenden M chte man Daten aus dem Clipboard in einer Konsolenanwendung verwenden muss diese als Single Threaded laufen M glich macht dies das Attribut STAThread welches vor der Main Methode plaziert werden muss In Winforms Anwendungen wird dieses Attribut standardm ig eingesetzt NET BlogBook Ausgabe 4 using System using System Windows Forms public class ReadFromClipboard STAThread Public static void Main IDataObject iData Clipboard GetDataObject if iData GetDataPresent DataFormats Text string str String iData GetData DataFormats Text 2 2 94 Url per WebRequest auslesen Immer wieder taucht in div Foren und Newsgroups die Frage auf wie man eine URL einlesen und das Ergebnis in einem string speichern kann Vor l ngerer Zeit habe ich mir daf r eine Methode geschrieben die genau diese Sache erledi
259. rklich l schen im GridView 2 Nach der Konvertierung steht ein vollwertiges LinkButton Control zur Verf gung Das Attribut OnClientClick des Controls kann nun dazu benutzt werden um eine JavaScript Anweisung auszuf hren sobald der Button geklickt wird lt asp TemplateField ShowHeader False gt lt ItemTemplate gt lt asp LinkButton ID LinkButtonl runat server CausesValidation False CommandName Delete OnClientClick return confirm Wirklich l schen Text Delete gt lt asp LinkButton gt lt ItemTemplate gt lt asp TemplateField gt Die JS Methode Confirm ffnet eine Hinweis Fenster und bietet die Buttons OK und Abbrechen an Entsprechend des Klicks liefert die Methode anschlie end ein true oder false Zur ck NET BlogBook Ausgabe 4 Windows Internet Explorer 7 Wirklich loschen ij Abbrechen Abbildung 24 Wirklich l schen im GridView 3 Der R ckgabewert wird nun per return Anweisung weitergereicht und somit die Verarbeitung des JavaScript zum L schen des Datensatzes abgebrochen oder weitergef hrt Den Download des Beispielprojekts gibt es hier 2 4 15 Pop Up per Response Redirect Immer mal wieder taucht in diversen Foren die Frage auf Wie kann ich ein Pop Up per Response Redirect ffnen Um die Frage hinreichend zu beantworten bedarf es einer weiteren Erkl rung Grunds tzlich wird in der Webforms Entwicklung zwischen zweier Arten Code unterschieden Code der auf dem
260. rt ben tigte ich unter anderem den Namespace die Klasse und den zugeh rigen Methodennamen von wo aus die Logging Routine aufgerufen wurde Die Informationen kann man mit Hilfe der Klasse StackTrace im System Diaqanostics Namespace auslesen werden System Diagnostics StackFrame stackFrame stackTrace GetFrame 1 System Diagnostics StackTrace stackTrace new System Diagnostics StackTrace System Reflection MethodBase methodBase stackFrame GetMethod Zun chst wird eine Instanz der Klasse StackTrace erstellt und mit Hilfe der Methode GetFrame 1 beginnend bei 0 die Aufrufliste des aktuellen Threads NET BlogBook Ausgabe 4 ausgelesen Nun kann man mit GetMethode eine Verbindung zu der Methode welche die Logging Routine aufgerufen hat herstellen methodBase DeclaringType Namespace methodBase DeclaringType Name methodBase Name string methodFullName String Format O 1 2 Uber die Eigenschaften Namespace und Name des DeclaringType kann man wie der Name schon sagt den Namespace und den Klassennamen auslesen w hrend das Property Name des methodBase Objekts den wirklichen Namen der Methode ausgibt 2 4 11 User and Role Management in ASP NET 2 0 Verwendet man die ASP NET Membership und Role Provider sucht man evtl eine M glichkeit auf einfache Weise die User und Roles zu verwalten ohne dieses direkt zu programmieren Normalerweise kann dies ber die ASP NET Web Site Administration Tool erledigt wer
261. rt werden sollen Daraus ergeben sich zwei wichtige Bestandteile des Logging Blocks Trace Listener Formatter Der Trace Listener bekommt die zu schreibenden Daten ubermittelt Durch die Einbindung eines Formatters k nnen diese Daten entsprechend formatiert werden um besser lesbar bzw einfacher zu verarbeiten sind Als Formatter stehen ein TextFormatter und ein XmlFormatter zur Verf gung Eigene Ableitungen sind an dieser Stelle nat rlich m glich Zudem wissen wir nun an welcher Stelle wir ansetzen m ssen Wir ben tigen einen CustomTraceListener Dazu wird ein eigenes Projekt erstellt welches den benutzerdefinierten Listener enthalten wird Nachfolgend der Sourcecode des Listeners ConfigurationElementType typeof CustomTraceListenerData public class NLogTraceListener CustomTraceListener private L gLevel loglLevel Loghevel Into public override void TraceData TraceEventCache eventCache string source TracsEventiype eventlype int 18 object data if data is LogEntry amp amp this Formatter null switch eventType case TraceEventType Critical _loghevel L gLevel Fatal break case TracekventType Error _loghevel Loghlevel Error break case TraceEventType Information Jagbevel Loglevel Inte break case TraceEventType Warning _logLevel LogLevel Warn break case TraceEventType Verbose _loghevel Loglevel Debug break default _Logbevyel LogLevel Into b
262. s Page if page null page ClientScript IsClientScriptBlockRegistered alert page ClientScript RegisterClientScriptBlock Lypeot Alert alert Sori 7 Unsere Funktionalitat kann nun von jeder beliebigen Stelle mit Alert Show Dies ist ein Test aufgerufen werden 2 4 42 ASP NET AJAX Linksammlung Hier ein paar Links zum Thema ASP NET AJAX ASP NET AJAX Download ASP NET AJAX Online Dokumentation ASP NET AJAX Video Tutorials AJAX Control Toolkit AJAX Control Toolkit Demos Weiters gibt es zu diesem Thema noch die ASP NET 2 0 AJAX Futures January CIP Hierfur muss jedoch mussen jedoch ASP NET AJAX 1 0 installiert sein In der Futures CTP befinden sich in Entwicklung befindliche Funktionalitaten Zu guter Letzt Die AJAX Cheat Sheets eine bersichtliche Darstellung der Klassen und Funktionen 2 4 43 HTML Seiten mit ASP NET Cachen Bei gro em Useraufkommen und oder auf Seiten die nicht immer 100 ig aktuell sein mussen bietet es sich an diese Seiten zu cachen Dies bedeutet dass die jeweilige Seite nicht bei jedem Aufruf neu gerendert werden muss Hier nun ein einfaches Beispiel fur das Cachen von ASP NET Pages Die Ausgangslage bietet folgende Seite lt Page Language C AutoEventWireup true Coderile DerTault aspx o2 Inherits Default y gt NET BlogBook Ausgabe 4 lt IDOCTYPE html PUBLIC W3C DTD XHTML 1 0 Transitional EN http www ws org TR xhtoml1 DT
263. s Pattern wird wurde f r eine bestimmte Aufgabe entwickelt und kann darin generisch eingesetzt werden Sie sollen also h ufig gestellte Aufgaben vereinfachen Weiters handelt es sich um eine Beschreibung der zusammen arbeitenden Objekte und Klassen Zur weiterf hrenden Recherche m chte ich erw hnen dass es unterschiedliche Typen von Design Patterns gibt e Erzeugungs Pattern e Struktur Pattern e Verhaltens Pattern Sollten n here Erkl rungen von N ten sein werde ich dies an den entsprechenden Stellen nachholen oder zu den unterschiedlichen Typen noch entsprechende Eintr ge schreiben 4 5 2 Geschichte Unter Was sind Design Patterns wurde der Begriff Design Pattern bereits definiert und auch die unterschiedlichen Arten wurden angef hrt In diesem Beitrag wird auf die Geschichte der Design Patterns eingegangen Bereits in den 1970er Jahren wurde die erste Sammlung von Entwurfsmustern erstellt allerdings von einem Architekten namens Christopher Alexander Die Idee dahinter hat sich seitdem nicht ver ndert Nur fand seine Sammlung wenig Anklang NET BlogBook Ausgabe 4 unter anderen Architekten in der Softwareentwicklung wurde die Idee jedoch bald darauf aufgegriffen und erfreut sich gro er Beliebtheit Ende der 1980er wurde die Sammlung von Christopher Alexander von Kent Beck und Ward Cunningham aufgegriffen und entwickelten auf deren Basis Entwurfsmuster f r grafische Benutzerschnittstellen Eine neue Ara begann da
264. s definiert Eine Zuweisung sieht beispielsweise wie folgt aus private TestEnum testEnum TestEnum EnumValueO Zu beachten ist dass testEnum immer nur einen Wert enthalten kann Dies f hrt uns nun zur Frage Was tun wenn ich jedoch mehrere Werte speichern m chte Ganz einfach Flags Flags k nnen mehrere Werte enthalten Zuerst jedoch ein Beispiel f r die Definition eines Flags Flaga public enum TestFlag FlagValuel 1 FlagValue2 2 FlagValue4 4 FlagValue8 8 FlagValuel6 16 Im Grunde handelt es sich hierbei um einen Enumerator dem zus tzlich das Attribut Flags verpasst wird Zus tzlich sind die einzelnen Werte entsprechend des Dualsystems 1 2 4 8 16 32 anzugeben da diese bei Mehrfachauswahl durch ein logisches Oder verkn pft werden TestFlag testf TestFlag FlagValuel testf TestFlag FlagValue2 In diesem Fall hat testf den Wert 3 Dieser repr sentiert FlagValuel und FlagValue2 Durch ein testf TestFlag FlagValuel reduziert sich der Wert auf 2 wodurch auch nur mehr dieses Flag gesetzt ist Abfragen k nnen nun folgenderma en gemacht werden if testf amp TestFlag FlagValuel gt 0 Trifft diese Bedingung zu ist das Flag gesetzt andernfalls w rde das Ergebnis 0 sein und die Bedingung w rde folgerichtig nicht zutreffen Pit testf amp TestFlag FlagValuel 0 Auf diese Weise kann festgestellt werden ob ein bestimmtes Flag nicht gese
265. s den gesamten Ablauf dieses Patterns zeigt Beispiel Anwendung Download 4 5 4 Singleton Das Singleton Pattern ist wohl eines der bekanntesten Design Pattern berhaupt Ziel ist es dass es innerhalb einer Anwendung von einer Klasse nur ein Objekt gibt Daher kann global auf dieses Objekt zugegriffen werden Einsatzgebiete f r das Singleton Pattern finden sich einige e Logging System welches Logging Daten in eine Datei schreibt e Druckerqueue in der alle Dokumente der Reihe nach abgearbeitet werden sollen e Implementierung eines globalen Storages e etc Das Singleton Pattern geh rt zu den Erzeugungsmustern engl Creational Patterns Im nachfolgenden Sourcecode Beispiel wird ein thread sicherer Singleton abgebildet Thread sicher bedeutet immer nur ein Thread auf eine Ressource zugreifen kann Dadurch k nnen ungewollte Effekte vermieden werden class Singleton private static Singleton instance null NET BlogBook Ausgabe 4 private static object lockObject new object private Singleton public static Singleton GetInstance lock lockObject if instance null instance new Singleton return instance Zu beachten ist dass ein Singleton einen privaten Konstruktor hat Dadurch wird gew hrleistet dass au erhalb der Klasse kein Objekt der Singleton Klasse erstellt werden kann Daf r wird die Methode GetInstance verwendet Hier findet die berpr fung statt
266. s unter Visual Studio 2005 gemacht werden kann Die Class Templates k nnen unter C Programme Microsoft Visual Studio 8 Common7 IDE ItemTemplatesCache CSharp 1033 Class zip gefunden werden liegen also in einem anderen Pfad als unter Visual Studio 2003 Im dar berliegenden Verzeichnis finden sich brigens die Templates fur die AssemblyInfo Form den Installer und alle anderen bekannten Templates Diese sind NET BlogBook Ausgabe 4 weiters in die jeweiligen Programmiersprachen unterteilt wodurch auch VB NET Entwickler ihre Templates schnell finden sollten Standardm ig sieht das Class Template so aus using System using System Collections Generic using System Text namespace Srootnamespaces class Ssafeitemrootname u So manchem st rt das fehlende public sowie auch in einigen F llen vordefinierte Regions Durch folgende Anpassung der Vorlage geh rt dieser Missstand der Vergangenheit an using System using System Collections Generic using System Text namespace SrootnamespaceS public class Ssafeitemrootname een Attributes endregion region Properties endregion region Private Methods endregion region Public Methods endregion So einfach wie diese Erweiterung k nnen auch zus tzliche Namespaces eingetragen werden 3 21 Tipps zum Debugging Visual Studio 2005 bietet kleine nette Features zum Thema Debuggen an die nicht sehr h ufig von Entwicklern genutz
267. s wird in der Property AppDomainSetup ShadowCopyDirectories eingestellt Mehrere Pfade werden hier durch ein Semikolon getrennt angegeben Alle darin befindlichen Assemblies werden dann f rs ShadowCopy herangezogen Zum Schluss gibt es auch noch ein wenig Sourcecode Hier zur Veranschaulichung mit fixen Pfaden 1 setup new AppDomainSetup setup ApplicationName Test NET BlogBook Ausgabe 4 setup ApplicationBase AppDomain CurrentDomain BaseDirectory setup PrivateBinPath AppDomain CurrentDomain BaseDirectory setup CachePath C temp cache setup ShadowCopyFiles true setup ShadowCopyDirectories Path Combine AppDomain CurrentDomain BaseDirectory Path DirectoryseparatorcChar Tostring Die Kopien w rden also im Verzeichnis C temp cache Test erstellt werden 2 2 45 Connection Probleme zu SQL Server 2005 Express Eventuell die nette Meldung provider Named Pipes Provider error 40 Could not open a connection to SQL Server Die Losung ist einfach Im ConnectionString wurde einfach der Instanzname bei der Data Source vergessen Beispielsweise 127 0 0 1 Instanzname angeben und schon funktioniert alles wie gewollt 2 2 46 Wieso gibt es keine Assembly Unload Methode Jeder der mit Reflection AppDomains und Assemblies arbeitet stellt sich fr her oder sp ter die Frage warum die Assembly Klasse keine Unload Methode bietet Eine Antwort findet sich in Jason Zander s WeWeblog
268. schnelle Ableitung leicht Abhilfe geschafft werden public partial class ComboBoxEx ComboBox private Label statusLabel new Label private String _statusTert null public string StatusText ger zezurn Thies sea Tee 3 Ber thie StartueText value j public ComboBoxEx InitializeComponent Init this Controls Ada this Statuselabel 7 this Sstatushabel Click new Eventhandler statuelabel Click this SizeChanged new EventHandler ComboBoxEx SizeChanged this SelectedIndexChanged new EventHandler ComboBoxEx SelectedIndexChanged void statusbabel Click obj ect sender EventArgs amp this DroppedDown true void ComboBoxEx SelectedIindexcCchanged object sender EventArgs ej if this SelectedItem null Init else this Staruslabel Y s lle tales vold ComboBoxExX SizeChanged object sender EventArgs e Hs ls oo public vaid Init if this DropDownStyle ComboBoxStyle DropDownList Chis StatusLabel Visible True this Statiushabel location new Pointi 1 Chie statneLabel bize new Size ifhls Wioch 20y Phis height 27 It Eis StatusTest 1S Anl this Statusbabel Text this statustexc Chie StatusLabel Font This Font NET BlogBook Ausgabe 4 else this StarusLlabel Text Nothing selected Enig Statvebsebe Pringiorront else this StatusLabel visible fals
269. script Da der Event ausgef hrt wird nachdem sich die Auswahl bereits ge ndert hat muss man den vorherigen Index speichern Das entsprechende Script hierf r registriert in meinem Fall die Methode RegisterStartUpScript private void RegisterStartUpScript string script var currentIndex document getklementById ddlList ClientID selectedIndex ClientScript RegisterStartupScript this GetType AdlSelectedIndex script Crue Das entsprechende Beispielprojekt findet man hier EDIT Auf vielfachen Wunsch habe ich auch eine NET Framework 1 1 Version des Beispielprojekts erstellt Download 2 4 28 Cache l schen Folgende kleine Methode habe ich heute geschrieben Ihre Aufgabe ist es alle vorhandenen Cache Items zu l schen private void DeleteAllCacheltens ooo SCH DEE once Ts Currency IDictionaryEnumerator d ctx Cache GetEnumerator while d MoveNexst ctx Cache Remove d Key ToString Brav wie ich bin habe ich diese nat rlich auch auf snippetcenter org ver ffentlicht 2 4 29 Kopieren einer ASP NET 1 1 Anwendung und VS 2003 Visual Studio NET hat ermittelt dass auf dem angegebenen Webserver nicht die ASP NET Version 1 1 ausgef hrt wird ASP NET Webanwendungen und dienste k nnen daher nicht ausgef hrt werden Diese Fehlermeldung bekam ich heute angezeigt nachdem eine Anwendung in einen anderen Ordner kopiert wurde Diese verwirrende Fehler
270. se Klassen im Framework erhalten bleiben sollten Ich handhabe dies so dass obsolete Klassen beim bern chsten Major Release entfernt werden Alle Minor Build oder gar Revision Versionen werden nicht mit einbezogen Dies bedeutet nun anhand eines Beispiels In der Version 2 0 eines Frameworks wird eine Klasse als obsolete markiert dann fliegt diese in Version 4 0 tats chlich hinaus So bleibt gen gend Zeit auf die neue Klassenstruktur umzustellen 2 2 15 Verwendung des Namespace Alias Qualifier Gehen wir von folgendem Code aus Clase rogram public class System const int Console 1 const int number 2 static void Main string args Console WriteLine number Problem System Console WriteLine number Problem NET BlogBook Ausgabe 4 Hier wird eine Klasse System erstellt onne den System Namespace des NET Frameworks zu beachten Zusatzlich gibt es einen privaten Member namens Console Davon ausgehend konnen die zwei Aufrufe der Main Methode nicht mehr funktionieren Wie dem Abhilfe schaffen Daf r gibt es den Namespace Alias Qualifier global System Console WriteLine number Funktioniert Der Sinn Vor allem bei Frameworks kann es passieren dass Member eines globalen Namespaces unabsichtlich ausgeblendet werden Durch den Namespace Alias Qualifier k nnen diese jedoch ganz normal verwendet werden 2 2 16 Der Operator Der Operator ist u erst hilf
271. sieren immer und berall mit in den Test einbezogen und im Fehlerfalle kann dies bevor das Produkt den User erreicht nachgebessert werden Der Sinn hinter solchen Tests ist der dass wie oben beschrieben problematische Parameterubergaben im Fehlerfalle behandelt werden da auf das Testergebnis entsprechend zu reagieren ist Da eine Software laufend weiterentwickelt wird werden auch st ndig an allen erdenklichen Stellen nderungen vorgenommen Dadurch ist es in manchen F llen schwer zu sagen ob eine andere Stelle noch korrekt funktioniert Durch diese Unit Tests kann dies einfach festgestellt werden Dazu sind nach der durchgef hrten nderung die Tests auszuf hren und wenige NET BlogBook Ausgabe 4 Sekunden bis Minuten sp ter Abh ngig von der Projektgr e hat der Programmierer Gewissheit Notwendige Tools Zu Beginn muss nat rlich gekl rt werden welche Tools notwendig sind um Unit Tests unter dem Visual Studio verwenden zu K nnen Aus meiner Erfahrung haben sich folgende Produkte als u erst hilfreich erwiesen e TestDriven NET 1 e NUnit 2 Bei TestDriven NET handelt es sich um Unit Testing Add In f r Visual Studio welches mit unterschiedlichsten Unit Testing Tools zusammenarbeiten kann Zu erw hnen waren hier NUnit MbUnit und csUnit Bei NUnit handelt es sich um ein Test Unit Framework mit dessen Hilfe Unit Tests durchgef hrt werden k nnen Installation An diesem Punkt m chte ich nur an die e
272. siert Es wurde versucht auf ein Objekt zuzugreifen welches null ist Im Gegensatz zu Werttypen m ssen Referenztypen instantiiert werden Erst dann kann ein Zugriff darauf stattfinden Beispiel MyObject o null o CallMethod NullReferenceException Hier wurde das Objekt nicht instantiiert und f hrt daher zu einer NullReferenceException MyObject o new MyObject o CallMethod keine Exception Da in diesem Beispiel das Objekt instantiiert wurde wird der Methoden Aufruf ohne Ausnahme ausgef hrt NET BlogBook Ausgabe 4 Um eine NullReferenceException zu vermeiden ist es sinnvoll vor dem Zugriff auf ein Objekt zu berpr fen ob es nul1 ist Ist dem nicht so kann weitergearbeitet werden MyObject o null if o null o CallMethod Damit wird sichergestellt dass der Code innerhalb der Bedingung nur ausgef hrt wird wenn das Objekt erfolgreich instantiiert wurde Und so ganz nebenbei fliegen dem Benutzer weit weniger Exceptions um die Ohren Womit wir schon beim n chsten Thema w ren Danke Frank f r den Hinweis Exception Handling Nat rlich muss nicht nur abgefragt werden ob das Objekt null ist sondern diese Tatsache ist auch entsprechend zu behandeln So kann beispielsweise die restliche Aufgabe ohne dieses Objekt nicht korrekt ausgef hrt werden Im Falle eine if Bedingung ist hier ein entsprechender else Zweig notwendig Besser eignet sich ein entsprechender try catch Block um diese
273. sind Das GridView Control eignet sich hervorragend um Daten jeglicher Art anzuzeigen Sind allerdings keine Daten vorhanden wird das gesamte Control ausgeblendet Eine h ufige Anforderung ist es jedoch einen Text welcher auf die nicht vorhandenen Daten hinweist und die berschriften der Tabelle anzuzeigen Zur ck gt hi x B N j Sucher Adresse http Nocalhost 19 10 EmptyGridViewWeb Def Data Keine Daten vorhander Um dieses Problem zu l sen bietet sich ein CustomControl an welches vom GridView abgeleitet und um die ben tigte Funktionalit t erweitert wird Die ben tigten Funktionen definieren sich wie folgt e M glichkeit das GridView trotz leerer Daten anzuzeigen e Eingabe eines Textes der bei leeren Daten angezeigt wird Zun chst m ssen die zus tzlichen Eigenschaften definiert werden Die Eingaben sollten im ViewState abgelegt werden damit diese auch nach einem PostBack zur Verf gung stehen public bool ShowEmptyTable NET BlogBook Ausgabe 4 get object o ViewState ShowEmptyTable return o null bool o true Ser ViewState ShowEmptyTable value public string EmptyText get object o ViewState EmptyText return io le null 7 8 Testritgt 73 set ViewState EmptyText value Anschlie end wird die Methode CreateChildControls berschrieben und angepasst Sind keine Zeilen an das GridView gebunden und die Eigenschaft ShowEm
274. skussionspunkt an dieser Stelle stellt sicherlich als Beispiel Bentley dar Die Lederausstattung wird manuell eingepasst und montiert Dies wirkt dementsprechend der obigen Formel entgegen Die Geisteshaltung stellt jedoch einen sehr wichtigen Baustein zum Geb ude Qualit t dar Steckt kein hohes Ma an Qualit tsbewu tsein in den K pfen der Mitarbeiter ist es nahezu unm glich qualitativ hochwertige Produkte zu erzeugen Mitarbeiter m ssen diesen Gedanken tragen sich daf r einsetzen und wie auch das Management entsprechende Verbesserungsvorschl ge bringen und NET BlogBook Ausgabe 4 durchsetzen siehe auch Total Quality Management TQM Doch zur ck zur Frage Was ist wirklich Qualit t Qualit t wird nicht durch ein Produkt oder ein Unternehmen definiert Qualit t beginnt bei der Zufriedenheit des Kunden und endet beim ersten R mpfen der Nase Dies ist klarerweise hart definiert aber es entspricht in etwa der Erwartungshaltung des Kunden Und nein Das ist noch nicht alles Support Kommunikation mit dem Kunden rasche Fehlerbehebung und vieles mehr f llt den Begriff Qualit t aus Es ist also gut zu sehen dass es immer und berall M glichkeiten gibt die gebotene Qualit t zu erh hen Auf den Punkt gebracht Trotz aller Normen und Richtlinien Qualit t ist eine subjektive Sichtweise Dieser kann jedoch durch eine effiziente und beharrliche Umsetzung nahegekommen werden 4 6 2 Enterprise Logging Application
275. so kompliziert Zu unterscheiden gilt e Kann ich alles um ein bestimmtes Projekt erfolgreich abzuschlie en e Welches Wissen fehlt mir e Wie plane ich ein Projekt von A bis Z Die erste Frage muss jeder f r sich selbst beantworten Wenn man etwas nicht kann muss einfach die notwendige Zeit aufgewandt werden Komme es wie es wolle Viele Tests viele Dokumentationen lesen und mit vielen Menschen sprechen Das quasi offene Geheimrezept Es ist zudem sehr wichtig zu wissen welche M glichkeiten man nicht hat wo Wissen zu diversen Themengebieten fehlt und vor allem nat rlich Wie komme ich an dieses Wissen Zur dritten Frage gibt es jede Menge Bucher zum Thema Projektmanagement Hier m chte ich mit meinen Ergussen keine Verwirrung stiften Eher besser ein allgemein anerkanntes Buch schnappen und los geht s Im Internet lassen sich zahlreiche Ressourcen vor allem auch f r Anf nger finden Es macht sich bezahlt diese zu konsultieren Hier ein paar Starthilfen Galileo Computing lt openbooks gt The CodeProject Microsoft CodePlex NET Heute 2 1 3 Serialisierung und Versionierung Bei Verwendung der NET Serialisierung stellt sich bei einer nderung von zu serialisierenden Objekten oft die Frage wie diese auf der Gegenseite behandelt werden Um Probleme beim Deserialisieren auf der Gegenseite zu vermeiden k nnen die zus tzlichen Eigenschaften mit unterschiedlichen Attributen versehen werden um dieser Falle
276. sollen einfach aufbereitet und bersichtlicher Form vermittelt werden Das Zielpublikum wird sowohl durch den NET Einsteiger als auch durch den Profi gepr gt Ebenfalls wird ein weiterer Ausbau dieses Projektes ins Auge gefasst Zus tzlich zum BlogBook werden auch Livecasts sowie Podcasts veranstaltet NET BlogBook Ausgabe 4 Kurzdefinition Ein umfassendes How To Werk fur alle NET Entwickler und solche die es noch werden wollen 1 3 Was wird in diesem Buch nicht abgedeckt Kein Ziel ist es absolute Grundlagen Themen zu vermitteln die in einschl gigen B chern in den ersten Kapiteln zu finden sind Die ersten Kapitel in diesem Buch besch ftigen sich dementsprechend bereits mit hilfreichen Tipps und Ratschl gen Die typischen Einf hrungskapitel eines Programmier Buches gibt es nicht und wird es auch in naher Zukunft nicht geben Im Vordergrund sollen hilfreiche Tipps stehen als auch jede Menge Code Beispiele um dem Entwickler eine schnelle und einfache Unterst tzung zu bieten Zus tzlich wird zu jedem Code Beispiel entsprechendes Hintergrundwissen vermittelt Dieses Buch ist auch nicht geeignet von A bis Z durchgelesen zu werden Vielmehr werden Tipps und Tricks zu bestimmten Gebieten angeboten Es ist als Nachschlagewerk konzipiert und wird dies auch zuk nftig bleiben 1 4 Verbesserungsvorschl ge Wie jedes andere Projekt auch lebt dieses nicht nur vom Aufwand der Verantwortlichen sondern auch von den Konsumenten d
277. sserungen zu bringen Soma Somasegar f hrt auf an welchen Stellen gedreht wurde um die Performance von Visual Studio 2008 zu verbessern Hier ein Auszug e Rebuilding a Visual Basic project and running a background compiler is 3x faster and uses 3x less memory e Scrolling large C files in the Editor is 100 faster while typing in new text is 50 faster e The response time of IntelliSense with large types in C is up to 10 times faster e Incremental build time runs up to 90 faster on C CLI project solutions Office Word and Excel files are processed 20x faster on the server e TFS Version Control command processing was re written to support unlimited sized operations on key commands without being memory bound on the server In our measurements key Commands also run 10 60 faster with the larger improvements associated with bigger projects 3 17 Visual Studio 2005 IntelliSense funktioniert nicht mehr Wer sich beispielsweise den ReSharper testhalber installiert k nnte nach der Deinstallation bemerken dass Intellisense nicht mehr funktioniert Hierzu sind folgende Einstellungen zu treffen damit es wieder verwendet werden kann NET BlogBook Ausgabe 4 Unter Tools Options auf Text Editor C General m ssen folgende Eintr ge aktiviert sein e Auto list members e Parameter information El Environment A Statement completion l Performance Tools al Auto list members Gl Projects and Solutions Hide advanced
278. st es n tig dem WebForm entsprechende Methoden f r die Events onkeydown und onkeyup hinzuzuf gen Wird eine Taste gedr ckt liefern diese Events einen KeyCode zur ck der jeweils einer Taste zugeordnet ist Die Shift Taste gibt den Code 16 zur ck Aufgabe dieser Methoden ist es nun den KeyCode in der globalen Variable globalKeyCode ZU speichern oder bei loslassen der Taste wieder zu l schen function Document KeyDown event document onkeydown function SetGlobalKeyCode event globalKeyCode GetKeyCode event function Document KeyUp event document onkeyup function ClearKeyCode event globalKeyCode 0 function GetKeyCode event event event window event return event keyCode Wie oben angedeutet wird die Methode ShiftClick aufgerufen sobald ein CheckBox Control geklickt wird Diese Methode stellt zun chst mit Hilfe weiterer globaler Variablen firstClick und lastClick fest ob bereits eine CheckBox vorher markiert wurde und die Shift Taste gedr ckt ist Ist dies der Fall wird NET BlogBook Ausgabe 4 anschlie end der Start und das Ende der Schleife ermittelt um die zwischenliegenden Controls zu markieren oder die Markierung zu entfernen function Shiftllick slickedPoas lastClick clickedPos if globalKeyCode 16 AT fiver lligk gt 1 22 lastCligk gt I var 12 var start firstClick lt last lick 7 firstClick 2 lastClick var end
279. stellt wird Zum Zeitpunkt des Aufrufs von Session End Ist die Session des Users wie der Name schon sagt bereits beendet und somit findet auch kein Request mehr statt Um die Funktionalit t von Server MapPath trotzdem abbilden zu k nnen kann man das Property AppDomainAppPath der HttpRuntime Klasse zur Hilfe nehmen private string MyMapPath string file return Path Combine HttpRuntime AppDomainAppPath file In Verbindung mit der Path Comine liefert diese Methode nun den kompletten Pfad zur ck 2 4 20 Dynamische Bilder per Generic Handler ashx anzeigen Um dynamische Bilder in ASP NET Seiten anzuzeigen verwendet man am besten einen Generic Hander ashx anstatt eines Web Forms und die damit verbundenen Probleme Diesen Tipp gab mir Thomas per Kommentar bezugnehmend auf das Posting Formulare gegen SPAM sch tzen und Using themed css files requires a header control on the page Grunds tzlich ist ein Web Form von der Klasse System Web UI Page abgeleitet und ist somit daf r gedacht HTML Webcontrols und hnliches anzuzeigen Da die Anforderung aber einfach nur die Ausgabe eines Bildes per Stream ist sind diese Dinge v llig unn tig In diesem Moment kommt der Generic Handler ins Spiel Ein Generic Handler implementiert das IHttpHandler Interface und erlaubt es somit einen HTTP Handler zu schreiben ohne ihn vorher kompilieren zu m ssen HTTP Handler werden normalerweise benutzt und auf eine vorher definierte Date
280. t name varchar 300 AS SET NOCOUNT ON INSERT INTO Tabellel name VALUES name SELECT IDENTITY SET NOCOUNT OFF INSERT INTO Tabelle2 Tabellel ID name VALUES IDENTITY name GO Zunachst wird per SET NOCOUNT ON angewiesen dass die Anzahl der betroffenen Zeilen nicht als Teil des Ergebnises des INSERT INTO zuruckgegeben wird Per INSERT INTO Anweisung wird nun der Datensatz in die erste Tabelle eingef gt Anschlie end wird per SELECT IDENTITY der ID Wert des eingef gten Datensatzes ausgelesen Die Variable IDENTITY enth lt immer den zuletzt eingef gten Identit tswert Nun kann per zweiter INSERT INTO Anweisung der n chste Datensatz eingef gt werden Nat rlich ist es m glich diese L sung ohne Stored Procedure zu verwenden um z B die ID direkt im Code weiter zu verwenden SET NOCOUNT ON INSERT INTO Tabellel name VALUES name SELECT IDENTITY AS NewlD Die inkrementelle ID wird nun als Feld NewID ausgegeben 7 16 Import einer CSV Datei mit Hilfe von BULK INSERT BULK INERTS ermoglichen ein sehr schnelles Einfugen von vielen Daten mit einer Sql Anweisung Voraussetzung f r diese Art Import ist allerdings der Microsoft SQL Server Des Weiteren muss sich die Import Datei ebenfalls auf dem SQL Server befinden Fur den Import bereiten wir zunachst die Tabelle in der Datenbank vor Der Aufbau muss identisch mit der CSV Datei sein In meinem Beispiel verwende ich die Spalten Datenl Da
281. t 118 Width 300 gt lt Grid Height 120 gt lt Label Height 23 HorizontalAlignment Left Margin 9 19 0 0 Name labell VerticalAlignment Top Width 120 gt Username lt Label gt lt Label Height 23 HorizontalAlignment Left Margin 9 40 0 0 Name label2 VerticalAlignment Top Width 120 gt Password lt Label gt lt TextBox Height 21 Margin 91 21 20 0 Name UsernameTextBox VerticalAlignment Top gt lt TextBox Height 21 Margin 91 44 20 0 Name PasswordTextBox VerticalAlignment Top gt lt Button Height 23 HorizontalAlignment Right Margin 0 77 20 0 Name LoginButton VerticalAlignment Top Width 75 gt Login 167 NET BlogBook Ausgabe 4 lt erid gt lt Button gt lt VUserfentrsl gt Windows Formular erstellen Im zweiten Schritt wird ein normales Windows Forms Formular erstellt Im selben Projekt m ssen nun einige Referenzen hinzugef gt werden e PresentationCore e PresentationFramework e UlAutomationProvider e UlAutomationTypes e WindowsBase Zus tzlich ist noch die Assembly WindowsFormsintegration dii zu laden Diese befindet sich f r gew hnlich im Ordner Sprogramfiles Reference Assemblies Microsoft Framework v3 0 WindowsFormsIntegration dll WPF Control zur Anzeige bringen Wenn nun sowohl das WPF Control als auch das Windows Formular erstellt wurden kann das WPF Control folgenderma en eingebunden werden private void MainFrorm Load o
282. t Build Debug ely en lose ER Add New Item Ctrl Shifk 4 Add Existing Item ShiFk Alt 4 Add Project m Open Solution Fad Close Solution D gpa Ctrl a Save Al Ctrl 5hift 5 Source mee E1 View in Browser Browse with D r Page Setup amp Print Ctrl P Recent Files Recent At Stee Exit Abbildung 55 Webprojekte und Firefox 1 179 NET BlogBook Ausgabe 4 Im sich ffnenden Dialog einfach den gew nschten Browser ausw hlen und auf Default stellen Browse With 99 x Browser list Firefox exe Default Browse Internal Web Browser Microsoft Internet Explorer Add BEMOYE Size of browser window Default Close Help Abbildung 56 Webprojekte und Firefox 2 Nun die Projekteigenschaften ffnen Im Bereich Configuration Properties Debugging gibt es den Eintrag Always Use Internet Explorer Dieser muss auf false stehen und schon ist die Umstellung komplett BMSSeryver Property Pages f l x Configuration JActive Debug Platform Active NET Configuration Manager 2 Common Properties El Debuggers 3 Configuration Properties Enable 45P Debugging False Build Enable ASP NET Debugging True Se eDUgAING Enable Unmanaged Debugging False Advanced Enable SQL Debugging False O Start Action Debug Mode Project Start Application Skart URL
283. t eine OODBMS in diesen Gebieten sicherlich langsamer als ein herk mmliches RDBMS 3 Angst Das Thema OODBMS ist an sich genau so alt wie es objektorientierte Sprachen sind Letztere haben sich in einigen Bereichen Enterprise etc durchgesetzt Erstere nicht Warum Nun relationale Datenbanken sind einfacher zu handhaben und wurden ber lange Zeit erprobt Viele haben davor Angst auf eine neue Technologie zu setzen Anm die jedoch nicht viel j nger ist Dadurch flie t auch nicht soviel Entwicklungsarbeit in objekt orientierte Ans tze bei Datenbank Management Systemen 4 Fehlende Unterst tzung Viele L sungen entstehen und verschwinden entsprechend auch wieder da die Nutzung nicht vorhanden ist Ich pers nlich kenne nur ein OODBMS welches sich lange gehalten hat Cache 1 Alle anderen sind entweder gemeinn tzige Projekte mit mehr oder weniger geringem Support Nat rlich gibt es da noch andere Punkte Der Vollst ndigkeit halber stehen dem jedoch auch sehr viele Vorteile gegen ber keine Frage Allerdings sehe ich hier db4o 2 nicht unbedingt das als Gelbe vom Ei an Aber der Weg den db4o beschreitet ist prinzipiell nicht so schlecht NET BlogBook Ausgabe 4 1 http www intersystems com cache 2 http www db4o com 7 9 SA User unter SQLServer 2005 umbenennen Unter dem Microsoft SQL Server 2000 ist es ja nicht moglich den sa User umzubenennen bzw zu deaktivieren Der SQL Server 2005 bietet allerd
284. t erm glicht es einen einfachen Download einer Datei via HTTP durchzuf hren Ein Anwendungsfall w re z B der Download einer Bilddatei die sich auf einem Webserver befindet Der Quellcode f r den Aufruf beschr nkt sich auf einen Zweizeiler verpackt in einer Methode NET BlogBook Ausgabe 4 WebClient webClient new WebClient webClient DownloadFile url private static void DownloadFile string url Path GetFileName url In diesem Beispiel wird die Datei heruntergeladen und lokal unter demselben Namen gespeichert 2 2 51 Dateidownload ohne Filesystem Ab und an m chte der ASP NET Entwickler dem User eine zuvor generierte Datei zum Download anbieten Die normale Vorgehensweise w re nun die Datei zu erstellen diese im Filesystem abzuspeichern und dann zum Client zu streamen muss man diese Datei archivieren ist dieses Vorgehen v llig OK Anders sieht es aus wenn die Datei nur tempor r f r den Download erstellt wird In diesem Fall gibt es eine wesentlich bessere L sung Datei erstellen und zum Client streamen F rs Erste ben tigen wir eine Methode die unseren Dateiinhalt in einem String speichert In diesem Beispiel ist das ein einfacher Dummytext der 10 000 Mal an den String angeh ngt wird private byte GenerateFile StringBuilder sb new StringBuilder for int L Os 1 lt 100007 3 sb Append Test Test Test Test Test Test Test Test r n string fileContent sb ToStr
285. t param name e gt The lt see cref System Windows Forms PaintEventArgs gt instance containing the event data lt param gt private void PaintActivePart PaintEventArgs e int y this Height 6 2 double width this Width 6d double this Maximum double this Value if Value Maximum width this Width 6d if width gt Q0 LinearGradientBrush lgb new LinearGradientBrush new Rectangle 3 y int width this Height y 3 this darkActiveColor this darkActiveColor2 90f e Graphics FillRectangle lgb new Rectangle 3 y 1 int width this Height y 3 e Graphics FillRectangle new SolidBrush this brightActiveColor new Rectangle 3 3 int width y lt summary gt Paints the progress bar lt summary gt lt param name e gt The lt see cref System Windows Forms PaintEventArgs gt instance containing the event data lt param gt private void PaintBar PaintEventArgs e NET BlogBook Ausgabe 4 PaintDisabledPart e PaintActivePart e Wichtig ist dass beim Setzen der Eigenschaft Value durch ein Invalidate das Neuzeichnen des Controls veranlasst wird Durch den Aufruf der Update Methode wird die Aktualisierung sofort vorgenommen Durch den Auftrag das Control neu zu zeichnen wird das OnPaint Event ausgel st welches nun das Control tats chlich via GDI zeichnet Das war es mit der Hexerei Das Endergebnis s
286. t werden Dabei k nnen diese kleinen M glichkeiten das Leben durchaus erleichtern Setzen wir an einer bestimmten Stelle im Sourcecode ich verwende hier ein paar 187 NET BlogBook Ausgabe 4 wenige Sourcecode Zeilen zur Veranschaulichung Per rechter Maustaste auf den Breakpoint erhalten wir ein Kontextmen mit einigen hilfreichen Eintr gen Delete Breakpoint Disable Breakpoint Location Condition Hit Count Filter When Hit Sehen wir uns den Punkt Condition genauer an Breakpoint Condition When the breakpoint location is reached the expression is evaluated and the breakpoint is hit only if the expression is true or has changed Condition Is true Has changed Cancel Beim Durchlaufen des Sources wird bei jedem Hit des Breakpoints die eingegebene Bedingung berpr ft Trifft diese zu sofern der Punkt Is true gew hlt wurde wird an dieser Stelle unterbrochen wie im n chsten Screenshot gut zu sehen ist 188 NET BlogBook Ausgabe 4 7 class Program s d 9 static void Main string args 18 11 string strTest String Empty 12 13 for int 1 1 lt 10 i 14 Yo 15 strTest a 16 u strTest Q aaa 17 18 Eine weitere M glichkeit ist durch den Punkt When Hit gegeben W Delete Breakpoint a Disable Breakpoint Location Condition Hit Count Filter When Hit Durch diesen wird ein Einstellungsfenster
287. t wie folgt anzupassen using System namespace output SAFE NAMESPACE NAME i Kr summeary gt fff Summary description for output SAFE CLASS NAME fff summaryv gt public class output SAFE CLASS NAME i region Private Fields fendreqian H reqion Properties fendregqion reqion Prirate Methods endregsion reqiaon Public Methods fendreqian reqion ctor public output SAFE CLASS NAME i iad ff TODO Add constructor logic here Ad Fendreqian Abbildung 54 Visual Studio Class Template Speichern und fertig Ab sofort wird jede neue Klasse entsprechend dieses Templates erstellt An dieser Stelle k nnen nat rlich auch weitere Informationen Ersteller etc angegeben werden 177 NET BlogBook Ausgabe 4 3 6 Visual Studio 2005 Einfaches Einbinden von Namespaces Wer sich schon immer daruber geargert hat dass Namespaces nicht automatisch eingebunden werden konnen a la Eclipse dem sei die Tastenkombination lt ALT gt lt SHIFT gt lt F10 gt nahegelegt Beispielsweise einfach mal Hashtable ins Codefenster schreiben den Cursor gleich danach positionieren also keine Leerzeichen eingeben und die Tastenkombination ausf hren Schon kann man sich den richtigen Namespace aussuchen Nettes Feature 3 7 Visual Studio 2005 Taskbar einblenden Wem eine Taskbar hnlich dem lt ALT gt lt TAB gt f r Visual Studio 2005 abgeht dem kann geholfen werden Einfach mal die nachfolgende Tastenkombination a
288. tHandlerExecute new EventHandlerieontext PrebegusstHantlerkxeeute i Der Event PreRequestHandlerExecute wird aufgerufen bevor ein Http Handler mit der Arbeit beginnt also auch der Http Handler der fur die Verarbeitung der eigentlichen Seite verantwortlich ist Im Handler selbst wird versucht eine Instanz der Klasse System Web UI Page auszulesen Dies schlagt unter Umstanden fehl da ein Http Module nicht nur beim Aufruf einer ASPX Seite aufgerufen wird vole context PrekequesthandlerExecute ob ect sender EventArgs e System Web UI Page page HttpContext Current Handler as System Web UI Page if page null page FreIlnit ner Even handler Page Preinic Anschlie end kann ein weiterer Handler f r den PreInit Event registriert werden Innerhalb dieses Handlers kann nun das Theme gesetzt werden void page Preln t objeet sender EventArgs amp HECPLCONTCESt CONLCEKC HEIBL ORTE ZGurrenG System Web UI Page page System Web UI Page context Handler if context Session SelectedTheme null page Theme context Session SelectedTheme ToString Wie man sehen kann wird der Name des ausgew hlten Themes aus dem Session Objekt ausgelesen Um Zugriff auf dieses Objekt zu erhalten muss ein weiteres Interface mit dem Namen IReadOnlySessionState implementiert werden Dieses erlaubt einen lesenden Zugriff auf den Session Zustand w hrend das Interface TReguiresSessionState auch den schreibenden Zugrif
289. te eine Basis fur simple Strategie Spiele vorhanden sein Hier noch das Demoprojekt inklusive Sourcecode MatrixTestGame 2 3 8 fransparente Steuerelemente mit C Eigentlich ein alter Hut aber ad hoc ist es mir heute auch nicht eingefallen wie eigene Steuerelemente transparent erstellt werden konnen Der erste Versuch mit this Background Color Transparent scheiterte klaglich Hier ein L sungsweg protected override CreateParams CreateParams get CreateParams cp base CreateParams cp ExStyle 0x20 recurn cp protected override void OnPaintBackground PaintEventArgs pevent do nothing in this case protected override void OnMove EventArgs e RecreateHandle 2 3 9 Controls auf einem Formular bewegen In Foren als auch meiner Inbox taucht immer wieder die Frage auf wie man denn bewegbare Controls erstellen kann um beispielsweise ein Diagramm zu zeichnen etc Deshalb m chte ich hier ein ganz kleines Beispiel zeigen wie in zwei Minuten eine bewegliche Basisklasse f r bewegliche Controls erstellt werden kann Und hier kommt schon der Sourcecode using System using System Collections Generic using System ComponentModel using System Drawing NET BlogBook Ausgabe 4 using System Data using System Text using System Windows Forms namespace MoveableControlDemo public partial class MoveableBaseControl UserControl private bool 1sMoying false Private int
290. ten Das Problem welches dieser L sung voraus geht sollte vielen Visual Studio Nutzer NET BlogBook Ausgabe 4 bekannt vorkommen Man schreibt Quellcode und plotzlich wird eine wichtige Stelle durch das Intellisense verdeckt Allerdings benotigt der Entwickler genau diesen Teil oder Ausschnitt um die begonnene Zeile zu Ende zu schreiben class Program static void Hain string args Console wri SetwindowPosition Hie SetWindowsSize Kom Title Hen TreatControlCAsInput nr SA WindowHeight S windowLeft SA windowTop SA windowwidth Write MORELOS Lorene System IO ID hteli System Argum System Forma Nach dem Drucken der Strg Taste wird das Intellisense transparent gemacht und der versteckte Quellcode kommt zum Vorschein class Program static void Hain string args Console Wri Hier stehen t Kommentare oder jede Menge Quellcode ai Obwohl Visual Studio viele solcher kleinen Helferlein besitzt wissen die wenigsten Entwickler davon Es lohnt sich also sich auch mal mit der Entwicklungsumgebung selbst und nicht nur mit der Programmiersprache oder Technologie auseinanderzusetzen 3 23 Silverlight 1 0 JavaScript IntelliSense Visual Studio 2008 wird mit IntelliSense f r JavaScript ausgeliefert Damit das IntelliSense fur Silverlight 1 0 Objekte und Methoden funktioniert hat Justin Josef Angel eine Hilfsbibliothek geschrieben und das Ganze auf CodePlex ver
291. ten2 Daten3 und Daten4 267 NET BlogBook Ausgabe 4 Fenster 2 Fale HER ga amp Bl Spaltenname Datentyp A BEI varchar 50 y a Daten varchar 50 hy is Dateng varchar 50 T ME Daten4 varchar 50 T Spalten Beschreibung Skandardwert Abbildung 88 Bulk Inserts 1 E Daten csv Editor Datei Bearbeiten Format Ansicht F Datenl Daten Datens Dateng batenl_L Daten2_1 Datens_L Dateng 1l bDatenl_2 Datenz_ Datens_ 2 Datengd_s Datenl_ s3 Datenz_ 3 Datens_s Dateng_s Datenl_4 Datens_4 Datens_4 Datend_4 batenl_5 bDaten _5 Datens_5 Datend4_5 bDatenl_6 Daten _5 Datens_65 Datend _5 bDatenlL_7 Daten _ Datens_ bDatend_7 bDatenl_s bDaten _s Datens_6 Datend_s bDatenl_ Daten _9 Datens_9 Datend _9 batenl_10 Daten _10 Datens_10 Datend 10 Datenl_11 Daten2_11 Datens_11 Datend_1 iw Zeile 1 Spalte 1 Abbildung 89 Bulk Inserts 2 Wichtig f r die BULK INSERT Anweisung ist nun das Trennzeichen der einzelnen Daten und Zeilen so wie die Zeilennummer der ersten Daten Die Daten der CSV Datei werden blicherweise durch ein Semikolon und die Zeilen durch einen Umbruch getrennt In der ersten Zeile sind die Spalten berschriften angegeben Die BULK INSERT Anweisung sieht dann wie folgt aus BULK INSERT lt Tabelle gt FROM lt CSV Datei gt WITH FIELDTERMINATOR ROWTERMINATOR r n TABLOCK FIRSTROW 2 Nat rlich muss noch die Zieltabelle und der Pfad zu
292. tere Moglichkeiten um eventuell eigene Eintrage anzuhangen etc Einfach ein wenig ausprobieren 2 3 6 C Beginner UserControl DoubleTrackBar Beispiel Deisem Eintrag liegt ein Beispiel bei welches zeigt wie ein einfaches DoubleTrackBar Control erstellt werden kann Mit Hilfe dieses Controls k nnen mit zwei Schiebereglern ein Minimum Wert und ein Maximum Wert eingestellt werden Eigentlich ein recht simples Problem jedoch nicht f r C Programmierer die in Themen wie GDI UserControls wenig Erfahrung haben Der folgende Screenshot zeigt das Aussehen des UserControls in einer kleinen Testanwendung DoubleTrackBar Test 0 100 Min Value 0 Mas Value 100 Guit Abbildung 11 Double Trackbar Zus tzliche Funktionalit ten sollten sich recht einfach einf gen lassen Anforderungen NET 2 0 f r die Solution Sourcecode auch unter NET 1 1 nutzbar Download 2 3 7 C Beginner Beispiel f r den Aufbau eines Strategie Spieles In diversen Foren wird oft nachgefragt wie denn man denn ein Strategiespiel angehen k nnte Im Vordergrund stehen dabei keine Probleme a la Pathfinding sondern bereits das Aufbauen des Spielfeldes bereitet oft Probleme Daher habe ich aus Lust und Laune eine kleine Demo erstellt aus der man diverse Ans tze herauslesen kann NET BlogBook Ausgabe 4 Das Aussehen der Demo hatte hierbei keinen Vorrang und kommt daher mit folgender Oberflache daher ini x Generate Matris Anzsh Felder
293. ters 1 EncoderParameter encparam new EncoderParameter encoder long EncoderValue TransformRotate270 encparams Param 0 encparam 1 Save filename jpg usedIC encparams 1 Dispose i null GC Collect 2 2 26 Die grafische L nge eines Strings mit C bestimmen In manchen F llen bei der Erstellung von UserControls oder der Verwendung von GDI ist es notwendig die grafische L nge eines Strings zu kennen also nicht nur die Anzahl der Zeichen Nachfolgender Code zeigt wie dies bewerkstelligt werden kann string test This is a test Font font new Font Arial 10 0F NET BlogBook Ausgabe 4 Graphics g this CreateGraphics SizeF sizeInfo g MeasureString test font this ist in diesem Fall eine Form kann jedoch genauso gut eine PictureBox etc sein 2 2 27 Strong named assembly trotz Referenz auf eine ActiveX Komponente Will man eine Assembly per Strong Name signieren und halt diese Assembly eine Referenz auf eine ActiveX Komponente beispielsweise AxInterop SHDocVw dann kommt es zu folgendem Fehler Assembly generation failed Referenced assembly AxiInterop SHDocVw does not have a strong name Dieser Fehler ist jedoch recht einfach zu umgehen Durchzuf hrende Schritte Hierzu ben tigen wir den Pfad zur urspr nglichen ActiveX Komponente hier namentlich als MyActiveX dll gef hrt Der Pfad kann mittels der bereits vorhandenen Referenz Eigenschaften ermittelt werden Di
294. tices EnterpriseLibrary Logging Soll nun ein Eintrag mitgeschrieben werden erfolgt dies durch den einfachen Aufruf Logger Write test Durch die M glichkeit unterschiedliche TraceListener einzusetzen m ssen die Informationen nicht zwangsweise in die Ereignisanzeige geschrieben werden Auch Datenbanken und andere Ziele sind m glich Zus tzlich k nnen viele weitere Einstellungen konfiguriert werden Download Link Enterprise Library 3 0 January 2007 CTP PS Man beachte dass die Enterprise Library zahlreiche weitere Application Blocks inkludiert und somit f r jeden Entwickler von Bedeutung sind Ein Blick darauf lohnt sich also 224 NET BlogBook Ausgabe 4 5 1 Tools DotLucene Fulltext Search Engine for NET Wer fur diverse Anwendungsfalle eine kosteng nstige und vor allem schnell Volltextsuche ben tigt der sollte sich auf jeden Fall DotLucene genauer ansehen Hinter diesem Open Source Projekt verbirgt sich eine vielversprechende L sung f r dieses Thema Ein kurzer Auszug aus der Featureliste Gute Performance Ranking Hervorhebung der Suchbegriffe in den Ergebnissen Suche nach Metadaten Speicherung von vollindizierten Dokumenten Durch die Benutzung der Online Demo kann man sich von der Geschwindigkeit und von einigen Features berzeugen Im gleichen Atemzug kann man sich auch den auf der Seite von DotLucene vorgeschlagenen Indexing Server Seek a File ansehen Der Server l uft als Wind
295. tity bezogen werden Danach musste ein weiteres SELECT Statement abgesetzt werden um den Datensatz zu erhalten Durch die OUTPUT Klausel ist dies nicht mehr notwendig Die Ergebnisse werden sofort zur ckgeliefert sofern gew nscht Beispiel USE AdventureWorks GO DELETE tUser OUTPUT deleted WHERE ID 7 GO Dieses Beispiel loscht den Datensatz mit der ID 7 aus der Tabelle User und gibt den gesamten Datensatz zur ck Es k nnen jedoch auch nur einzelne Felder zur ckgeliefert werden USE AdventureWorks GO DELETE tUser OUTPUT deleted ID deleted Firstname deleted Lastname WHERE ID 7 GO Hier w rden nur die ID der Vorname und der Nachname als ResultSet zur ckgegeben werden Wie kann dies unter dem NET Framework benutzt werden Es verh lt sich sehr einfach Die einzelnen Statements werden mit einem Command Objekt beispielsweise SqlCommand abgesetzt Im Falle von INSERT UPDATE bzw DELETE Abfragen wird dazu die Methode ExecuteNonQuery verwendet Wird nun die OUTPUT Klausel verwendet ist anstatt der Methode ExecuteNonQuery beispielsweise die Methode ExecuteReader zu verwenden Mit dem zur ckgegebenen DataReader kann durch die einzelnen Datens tze iteriert werden NET BlogBook Ausgabe 4 Referenzen 1 MSDN 7 3 Objekte und relationale Daten in einer Datenbank Prinzipiell gibt es den Ansatz der ORDBMS Objektrelationale Datenbank Management Systeme Dabei wird ein relationales System um objek
296. tloc 3 IL_ 8829 bir s IL_ tse IL B82b nop IL_ 8 2c Ildloc 3 IL 802d Ildstr To IL 9837 callvirt instance object System Data System Data Common DbDataReader get_Item string IL 8637 call void mscorlib ysten Console WriteLine object IL_ O83c nop IL 8830 nop IL_B03e Ildloc 3 IL 883F callvirt instance bool Systen bata JSysten Data Common Dbbata eader Readi IL_ 0044 stloc s C3355 0008 IL 8646 Idloc s 655450080 IL 80482 brtrue s IL_ 02b IL 864a 1dloc 3 IL 864b callvirt instance void Systen Data 3ysten Data Common DbDataReader Closei IL 8850 nop IL_ 88571 nop IL 88527 leave s IL_ 8666 ff end try Finally IL 8655 1dloc i IL_ 8855 ldnull IL 88546 ceq IL_B058 stloc s cs a aona IL 805a Idloc s 635450006 IL_Bd5c brtrue s IL_0965 IL 85e 1dloc 1 IL O85F callvirt instance void ascorlib System Disposable Disposet IL 88645 nop IL _ 0055 endfinally ff end handler ES Abbildung 4 Ressourcen schonen IL Code j Wichtig ist die Zeile iL U0StiCalivirt Instance vold mseorl blSysten IDisposabler Disp sef Dieser Befehl gibt die Anweisung dass alle offenen Ressourcen geschlossen werden sollen Mit Hilfe dieser kleinen Anderung am Code kann man nun davon ausgehen dass die Verbindung zur Datenbank immer geschlossen wird Au erdem f ngt man weitere m gliche Fehler schon beim kompilieren ab PDF Version 2 2 50 Download einer Datei via HTTP Die Klasse WebClien
297. torientierte F higkeiten erweitert Oft wird auch nur ein objektorientierte Zugriffsschicht dar berlegt In der Tat werden allerdings keine Objekte mit relationalen Daten vermischt Wie w rde das Speichern von Objekten zusammen mit relationalen Daten in einer Datenbank in der Praxis aussehen Prinzipiell stehe ich dem Vermischen von Objekten mit relationalen Daten eher negativ gegen ber Der Ansatz von XML Feldern in einer Datenbank siehe SQL Server 2005 ist durchaus praktisch und in manchen F llen auch sinnvoll Dies jedoch zu nutzen um Objekte abzulegen macht eher weniger Sinn Aus folgenden Gr nden wenn ich von Serialisierung spreche beziehe ich mich auf die XML Serialisierung e Aufwand der Serialisierung Bedingt durch diesen Aufwand k nnen die Daten ohnehin eder in eine relationale Struktur gequetscht werden Performancem ssig wird es hier allerdings hab ich das jetzt nicht getestet nicht sehr viel Unterschied geben e Neiters verleitet dieser Ansatz dazu eine Tabelle mit mehreren XML Feldern zu erstellen und darin serialisierte Objekte abzulegen Eventuell noch von unterschiedlichen Typen Sp testens dieser Punkt w rde durchaus Probleme aufwerfen e Durch das einfache serialisierte Ablegen w rden in der Datenbank Referenzen nicht mehr ersichtlich sein In einem reinen relationalen oder reinen objektorientierten System bleibt dieser Vorteil erhalten Referenzen in XML sind zwar m glich aber selbst bei einem eigen
298. tring nane String pt private int score 0 public string Name get return this name set 1 This name value public int Score g t return this score Ser this BESTE value public Highscore string name int score this name name Chis Score score Public override string Tostring return this mame PadRicht 20 this score region IComparable Members public int CompareTo Highscore other LE Chig Score CompareTo other score return this name CompareTo other name else return this score CompareTs scher score 1 endregion YH Wie in der Methode CompareTo zu sehen ist ist eine signifikante Eigenschaft auszuw hlen Diese ist die Eigenschaft die vorrangig sortiert werden soll In unserem Fall der Score Sind die zu vergleichenden Werte identisch wird der Name sortiert Getestet werden kann dies mit Hilfe der folgenden Zeilen using System using System Collections Generic using System Text using System Collections using System Diagnostics namespace HighscoreTest class Program static void Main string args List highscoreList new List NET BlogBook Ausgabe 4 highscoreList Add new Highscore highscoreList Add new Highscore highscoreList Add new Highscore highscoreList Add new Highscore Norbert2 17 Norberti 17193 Norbert3 3 karl 3 33 hig
299. tzlichen Anmerkungen gibt es neue Beispiele und weitere Code Snippets Die Dokumentation wird zum Download angeboten oder kann direkt online gelesen werden Au erdem gibt es zwei neue Videos der Serie How Do 1 with ASP NET AJAX NET BlogBook Ausgabe 4 dave dave jones david smith Abbildung 34 Ajax Auto Complete 32 How Do Use the ASP NET AJAX AutoComplete Control Abbildung 35 Ajax Progress 33 How Do Use the ASP NET AJAX UpdateProgress Control 2 4 45 A potentially dangerous Request Form value was detected Tritt die oben genannte Fehlermeldung auf k nnen gerade ASP NET Einsteiger im ersten Moment nicht viel mit damit anfangen Aber auch erfahrene Entwickler wahlen haufig den einfachen und schnellen Weg dieser Fehlermeldung oder besser diesen Sicherheitsmechanismus zu umgehen ASP NET berpr ft Usereingaben die per PostBack POST oder per Parameter im Link GET bermittelt werden Werden in diesen Daten potentiell gef hrliche Inhalte entdeckt wird dies in Form eines Fehlers gemeldet Zu den potentiell gef hrlichen Inhalten geh ren z B JavaScripts mit denen man Cross Site Scripting Angriffe_ durchf hren k nnte Ausprobiert werden kann dies mit einer einfachen Textbox und der anschlie enden Ausgabe des eingegebenen Inhaltes wo Untitled Page lt script Language JavaScript gt alert XSS lt Seript gt _ PostBack _ Eingabe Abbildung 36 G
300. tzt ist Trifft die Bedingung zu ist es nicht gesetzt andernfalls schon Fazit Dies sollte einen kurzen Einblick in die Welt der Enumeratoren und Flags bieten Flags bieten in vielen F llen eine einfache L sung f r Mehrfach Auswahlen und k nnen auch entsprechend in UserControls abgebildet werden um dem User eine vereinfachte Darstellung zu bieten NET BlogBook Ausgabe 4 2 2 33 System IO Compression Hilfreich oder doch ein Scherz Unter dem NET Framework 2 0 gibt es ja den System IO Compression Namespace Dieser beinh lt Klassen um Dateien zu zippen Vorgangsweise sieht so aus dass Daten in einen Stream geschrieben werden beispielsweise einem GZipStream Dieser zippt danach die Daten welche in weiterer Folge in einer Zip Datei abgelegt werden k nnen Dies funktioniert wenn man eine einzelne Datei zippen m chte Was ist will ein gesamtes Verzeichnis gepackt werden In diesem Fall muss der Software Entwickler seinen eigenen Container entwickeln oder auf vorhandene Bibliotheken von Fremdherstellern zur ckgreifen Bei der Entwicklung eines eigenen Containers kann zwar ein eigenes System entworfen werden welches auf die Anforderungen zugeschnitten ist jedoch geht die Kompatibilit t zu bestehenden Zip Anwendungen verloren Weiterf hrende Informationen k nnen unter folgendem Link bezogen werden NET System IO Compression and zip files 2 2 34 C Beginner Exception Handling unter C Das Thema Exception Behandlun
301. ualit t Diese Frage ist wohl die essentiellste aller Fragen aus dem Qualitatsmanagement Doch was ist wirklich Qualit t Kann Qualit t gemessen werden oder handelt es sich dabei nur um eine subjektive Sichtweise Einige meinen hier vermutlich dass Qualit t auf jeden Fall gemessen werden kann Man nehme die Anzahl der Funktionen und setze sie in Verh ltnis dazu wieviele tats chlich ordnungsgem ihren Dienst verrichten Andere m gen dieser Aussage widersprechen Qualit t bedeutet nicht dass etwas so funktioniert wie es definiert wurde sondern so wie es sich der Anwender w nscht kommt hier etwa das Thema Usability ins Spiel Zus tzlich zur angebotenen Funktionalit t z hlen auch Support zus tzliche Dienstleistungen und vieles mehr zur Qualit t Nun kommt die dritte Gruppe und erz hlt dass der Begriff der Qualit t aus dem Altertum bekannt ist Weiters wird im Lateinischen der Begriff qualitatis mit der Beschaffenheit vermutlich eines Gegenstandes bersetzt Weiters wird Qualit t nicht nur durch Technik definiert sondern auch durch eine geistige Haltung So gesehen kann dies in einer Formel abgebildet werden Qualit t Technik Geisteshaltung Kamiske Durch einen vermehrten Einsatz von Technik kann die Qualit t verbessert werden Produkte werden nach demselben Ablauf produziert manuelle Eingriffe sind oft nicht mehr notwendig und dadurch auftretende Fehler k nnen ausgeschlossen werden Ein m glicher Di
302. uch direkt auf Server hochladen die sich beim freigegebenen Hostinganbieter befinden sofern diese Funktionalit t vom Hostingdienstanbieter unterst tzt wird Der SQL Server Database Publishing Wizard kann optional auch direkt in Visual Studio 2005 und oder Visual Web Developer 2005 integriert werden Nach erfolgter Integration k nnen Datenbanken aus der Entwicklungsumgebung heraus auf einfache Weise ver ffentlicht werden Und hier die Screenshots des Tools als auch die ersten Ergebnisse E Datenbankverottentlichungs Assistent Willkommen Mit dem Datenbankver ffentlichungs Assistenten k nnen Sie Skripts f r Datenbanken und Objekte innerhalb von Datenbanken erstellen Dieser Assistent f hrt Sie schrittweise durch den Vorgang zum Generieren eines Skripte Do not show this starting page again Abbildung 76 Database Publishing Wizard 1 241 NET BlogBook Ausgabe 4 E Datenbankverottentlichungs Assistent Quellserver ausw hlen Wahlen Sie den Server aus der die zu ver ffentlichende Datenbank enth lt Serverinformationen angeben Server ocal SQLExpress Authentifizierung Windows Authentifizierung verwenden SQL Server Authentifizierung verwenden PO Po Verbindungszeichenfolge bereitstellen Abbildung 77 Database Publishing Wizard 2 E Datenbankverottentlichungs Assistent Datenbank auswahlen Wahlen Sie die zu ver ffentlichende Datenbank aus Datenbank auswahlen temp
303. und weitere Informationen 5 20 Source Code Line Counter In einem fr heren Beitrag habe ich bereits ein Visual Studio Add In vorgestellt welches die Anzahl der geschriebenen Code Zeilen auswertet Das Programm Source Code Line Counter kommt jedoch nicht als Add In sondern als selbstst ndiges Programm daher Daf r sind die Auswertungen nicht so umfangreich aber dennoch brauchbar S Source code line counter 3 oj x Central Software News Ticker Select folder I Include all subfolders File filter ecs C Central Software News Ticker Skyhew AssemblyInfo cs 58 CiyCentral Software Wews Ticker Skyview RissChannel cs 200 CCentral Software WewsTicker SkyNew SkyMewsTicker cs 11 Central Software MewsTicker Skyview WebFeeder cs 24 c central SoftwarelNewsTicker NewsTic AssemblvInfo cs 58 Ciicentral SoftwarelNewsTickeriblewsTic Forml cs 116 Add Clear all Total 11759 lines 11087 lines gt Central Software ssueTracker 672 lines gt C iCentral Software NewsTicker Total lines counted 672 lines Grouping vos Abbildung 83 Source code line counter Neben mehreren Option wie Include all subfolders Include blank lines oder Include auto generated code gibt es die Moglichkeit Uber den Befehl Grouping zwei unterschiedliche Projekte zusammenzuf hren und somit ein totales Ergebnis zu erhalten Das Programm selbst ist kostenlos und kann bei Bedarf erweitert werden da der Quellcode ebenfalls verf gbar
304. unden schneller 3 14 Visual Studio 2005 Toolbox fur Windows CardSpace Christian Arnold hat eine Visual Studio 2005 Toolbox speziell f r die Arbeit mit Windows CardSpace geschrieben Mit Hilfe dieser zwei neuen Controls mit dem Namen CardSpaceLogin und CreateCardSpaceUserWizard ist es auf einfache Weise m glich Windows CardSpace in eigenen ASP NET Anwendungen zu benutzen i i ala ee n uae of Darm O E i Standard I E Data Validation Navigation E Login k Pointer Login LoginView rH PasswordRecowery LoginStatus iy LoginName Aa CreateUserWizard ae ChangePassword CreateCardSpaceUserWizard CardSpaceLogin a101dx3 iaag 5 xogjoo_ A NET BlogBook Ausgabe 4 Mehr Informationen eine Installationsanleitung und naturlich den Download gibt es hier 3 15 Neue Visual Studio 2005 Code Snippets fur Office 2007 Microsoft hat neue Visual Studio Code Snippets veroffentlicht Diese Snippets sind speziell fur Projekte in Verbindung mit Office 2007 und sind in C und VB NET verfugbar Mehr Informationen und naturlich den Download gibt es hier 3 16 Visual Studio 2008 Bessere Performance Gerade das Thema Performance war punkto Visual Studio immer ein Spezialfall Sobald Solutions wachsen wird auch die Entwicklungsumgebung immer langsamer Zeit also hier einige Verbe
305. ung in die isolierte Speicherung Szenarien f r die isolierte Speicherung 2 2 60 Prozess Output via C anzeigen Hin und wieder kommt es dann doch einmal vor dass via NET andere Prozesse aufgerufen werden und deren Output auf die Standard Ausgabe eingelesen werden soll Dazu gibt es mehrere M glichkeiten Die erste Variante liest alle Daten aus der Standard Ausgabe ein wenn der Prozess fertig abgelaufen ist ProcessStartInfo psi new ProcessStartiInfo MyPathMyApp exe psi RedirectStandardOutput true psi UseShellExecute false Process p new Process p StartInfo psi Dectartt StreamReader sr p StandardOutput p WaitForExit string output sr ReadToEnd Ssr Ll sei Debug WriteLine output Manchmal dauert der Prozess selbst l nger und es ist wichtig die Daten dann zu bekommen wenn diese auf der Standard Ausgabe geschrieben werden Hierzu kann seit NET 2 0 mit dem Event OutputDataReceived gearbeitet werden Das sieht so aus private void StartProcess ProcessStartInfo psi new ProcessStartiInfo MyPathMyApp exe psi RedirectStandardOutput true psi UseShellExecute false Process p new Process p OutputDataReceived new DataRecelivedkventHandler p OutputDataReceived p StartInfo psi B st artt p BeginOutputReadline D Wa ltF rEziel NET BlogBook Ausgabe 4 vold p CutputDataReceived object sender DatakeceivedEventArgs amp Debug WriteLine
306. unkte aus meiner Sicht um diese Frage zu beantworten Aus meiner Erfahrung sollte Object Mapping dann verwendet werden wenn untenstehende Fragen mit Ja beantwortet werden k nnen e Gibt es jede Menge Data Objects welche auf ebensolche Tabellen gemappt werden sollen und stammen diese auch alle von der gleichen Basis Klasse ab e K nnte der Fall eintreten dass das zugrunde liegende Datenbank Management System DBMS ausgetauscht wird Sollte das Projekt generell unterschiedliche DBMSs unterst tzen e Sind f r die Entwicklung der L sung mehr als 15 Manntage notwendig e Soll die L sung von vielen unterschiedlichen Usern eingesetzt werden Open Source Projekt kostenlose Webanwendung K nnen alle Fragen mit einem klaren Ja beantwortet werden w rde ich pers nlich zu einem Object Mapping beispielsweise NHibernate 1 raten In anderen F llen w rde ich dann doch eher ein simples DataBinding vorziehen Aber Achtung Immer gr ndlich die Zukunft im Auge behalten und nicht nur von der NET BlogBook Ausgabe 4 Jetzt Situation ausgehen Dinge k nnen sich ndern Wurde einmal eine Entscheidung getroffen kann diese meist nur mehr sehr schwer ge ndert werden Bei Anregungen oder einfach Dingen die ich nicht bedacht habe bitte ich einen Kommentar zu hinterlassen 1 NHibernate 2 2 31 WebRequest und SSL Zertifikate muss man via NET auf Webseiten zugreifen die per SSL gesichert sind kommt es hin und wieder zu Pro
307. usehen sowie auch die vorhandenen Beispiele zu den einzelnen Methoden durch zuarbeiten Danach sollte dieses Thema kein Problem mehr darstellen 1 http www connectionstrings com 2 http msdn2 microsoft com oder http msdn microsoft com NET BlogBook Ausgabe 4 7 8 00DBMS Object Oriented DataBase Management Systems Objektorientierte Datenbanken sind schon sehr nett aber leider auch nicht f r alles einsetzbar Das sch ne daran ist dass die Objekte an sich gespeichert werden nicht ein relationales Mapping davon Dies bedeutet dass das Abbilden von relationalen Daten auf das urspr ngliche Objekt nicht mehr notwendig ist Allerdings sehe ich hier doch noch einige Probleme die nicht unausgesprochen bleiben sollten 1 Fehlende Standards Einheitliche Standards zu ORDBMS bzw OODBMS gibt es nicht auch wenn es diese Systeme nicht erst seit gestern gibt Dadurch ist es nicht gew hrleistet dass alle Systeme auf gleiche Art und Weise arbeiten Object oriented SQL OSQL ist ansich recht nett aber auch hier gibts die gleichen Fehler wie beim herk mmlichen SQL gt Jeder implementiert eine eigene Variante 2 Backup Restore Verteilung etc Objekte sind wesentlich komplexer als relationale Strukturen Entsprechend komplexer wird dadurch auch ein Backup ein Restore eine Verteilung oder berhaupt nur die Aktualisierung der Daten das Nachziehen von Referenzen usw Diese Dinge sind mit hohem Aufwand verbunden daher is
308. usgeben zu lassen Mein Vorschlag w re an dieser Stelle eine eigens abgeleitete List lt string gt Dies w rde so aussehen NET BlogBook Ausgabe 4 public class NameCounterList List lt string gt private Dictionary lt string 126 _names new Dictionary lt string int gt public new void Add string item base Add item if nahes C ontalnskeytiten ToL wert _names item ToLower else _names Add item ToLower 1 public new void Clear base Clear hanes Clear public override string ToString StringBuilder sb new StringBuilder Lf this names Count gt 0 Dictionary lt string int gt Enumerator en this Names GCetenumerstor while en MoveNext sb Append sb Append sb Append sb Append en Current Key Ma v3 en Current Value Toscrring System Environment NewLine recorn 2b Tostring YH Die Aufrufe k nnen dann wie folgt aussehen NameCounterList ncl new NameCounterList ncl Add Peter ncl Addi Barry ncl Add Sabine ncl Add Sabine nel Add Jorg nel Add Barry nel Adad Harry Console WriteLine ncl ToString Wodurch sich folgender Output ergibt peter 1 harry 3 sabine 2 Tord l Anmerkungen An dieser Stelle k nnen nat rlich noch Verbesserungen vorgenommen werden Beispielsweise w re es denkbar die Werte zu sortieren Auf der anderen Seite muss jedoch auch
309. usprobieren lt ALT gt lt SHIFT gt lt F7 gt 3 8 Visual Studio und Build Events Oft m ssen beim Erstellen eines Releases etc Daten nachtr glich in die Ausgabe Ordner kopiert werden Dies geht nat rlich auch einfacher automatisiert Dazu einfach die Projekteigenschaften ffnen Men punkt Project Projectname Properties Im darauf erscheinenden Fenster unter Common Properties Build Events mit einem der beiden folgenden Einstellungen arbeiten e Pre build Event Command Line e Post build Event Command Line Wie der Name schon sagt wird ersteres vor dem Build ausgef hrt und zweiteres danach Darin k nnen nun die gew nschten Aktionen gesetzt werden Beispielsweise das Kopieren von ben tigten Dateien die nicht ins Projekt eingebunden wurden etc Einfach einmal auf den Erweiterungsbutton der mit den 3 Punkten klicken und im neuen Fenster auf Macros gt gt Darunter finden sich Eigenschaften die des fteren ben tigt werden Aufgerufen werden diese Eigenschaften mit Eigenschaftsname Im schlimmsten Falle einfach den Help Button bet tigen 178 NET BlogBook Ausgabe 4 3 9 Webprojekte mittels Firefox debuggen Anstelle des Firefox k nnen auch Opera etc verwendet werden Um den Browser umzustellen sind folgende Schritte notwendig In der ge ffneten Web Solution ein Webfile beispielsweise eine apsx w hlen Danach im Men folgenden Eintrag w hlen File Browse with Edt Yiew Projec
310. ute auf einem weiteren sehr n tzlichen Shortcut im Visual Studio gesto en Mit Hilfe der Tastenkombination Cir siehe Abbildung ist es m glich direkt zur korrespondierenden Klammer zu springen Befindet sich der Cursor z B bei der schlie enden Klammer einer Methode springt er direkt zur ffnenden und somit zum Anfang der Methode Abbildung 59 Korrespondierende Klammer Weitere n tzliche Shortcuts findet man unter folgenden URLs http www codinghorror com Weblog archives 000315 html http www codeproject com tips VSnetIDE TipsAndTricks as http safari oreilly com 0596003609 mastvsnet APP C http Weblogs dotnet braunschweig de Karim PermaLink guid 2b2b0 7 74 feba 4c88 9421 8cd44c4d ed5 aspx 3 13 Visual Studio 2005 schneller starten NET BlogBook Ausgabe 4 Heute bin ich zufallig Uber einen Eintrag von Peter Bucher gestolpert und diesen Tipp mochte ich naturlich meinen Lesern auch nicht vorenthalten Eigenschaften von Microsoft Visual Studio 2005 Allgemein Verkn pfung Kompatibilit t Sicherheit P Microsoft Visual Studio 2005 fielyp Anwendung Zielort IDE Ziel lio Common E devenv exe nosplash Abbildung 60 Visual Studio schneller starten In der Verkn pfung von Visual Studio 2005 einfach ein nosplash anf gen und schon startet Visual Studio 2005 um ein paar Sek
311. vante Codepassagen in meiner Anwendung Oder befinden sich sogar potentielle Sicherheitsl cher im Programm Wer bereits mit FxCop gearbeitet hat kennt auch die entsprechende Visual Studio 2005 Funktionalit t FxCop wurde integriert und steht somit allen Nutzern zur Verf gung Dazu gibt es den Tab Code Analysis in den Projekteigenschaften Dort k nnen ebenfalls auch die einzusetzenden Regeln ausgew hlt werden Auch die Aktivierung der Code Analyse kann in diesem Fenster eingestellt werden Die Ergebnisse einer Analyse werden im Error Output angezeigt Generell empfiehlt es sich Code Analysis zu verwenden um potentielle Sicherheitsprobleme und weitere kritische Stellen zu finden Allerdings sollten die Warnings an das jeweilige Anwendungsdesign angepasst werden da nicht alle angewandt werden k nnen 4 2 2 Code Analysis als Hilfsmittel In meinem Beitrag Eigenen Code analysieren hatte ich bereits ber Code Analysis berichtet An dieser Stelle m chte ich diesen wichtigen Part noch einmal in Erinnerung rufen Visual Studio besitzt bereits eine integrierte Code Analyse und jede Menge Regeln die beim Aufruf der Code Analysis aufgerufen werden Von vielen als st rend abgetan besitzt die regelm ige Analyse jedoch durchaus seine Berechtigung Die Einstellungen zur Analyse k nnen in den Projekteigenschaften vorgenommen werden NET BlogBook Ausgabe 4 Application Configuration Active Debug Ir Platform Active Any
312. vom Entwickler der Komponente selbst geschrieben White Box Test 2 Der Test wird ohne Kenntnis der Komponente da diese ja noch nicht entwickelt ist erstellt Black Box Test Der Vorteil dieser Variante liegt darin dass nicht um Fehler herumgetestet wird Das hei t die Tests werden nicht der Komponente angepasst sondern die Komponente muss so funktionieren wie dies im Test festgelegt wurde Bei dieser Art der Tests empfiehlt es sich jedoch eine hohe Disziplin an den Tag zu legen und zus tzliche Arbeitsweisen aus der agilen Softwareentwicklung zu nutzen Zus tzlich sollte nicht auf Black Box Tests verzichtet werden 1 White Box Tests NET BlogBook Ausgabe 4 2 Black Box Tests 4 3 4 Grundlagen White Box Tests Bei den White Box Tests wird im Gegensatz zu den Black Box Tests die Implementierung einer Komponente getestet Dies bedeutet dass vor dem Entwickeln des Tests ein Blick auf den Sourcecode durchaus erlaubt ist Ziel der White Box Tests ist es dass bez glich des Sourcecodes bestimmte Hinl nglichkeitskriterien erf llt werden Eine komplette Fehlerfreiheit kann durch diese Tests nicht sichergestellt werden Eine Kombination mit anderen Test Methoden ist anzuraten Weitere Methoden der Softwaretests e Black Box Tests e Grey Box Tests 4 3 5 Grundlagen Black Box Tests Die Black Box Tests geh ren den allgemeinen Softwaretests an und stellen eine Methode dar Tests f r Komponenten zu entwickeln die no
313. von ausgeht dass die Engp sse in der Reflection bei quasi rekursiven Durchl ufen erst so richtig entstehen dann sollte mein Testfall nicht sehr gravierend ausfallen Hier jedoch das Testergebnis auf meinem Rechner Standard Reflection Reflection with Cache Time Irst 1828 125 Time Irst 15 625 Abbildung 2 Reflection Speed Test Was genau bedeutet dies Nun im ersten Durchlauf wird der nachfolgende Code aufgerufen for int 1 De 2 lt 2200002 IH Assembly a Assembly GetExecutingAssembly if a null Type t a GetType ReflectionSpeedTest Person FieldInfo fis t GetFields foreach FieldInfo fi in fis Console WriteLine fi Name Im Vergleich dazu werden die Feld Informationen in der zweiten Variante gecached Das hat zwar den Nachteil dass der Speicherverbrauch ansteigt jedoch die Geschwindigkeit um ein Vielfaches erh ht wird und das bei dieser wirklich sehr einfachen Aufgabe this fieldInfos new Hashtable Assembly a Assembly GetExecutingAssembly if a null Type t a GetType ReflectionSpeedTest Person FieldInfo fis t GetFields foreach FieldInfo fi in fis this fieldinfos Add fi Name fi Console WriteLine fi Name a for int i 1 lt 125335 i IDictionaryEnumerator en this fieldInfos GetEnumerator while en MoveNext Console WriteLine en Key ToString NET BlogBook Ausgabe 4 Insgesamt
314. vorgang eine StackOverflowException geworfen wird oder tats chlich eine echte auftritt Im ersteren Fall k nnte die Exception behandelt werden im zweiteren Fall wird die Anwendung sofort terminiert Zus tzlich sind derartige Verhaltensweise idealerweise in einem Release Build zu testen da es Unterschiede zu Debug Builds gibt und f r gew hnlich Release Builds ausgeliefert werden Das bedeutet Die einzige sinnvolle Einsatzvariante liegt darin den aktuellen Anwendungsstatus zu speichern bzw die nicht behandelnden Exceptions in eine Logdatei aufzuzeichnen Denn die Anwendung wandert ohnehin ber den Jordan sofern eventArgs IsTerminating wahr ist NET BlogBook Ausgabe 4 2 2 63 Liste der installierten ADO NET Provider abrufen M chte man berpr fen ob ein bestimmter ADO NET Provider am System registriert ist kann dies mit einigen Zeilen Code erledigt werden Das nachfolgende Beispiel liefert eine Liste aller verf gbaren ADO NET Provider Zu beachten ist an dieser Stelle dass Provider die ber die App Config eingebunden wurden hier ebenfalls mit aufgelistet werden private List GetDbFactoryClasses List factClasses new List DataTable dt DbProviderFactories GetFactoryClasses if dt null foreach DataRow dr in dt Rows rac tC lasses Ada r 2 lt Tostring return factClasses Eine berpr fung ist nicht nur in Problemf llen sinnvoll sondern sollte auch vor dem
315. werden Zum Beispiel k nnte im set Bereich die L nge des berpr ften Wertes abgefragt werden berschreitet dieser eine bestimmte Vorgabe wird der Wert nicht zugewiesen und der alte Wert bleibt erhalten Ein Fehler der oft gemacht wird ist folgender private string name null public string Name get I return This Name set this Name value Was genau passiert hier Sowohl im get als auch im set Bereich wird immer wieder dieselbe Eigenschaft aufgerufen was in weiterer Folge zu einem Stack Uberlauf und daher zu einer StackOverflowException f hrt Hier ist wirklich darauf zu achten auch tats chlich die private Membervariable anzugeben 2 2 44 AppDomains und ShadowCopies Wer mit Anwendungs Dom nen zu tun hat st t irgendwann auch auf das Thema ShadowCopy Hierf r sind allerdings die vorhandenen Informationen rar gestreut Das MSDN gibt nicht viel her nur Oberfl chliches und auch sonst ist daf r nicht viel zu finden Vor allem nicht wenn es Probleme gibt Daher hier eine kleine Anleitung was bei diesem Thema alles zu beachten ist NET BlogBook Ausgabe 4 Zuerst kurz eine Begriffserklarung AppDomain Eine AppDomain ist im Endeffekt nichts anderes als der Kontext in dem eine Anwendung ausgef hrt wird ShadowCopies Dies wird zum Beispiel von ASP NET betrieben Assemblies die vom IIS geladen werden sollen werden in ein ShadowCopy Verzeichnis kopiert und von dort geladen Die urspr ngliche
316. werden die Daten korrekt am Client angezeigt namlich die geanderten Zu guter Letzt mochte ich noch die unterschiedlichen Lebenszyklen einer Seite anfuhren da sich diese durch ein PostBack verandern und darauf entsprechend Rucksicht genommen werden muss Lebenszyklen Erster Aufruf Die nachfolgenden Ereignisse bzw Methoden werden beim initialen Aufruf einer Seite der Reihe nach abgearbeitet Init Load PreRender SaveViewState Render Dispose Unload NOOR WN Bei einem PostBack Bei einem PostBack erweitert sich der Lebenszyklus einer Seite geringf gig Hier nun die neue Reihenfolge Init LoadViewState LoadPostData Load RaisePostDataChangedEvent RaisePostBackEvent PreRender SaveViewState Render 10 Dispose 11 UnLoad OONDORWN Fazit NET BlogBook Ausgabe 4 Es gilt sehr gut zu Uberlegen in welchen Events welche Funktionalitat ausgefuhrt werden soll Hierf r solange man sich noch nicht daran gew hnt hat regelm ig einen Blick auf den Lebenszyklus werfen 2 4 61 ASP NET Web Controls dynamisch laden In vielen Situationen ist es notwendig Web Controls dynamisch in einen Platzhalter Placeholder Control zu laden Dies kann sehr einfach bewerkstelligt werden this ContentPlaceHolder Controls Clear this ContentPlaceHolder Controls Add LoadControl modulss TestControlascx j E Das Beispiel geht davon aus dass Web Controls im Verzeichnis modules
317. wicklung ein Problem mit der Datei WebUlValidation js hat es erscheint eine wundersch ne Fehlermeldung dass diese Datei nicht vorhanden ist oder aber nur nicht verwendet werden kann dem kann einfach geholfen werden Dazu einfach die Visual Studio 2005 Eingabeaufforderung offnen und den Befehl aspnet regiis C eingeben Ab sofort sollte wieder alles ganz normal funktionieren 2 4 39 Advanced Captcha in ASP NET In der Diskussion Captcha Ablosung wurde nach M glichkeiten gesucht herk mmliches Captcha abzul sen Thomas Bandt l st dies durch eine einfache Rechenaufgabe welche von den aktuellen Bots meist nicht gemeistert werden kann Ich habe auf Basis des CodeProject Artikels CAPTCHA Image eine zumindest fur mich neue Variante entwickelt Zum Schluss sieht dies so aus NET BlogBook Ausgabe 4 Captchalmage Test Microsoft Internet Explorer Datei Bearbeiten Ansicht Favoriten Extras Zur ck J N JO suchen Favoriten 7 u 4 2 Adresse http localhost 3565 SampleCaptcha Default aspx web durchsuchen rie lal Gl F j Captchalmage Test SampleCaptcha Test A demonstration using the CaptchaGenerator object to prevent automated form submission Enter the code shown above Note If you cannot read the numbers in the above image reload the page fo generate a new one Trusted sites Abbildung 32 Captcha Variante Der Schwierigkeit kann hierbei noch erhoht werden indem
318. word return calculator Sub x y else throw new SecurityException Not allowed Sub NET BlogBook Ausgabe 4 Ich m chte nur darauf hinweisen dass ein Protection Proxy entsprechend abgesichert sein sollte Die obige Variante dient lediglich der Veranschaulichung und sollte so nicht verwendet werden 4 5 6 Builder Pattern in C Eine Diskussion mit Thomas veranlasste mich einige Beispiele f r ein Builder Pattern im NET Framework zu suchen zu beschreiben und selbst ein kleines Beispiel aus der Praxis zu liefern Einf hrung Grundlegend z hlt das Builder Pattern zu den Object Creational Patterns es werden durch dieses Entwurfmuster also Objekte erstellt Sinn und Zweck des Builder Patterns ist es den Objekt Erstellungsprozess von der Repr sentation des Objektes zu entkoppeln Dadurch ist es m glich mit demselben Erstellungsprozess unterschiedliche Repr sentationen erstellen zu K nnen Beispiel aus dem NET Framework Ein sehr gutes Beispiel aus dem NET Framework ist durch den DbConnectionStringBuilder geben Dieser stellt die Basisklasse f r stark typisierte Ableitungen dar SqlConnectionStringBuilder etc Sehen wir uns an dieser Stelle einen kurzen Sourcecode an SqlConnectionStringBuilder connStringBuilder new SqlConnectionStringBuilder connStringBuilder DataSource local connStringBuilder InitialCatalog MyDatabase connStringBuilder UserID username connStringBuilder Password Spasswor
319. z nutzlich Folgende Funktion liest den Inhalt der Zwischenablage aus und gibt ihn als String zur ck private string ReadFromClipboard Gibt den Inhalt aus dem Clipboard zur ck string SErTextrromlipboard y IDataObject iData Clipboard GetDataObject f iData GetDataPresent DataFormats UnicodeText string strChar String iData GetData DataFormats UnicodeText strTextFromClipboard strChar return strTextFromClipboard 2 2 57 Parsing Dates and Times in NET Wie Datums und Uhrzeitwerte geparst werden k nnen zeigt der nachfolgende Artikel http www stevex org dottext articles 916 aspx 2 2 58 String formatting in C Ein interessanter Beitrag zum Thema String Formatierung unter C http www stevex org dottext articles 158 aspx 2 2 59 lsolatedStorage Computerspeicher verwalten Wer Konfigurationen oder andere Informationen in den Isolated Storage schreibt dem wird das Isolated Storage Tool storeadm exe bekannt sein Wem nicht der sollte es sich genauer ansehen Es handelt sich dabei um eine Konsolen Anwendung mit der der Inhalt des NET BlogBook Ausgabe 4 IsolatedStorage angezeigt oder gel scht werden kann In manchen Fallen durchaus hilfreich Das Tool gibt es wie auch den isolierten Speicher seit NET 2 0 und kann einfach ber die Visual Studio 2005 Commandline aufgerufen werden Wer Informationen dazu ben tigt der sollte sich folgende Links genauer ansehen Einf hr
320. zwischen die Zahlen Buchstaben oder andere Zeichen eingefugt werden die der intelligente Benutzer auslassen muss Wer sich dafur interessiert kann das Projekt SampleCaptcha herunterladen 2 4 40 Advanced Captcha in ASP NET Eine weitere Variante So hier habe ich noch eine Variante des bereits vorgestellten Captchas Auch dafur sollte es aktuell noch keine entsprechenden Implementierungen in den diversen Bots geben Sieht dann so aus NET BlogBook Ausgabe 4 A Captchalmage Test Microsoft Internet Explorer Datei Bearbeiten Ansicht Favoriten Extras Q Zur ck 7 gt x E N J Suchen SiP Favoriten web durchsuchen z Aa E captchaimgetest 7 SampleCaptcha Test A demonstration using the CaptchaGenerator object to prevent automated form submission Enter the code shown above Note If you cannot read the numbers in the above image reload the page to generate a new one Trusted sites Abbildung 33 Weitere Captcha Variante Captcha Sample 2 Download 2 4 41 JavaScript Alert von CodeBehind File aufrufen In vielen Foren wird oft die Frage gestellt wie denn aus beispielsweise C heraus eine MessageBox Im Web angezeigt werden kann Folgende Klasse zeigt die Verwendung public static class Alert public static void Show string message string repMessage message Replace String script m 134 NET BlogBook Ausgabe 4 Page page HttpContext Current CurrentHandler a
Download Pdf Manuals
Related Search
Related Contents
User Manual Sliding Gate Operator User`s Manual Manual DGP96 1.1x RO103TDS User Manual Prezado Cliente, Ao comprar um veículo Ford 0 km você adquire o M。DEL HEM - 550 取扱説明書 Copyright © All rights reserved.
Failed to retrieve file