Contact

netcreate OHG
  • Send mail to the author(s) E-mail
  • XING

My talks

Community

.NET Developer Group Braunschweig Co-Lead INETA Deutschland Microsoft Community Leader/Insider Program (CLIP) .NET GUI Just Community e.V.

Categories  RSS 2.0

Archives

Blogs of friends

Comments

Stats

Total Posts: 229
This Year: 62
This Month: 0
This Week: 0
Comments: 105

Tags

 

Ein Ohrwurm, der gute Laune macht...

Posted in OffTopic at Thursday, January 31, 2008 4:08 PM W. Europe Standard Time

Weil ich es immer mal wieder suche, kommt es nun in meinen Blog. Es macht einfach nur gute Laune! :)

Verlängerung der deutschen Ausscheidung der INETA Silverlight Challenge

Posted in INETA |  Silverlight Challenge at Monday, January 28, 2008 11:21 AM W. Europe Standard Time

Nun ist es offiziell, die INETA verlängert den INETA European Silverlight Contest. Dadurch verlängert sich auch die deutsche Ausscheidung und gibt allen Entwickler die Möglichkeit weiter Silverlight Applikationen einzureichen.

Der neue Einsendeschluss ist nun der 12.02.08. Die Gewinner werden am 14.02.08 bekanntgegeben.

ConfigurationSection in Action

Posted in .NET Entwicklung at Sunday, January 27, 2008 9:23 PM W. Europe Standard Time

Seit dem .NET Framework 2.0 gibt es neue Möglichkeiten, eigene ConfigurationSection für eine App.config zu implementieren. Früher musste dazu das System.Configuration.IConfigurationSectionHandler Interface abgeleitet werden, welches aber nun deprecated ist. Nun bot sich für meine kleine StartUp-Applikation an, die ConfigurationSection zu benutzen.

Mich hat schon länger das Bootverhalten meines Rechners genervt. Alle Programme starten gleichzeitig, das kann man doch tunen! Aus diesem Grunde habe ich mir eine kleine StartUp-Applikation erstellt, welche Programme nach einer bestimmen Zeit nacheinander startet. Dazu habe ich mir meine eigene App.config Section überlegt. Der schnellste Weg ohne eine eigene ConfigurationSection wäre mit NameValueCollection gewesen. NameValueCollection verwaltet aber nur einen Key und ein Attribut und gerade wenn man mit mehr als Attributen arbeiten will, bietet sich eine eigene ConfigurationSection an. Auf geht es!

Folgende XML Struktur soll die ConfigurationSection einlesen:

App.config - Copy Code
1<programSettings> 2 <programToStart delayBeforeStartSeconds="0"> 3 <programToStartList > 4 <add programName="test.exe" startNextDelaySeconds="0"/> 5 <add programName="test1.exe" startNextDelaySeconds="0" 6 startOption="/startup" /> 7 </programToStartList> 8 </programToStart> 9</programSettings>

Es gibt folgende Attribute:

delayBeforeStartSeconds Gibt an, wie lange die Applikation warten soll, bis das erste Programm gestartet wird
programName Programmname des zu startenden Programms
startNextDelaySeconds Gibt die Wartezeit an, bis das nächste Programm gestartet werden soll
startOption Falls das Programm Startoptionen hat, können die hier hinterlegt werden.


Was benötigen wir noch? Wir brauchen eine ConfigurationSection-Klasse, eine ConfigurationElement-Klasse, welche die Attribute ausliest und eine ConfigurationElementCollection-Klasse, die die Iteration über die einzelnen ConfigurationElemente übernimmt.

Als erstes müssen wir eine Klasse (ProgramToStartConfiguration) erstellen, dazu müssen wir von der
ConfigurationSection-Klasse ableiten:

ConfigurationSection - Klasse - Copy Code
1 public class ProgramToStartConfiguration : ConfigurationSection 2 { 3 private ConfigurationPropertyCollection _properties; 4 5 private ConfigurationProperty _programToStartList; 6 private readonly ConfigurationProperty _delayBeforeStartSeconds; 7 8 public ProgramToStartConfiguration() 9 { 10 _programToStartList = new
                  ConfigurationProperty(
"programToStartList",
                                             typeof(ProgramToStartList)); 11 _delayBeforeStartSeconds = 12 new ConfigurationProperty("delayBeforeStartSeconds", 13 typeof(int), (int)1000, 14 ConfigurationPropertyOptions.None); 15 _properties = 16 new ConfigurationPropertyCollection(); 17 18 _properties.Add(_programToStartList); 19 _properties.Add(_delayBeforeStartSeconds); 20 21 } 22 23 [IntegerValidator(MinValue = 1, MaxValue = 10000, 24 ExcludeRange = false)] 25 public int TimeBeforeStart 26 { 27 get { return (int)this["delayBeforeStartSeconds"]; } 28 set { this["delayBeforeStartSeconds"] = value; } 29 } 30 [ConfigurationProperty("programToStartList")] 31 public ProgramToStartList ProgramToStartList 32 { 33 get { return base[_programToStartList] as ProgramToStartList; } 34 } 35 36 protected override ConfigurationPropertyCollection Properties 37 { 38 get { return _properties; } 39 } 40 }

Wie man in der XML Darstellung (s. Zeile 2) sehen kann, ist die ConfigurationSection als "programToStart" bezeichnet
und enthält das Attribut "delayBeforeStartSeconds". Damit wir das Attribut auslesen können, müssen wir ein passendes ConfigurationProperty (s. Zeile 12-15) erstellen. Damit wir das Property ansprechen können, müssen wir es noch nach außen hin sichtbar machen (s. Zeile 24-30). Passend dazu habe ich einen IntegerValidator erstellt, da der Wert der benötigten Zahl zwischen 1 und 10000 liegen soll. Was jetzt noch fehlt, ist die ConfigurationPropertyCollection zur Verwaltung der Properties.

In Zeile 3-6 der XML Section ist eine Auflistung von mehreren Elementen zu sehen. Damit wir so eine Auflistung als Collection erstellen können, muss die ConfigurationElementCollection-Klasse (ProgramToStartList) erstellt werden:

ConfigurationElementCollection - Klasse - Copy Code
1 public class ProgramToStartList : ConfigurationElementCollection 2 { 3 protected override ConfigurationElement CreateNewElement() 4 { 5 return new ProgramToStart(); 6 } 7 8 protected override object GetElementKey(ConfigurationElement element) 9 { 10 if (element is ProgramToStart) 11 return ((ProgramToStart) element).ProgramName; 12 else 13 throw new ArgumentException("The specified element is 14 not of the correct type."); 15 } 16 }


Die Klasse erfordert die beiden Methoden CreateNewElement() und GetElementKey(). Damit die Attribute von einem Element ausgelesen werden können, benötigen wir noch eine ConfigurationElement-Klasse:

ConfigurationElement - Klasse - Copy Code
1 public class ProgramToStart : ConfigurationElement 2 { 3 private ConfigurationPropertyCollection _properties; 4 private readonly ConfigurationProperty _programName; 5 private readonly ConfigurationProperty _startNextDelaySeconds; 6 private readonly ConfigurationProperty _startOption; 7 8 protected override ConfigurationPropertyCollection Properties 9 { 10 get { return this._properties; } 11 } 12 13 public ProgramToStart() 14 { 15 _programName = new ConfigurationProperty("programName", 16 typeof (string),"", 17 ConfigurationPropertyOptions.IsRequired); 18 _startNextDelaySeconds = 19 new ConfigurationProperty("startNextDelaySeconds", 20 typeof (int), (int) 1000, 21 ConfigurationPropertyOptions.None); 22 _startOption = new ConfigurationProperty("startOption", 23 typeof(string), ""); 24 _properties = 25 new ConfigurationPropertyCollection(); 26 27 _properties.Add(_programName); 28 _properties.Add(_startNextDelaySeconds); 29 _properties.Add(_startOption); 30 } 31 32 [IntegerValidator(MinValue = 1, MaxValue = 10000, 33 ExcludeRange = false)] 34 public int StartNextDelaySeconds 35 { 36 get { return (int) this["startNextDelaySeconds"]; } 37 set { this["startNextDelaySeconds"] = value; } 38 } 39 40 public string ProgramName 41 { 42 get { return this["programName"].ToString(); } 43 set { this["programName"] = value; } 44 } 45 public string StartOption 46 { 47 get { return this["startOption"].ToString(); } 48 set { this["startOption"] = value; } 49 } 50 }

Die Elementklasse "ProgramToStart" hat denselben Aufbau (ConfigurationProperty, ConfigurationPropertyCollection) wie der, der schon weiter oben diskutiert worden ist.

Das war es schon! Wenn wir unsere eigene ConfigurationSection in unserer Applikation auslesen wollen, machen wir das über die ConfigurationManager.GetSection() Methode:

1 ProgramToStartConfiguration conf = 2 ConfigurationManager.GetSection("programSettings/programToStart") 3 as ProgramToStartConfiguration;

Das Erweitern der ConfigurationSection um ein weiteres Attribut ist relativ einfach, da man nur in der Klasse ein weiteres ConfigurationProperty hinzufügen muss. Es greift dann der größere Aufwand beim Erstellen einer eigenen ConfigurationSection.

Installation des Tools: Einfach die StartAfterBootUp.exe in den Autostart legen und mit der App.Config konfigurieren.

Links:

StartAfterBootUp: Exe
StartAfterBootUp: Sourcecode

FeedDemon vs. RSS Bandit

Posted in Allgemein |  Freeware at Friday, January 18, 2008 5:25 PM W. Europe Standard Time

Nachdem FeedDemon nun kostenlos angeboten wird -  ich habe bis jetzt RSS Bandit als Feedreader benutzt - habe ich mich entschlossen, dieses einmal auszutesten. Hier nun mein Testergebnis, das natürlich auf meiner subjektiven Meinung beruht.

Auf geht es: Runtergeladen, fix installiert und dann das erste "Ui", beim Einrichten von FeedDemon wird ein Import aus RSS Bandit angeboten. FeedDemon bietet ein sehr cooles Feature an, den Online Dienst "Newsgator". Damit kann man seine Feeds nicht nur Online lesen, sondern auch mehrere Rechner synchronisieren. Das einzige was angelegt werden muss, ist ein Account (Login plus Passwort) und schon kann synchronisiert werden. RSS Bandit bietet so etwas nicht direkt als Dienst an, aber die Möglichkeit per FTP seine Feedliste zu synchronisieren. FeedDemon geht einen Schritt weiter, es merkt sich sogar welche Feeds gelesen wurden und welche nicht, so muss man sich das nicht mehr selbst merken ;-)

Weiter geht es: Nachdem ich alles eingerichtet hatte, war ich etwas von der FeedDemon Oberfläche enttäuscht. Da kann in meinen Augen RSS Bandit ganz klar punkten. FeedDemon hat eine Anzeigebegrenzung der Feeds von 10 Stück pro Seite. Das nervt sehr, da ich einfach nur schnell die Überschriften lesen möchte und nicht erst mal 5 x Klicken möchte, bevor ich durch den Feed bin. (Update: Es geht doch, die Funktion war versteckt. Danke an Christian!)

Beim Durchblättern haben die Entwickler meiner Meinung nach auch nicht wirklich mitgedacht, die Pfeile für das Weiterblättern sind rechts unten, die Feedliste ist links, sprich ich muss immer einmal über das gesamte Programm mit der Maus fahren... Es gibt aber Shortcuts für das Hin- und Herblättern, nur funktionieren die erst, wenn das Anzeigefenster vorher mit der Maus angeklickt wurde.

Ein weiteres Feature, das sehr schön beim RSS Bandit gelöst ist, ist dass man pro Feed einstellen kann, ob es Ballon Tips geben soll. Ok, diese Funktion bietet FeedDemon auch, aber nur sehr rudimentär. So gibt FeedDemon nur eine Auskunft in der folgenden Art: "Feed X hat 5 neue Nachrichten". Bei RSS Bandit werden die Überschriften mit angezeigt - ein klarer Vorteil, wenn ich schon Ballon Tips haben möchte. Des Weiteren fehlt beim FeedDemon die Funktion "Start on Windows StartUp".

Das Hinzufügen von Feeds beim FeedDemon gestaltet sich als mühselig. Durch RSS Bandit war ich es gewohnt einfach nur auf den Feedlink rechten Mausbutton "Subscribe to RSS Bandit" zu klicken, diese Funktion muss beim FeedDemon nachinstalliert werden. Dies wird durch das Tool "Newsgator Toolbar" erledigt. Der Nachteil ist, dass man nun eine Toolbar im IE o. Firefox hat. Diese kann man aber zum Glück ausschalten. :-)

Für RSS Bandit spricht, dass es Open Source und in .NET geschrieben ist. Zwar kann man auf die Newsgator Online API zugreifen und dadurch einen eigenen Feedreader schreiben, aber FeedDemon kann nicht eigenständig erweitert werden.

Aber nun kommt das absolute Killerargument für RSS Bandit. RSS Bandit hat bei mir immer ca. 100 MB RAM in Beschlag genommen. FeedDemon belegt bei mir nur ca. 5-20 MB RAM, da kann man einfach nichts gegen sagen :)

Deshalb gibt es bei mir einen Feedreader-Wechsel! Die RAM Auslastung und das einfache Synchronisieren von verschieden Rechnern hat mich überzeugt!

Links:

Der Einsendeschluss der deutschen Ausscheidung des INETA Silverlight Challenges nähert sich dem Ende. Am 28.1.08 ist Einsendeschluss!

Momentan sind noch nicht viele Projekte gemeldet und es gibt gute Chancen nicht nur die Ehre Deutschlands beim INETA European Silverlight Challenge zu vertreten, sondern auch noch einen der attraktiven Preise zu ergattern.

-> Gewinnt die deutsche Ausscheidung, stellt euch der europäischen Konkurrenz und fahrt zur MIX'08!

Link: silverlightchallenge.ineta-germany.org

Neue Ausgabe des .NET BlogBook erschienen

Posted in .NET Entwicklung | Allgemein | Community at Wednesday, January 16, 2008 8:48 PM W. Europe Standard Time

cover_dotnet_blogbook

Es gibt eine neue Ausgabe des .NET BlogBook. Wieder dabei ist ein Gewinnspiel! :-)

Ein Ticket für die VSone Konferenz, die bereits am 13. Februar startet. Das Gewinnspiel endet am 20. Januar. Somit hat der Gewinner noch genug Vorlauf um die Anreise und Unterkunft zu planen.

Auch diese Ausgabe des BlogBook beinhaltet wieder viel Neues - Insbesondere in den Bereichen Windows Presentation Foundation, C# 3.0 und Tools wurde zugelegt. Insgesamt ist das BlogBook nun 320 Seiten stark und hat somit 40 Seiten mehr als die letzte Ausgabe.

Mehr Informationen und den Download gibt es hier.

Die .NET Developer Group Braunschweig trifft sich zu ihrem 15 User Group Treffen am 21.01.08 um 18:00 im Restaurant Flair.

Achtung!!! Dieses Treffen beginnt ausnahmsweise um 18:00!!!

Mit seinem Vortrag "Workshop zu Mobile Computing: Einführung" kommt uns Torsten Weber (MVP Device Application Development) besuchen.

Details zum Vortrag:

Mobile Computing ist schwer, denn dazu benötigt man einerseits enormes Fachwissen und andererseits mindestens ein mobiles Gerät. Falsch; Mobile Computing ist gar nicht so schwer wie man denkt. Viel schwerer ist es, die Angst davor zu verlieren. Genau das bietet Torsten Weber mit einem „Wo und wie beginne ich"-Workshop als Einführung an. Da die Begriffe AJAX und Web Irgendetwas.Null auf Entwickler magische Anziehungskraft besitzen und manche Entwickler wiederum lieber bei Webanwendungen bleiben als bei Windows Forms, gibt es Schmackes noch oben drauf: Nämlich die Unterstützung vom Internet Explorer Mobile für Webanwendungen mit AJAX & Co. für mobile Geräte.

Weitere Infos unter www.dotnet-braunschweig.de.

Wie immer ist jeder herzlich willkommen!

Problem: Visual Studio ist super lahm beim Kompilieren

Posted in .NET Entwicklung |  VS Team System at Friday, January 04, 2008 4:02 PM W. Europe Standard Time

Ich habe gerade ein Visual Studio Projekt bearbeitet, was schon längere Zeit nicht weiter entwickelt wurde. Das Kompilieren des Projektes hat super lange gedauert... völlig unnormal lange, besonders weil es auch nicht sehr groß ist.

Als erstes habe ich die Referenzen gecheckt, weil teilweise diese noch auf einen alten Server zeigen konnten. Die Referenzen waren OK. Daraufhin bin ich die gesamten Projekteigenschaften durch und habe nichts gefunden. Nun kommt der Trick:

Jeder der sich wunder, warum sein VS so lange kompiliert, sollte einen Blick mit einem Editor in die *.csproj Projektdatei werfen. Dort stand bei mir als HintPath noch der alte Server drin:

<HintPath>\\ALTERSERVER\DLLs\dllname.dll</HintPath>

Dadurch hat Visual Studio jedesmal einen Timeout abgewartet und wenn man mehrere Referenzen hat, kann sowas dauern. Nachdem ich das korrigiert hatte, kompiliert alles wieder mit Vollspeed! ;-)

Lustig ist nur, dass in den VS Projekteigenschaften nirgends der <HintPath> auftaucht... tja mal wieder ein AHA mehr ;-)

Unterschiede zwischen Outlook Form Region und Custom Task Pane

Posted in Office 2007 at Friday, January 04, 2008 11:11 AM W. Europe Standard Time

Da ich öfter gefragt werde, wo der Unterschied zwischen Outlook Form Region und Custom Task Pane ist, kann ich diesen Blogeintrag "Hiding and Showing an Adjoining Outlook Form Region" als Einstieg empfehlen.

Nebenbei beantwortet dieser auch noch die Frage, ob ein Outlook Form Region während der Laufzeit an/ausblendbar ist.
Antwort: Nein :)

MS Launch Event 2008 - In bin als ATE dabei

Posted in .NET Entwicklung |  VS Team System | Allgemein | Community |  Konferenzen at Thursday, January 03, 2008 5:21 PM W. Europe Standard Time

Nachdem ich bei der XTOPIA schon als ATE (Ask The Expert) war, bin ich nun auch auf dem großen Microsoft Launch Event (VS 2008, Windows Server 2008, SQLServer 2008) in Frankfurt mit dabei. :) Ich bin dort als ATE für VS Team System & ASP.NET vor Ort. Wie Torsten schon geschrieben hat:

... Wer den Launch verpasst, kann später auch nicht sagen: "Kind ich war da dabei!" ;)

In diese Sinne freue ich mich schon auf viele Gespräche, viele bekannte und neue Gesichter sowie natürlich auf die spannenden Vorträge. (... na Frank, hast du deinen Vortrag schon fertig? :-) )

Weitere Infos: Microsoft Launch Event 2008 -  - ready.for.take.off

Outlook Add-Ins einfach debuggen mit einem eigenem Developer-Profil

Posted in .NET Entwicklung |  Office 2007 at Wednesday, January 02, 2008 11:16 PM W. Europe Standard Time

Alle Outlook Add-In-Entwickler kennen sicher das Problem, wenn das eigene Add-In debuggt werden soll, startet jedes Mal das eigene Outlook. ...und das kann schon mal länger dauern, je nachdem wie groß das Postfach ist :-)

Mit einem kleinen Trick kann man sich behelfen. Unter "Start->Systemsteuerung->Mail" wird einfach ein neues Profil angelegt, z.B. mit dem Namen "developer".

profil

Der Vorteil ist, dass man eine eigene E-Mailadresse benutzen kann und wenn das Profil kaputt geht, bleibt das eigene unangetastet (normalerweise ;-)).

Nachdem man durch drücken auf "hinzufügen" ein neues Profil angelegt hat, muss dieses noch in Visual Studio hinterlegt werden.

vs_profile

Dazu wechselt man einfach in die Debug Optionen beim Visual Studio Projekt und gibt als Start Applikation Outlook (outlook.exe) an. Nun muss nur noch im Command line arguments Feld folgende Einstellung hinterlegt werden: /Profile "<profilename>" (Die " müssen angegeben werden).

Et voila nun startet jedes Mal Outlook mit dem neu angelegten "developer" Profil... und das fix! :)