.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv März 2008

Tickets werden knapp, beim Afterlaunch

31.03.2008 17:27:45 | Albert Weinert

Wer sich noch keinen Platz beim Afterlaunch Community-Event  in NRW gesichert hat muss sich nun beeilen. Es sind nur noch 24 20 12 10 5 0 Tickets zu vergeben. Also, meldet euch lieber schnell und bevor es zu spät ist.

http://www.afterlaunch.de

AfterLaunch ist eine Veranstaltung von der Community für die Community. Anlässlich der Vorstellung von Windows Server 2008, SQL Server 2008 und Visual Studio 2008 präsentieren die User Groups aus Bonn, Köln und vom Niederrhein unter Schirmherrschaft des JustCommunity e.V. am 11. April 2008 im Technologiepark in Köln einen Tag voll mit interessanten Themen, Tipps und Tricks. Ergänzend zum offiziellen Launch vermitteln Entwickler und IT-Professionals Wissen und Erfahrung aus ihrer täglichen Arbeit. Denn Launch war gestern - heute ist Praxis!

Team Foundation Server Migration - ein Zwischenstand

30.03.2008 22:42:00 | Jürgen Gutsch

Verwöhnt vom Team Foundation Server 2005 kam ich am 02.01.2007 in die neue Firma und musste feststellen, das ich wieder mit Visual SourceSafe arbeiten musste. Ein großer Rückschritt für einen der eine viel performantere Umgebung gewohnt ist...

Als ich erzählte, dass ich bereits mit dem TFS gearbeitet hatte, musste durfte ich diverse Microsoft Schulungen besuchen und mich in die Materie einarbeiten... Wie sich denn bei der Installation und im Laufe der Migration herausstellte, sind die Schulungen alle schön und gut, aber in der Praxis sieht es dann doch schon wieder ganz anders aus. Glücklicherweise hatten wir (ein Arbeitskollege und ich) uns entschlossen, ausführliche Tests zu fahren, was dann auch der eigentliche Grund für die dreiwöchige Migration ist.

Gegeben war eine viel zu große und total kaputte Visual SourceSafe Datenbank, ein etwas überladenes Bug-und Featuretracking und eine viel zu komplexe Buildautomation. Zu unserem Nachteil gibt es keine wirklich guten Tools die uns die Migration erleichtern haben.

Für die Migration der Sourcen von VSS in die TFS Source Control gibt es ein Komandozeilentool, welches mit Hilfe von zuvor erstellten XML Mapping-Dateien die Sourcen und deren History aus dem VSS holt und in den TFS importiert. Hört sich schön an, ist aber dennoch relativ schwierig, wenn die VSS DB a) zu Groß ist und b) viel zu viele Fehler enthält. Die VSS DB musste mehrfach repariert und in kleine Häppchen in den TFS importiert werden. Ein Nachteil an dem Komandozeilentool ist, dass alle Daten per XML Webservice in den TFS geschoben werden. Somit benötigen wir mehr als zwei Tage nur für den Import der Sourcen. Da ein parallel zum Import der Sourcen nichts am TFS gemacht werden kann (CPU und Speicher sind auf Anschlag, da das Komandozeilentool, der Webservice und der SQL Server alles in Anspruch nehmen), werden wir den Import der Bugs und Tasks ebenfalls verschieben müssen.

Der Import der Bugs und Features in den TFS läuft über einen Umweg: Raus aus der Tracking Software in CSV, Import nach Excel, aufbereiten und per Excel und dem TFS Plugin als Workitem in den TFS. Eine Automatisierung wäre toll gewesen, aber wer schreibt schon sowas für eine Migration die in einem Unternehmen normalerweise nur einmal gemacht wird. Die Schwierigkeiten hierbei waren a) bestimmte Felder die es im agilen Teamprozess nicht gibt und angelegt werden mussten und b) die Tatsache, dass die Daten des alten Bug Tracking komplett anders aufgebaut waren. Ich durfte mich also erst einmal hinsetzen und die Felder vergleichen und die Benötigten aussuchen und ggf. für das entsprechende Workitem anlegen. Beim ersten Export der Daten stellte sich heraus, dass unter anderem z. B. das Feld "Priority" in beiden Umgebungen komplett anders definiert wird:
- im alten System: 1 = High, 2 = Low, 3 = Middle
- im TFS: 1 = High, 2 = Middle, 3 = Low

Vor dem Einfügen der Daten in den TFS müssen also bestimmte Werte erst einmal umgeschrieben werden. Drei Stunden Arbeit, jeweils für die Bugs und die Features, bei jeden einzelnen Import-Versuch... (Denn natürlich stimmten nicht alle Feldzuordnungen auf Anhieb überein)

Die dritte Baustelle war die Buildautomation die viel zu komplex ist und sich nicht in den TFS übertragen lässt. Glücklicherweise bietet hier der Anbieter unserer Build-Automatisierungssoftware eine Schnittstelle zum Teambuild an. Wir können also unsere bestehende Buildautomation weiter verwenden und dennoch die Vorteile des Teambuild nutzen. Wenigstens dieses Problem war relativ einfach zu lösen.

Soweit so gut... Die Migration ist noch nicht ganz fertig. Schätzungsweise aber in zwei Tagen. Ich freue mich schon... endlich wieder TFS, endlich wieder performantes Arbeiten...

:-)

AfterLaunch: Nur noch zwei Wochen - jetzt anmelden!

29.03.2008 18:54:00 | Roland Weigelt

Es braut sich etwas zusammen in Nordrhein-Westfalen! Anlässlich der Vorstellung von Windows Server 2008, SQL Server 2008 und Visual Studio 2008 haben sich die User Groups aus Bonn (Bonn-to-Code.Net), Köln (.net User Group Köln) und vom Niederrhein (.net developer user group niederrhein) zusammengetan, um unter der Schirmherrschaft des JustCommunity e.V. ergänzend zum offiziellen Launch ein Community-Event der besonderen Art auf die Beine zu stellen:

  • Ein ganzer Tag voller Vorträge, verteilt auf drei parallele Tracks
  • Sprecher, die als Entwickler und IT-Professionals aus ihrer täglichen Arbeit heraus Praxiswissen vermitteln
  • Große Verlosung von Software (Not-for-resale Versionen von Windows Server 2008, SQL Server 2008 und Visual Studio 2008, Lizenzen für CodeRush with Refactor! Pro, Resharper und dotTrace, ANTS Profiler und SQL Compare Pro)
  • Vielfältige Möglichkeiten zum Networking mit anderen Teilnehmern und Firmen aus der Region

Und das zu einem Preis von nur 8,- Euro, in dem auch noch Verpflegung, Getränke und Parkausweis enthalten sind.

AFTERLAUNCH
Launch war gestern - heute ist Praxis

 

Freitag 11. April 2008
KonferenzZentrum im Technologiepark Köln
Anmeldung und weitere Infos auf www.afterlaunch.de

TeamConf 2008

28.03.2008 15:33:00 | Christian Binder

am 22-24 April 2008 findet die TeamConf2008 in München statt.

http://www.teamconf.de/

Auch ich werde mit folgenden Vortägen am Start sein :-)

Wie nutzt Microsoft VSTS? Am Beispiel der Produktentwicklung der MS Developer Division.

Erhalten Sie ein Einblick wie das notwendige Project Management umgesetzt wurde.  Welche Quality Gates verwendet werden. Welche Probleme wir hatten. Nehmen Sie die eine oder andere Anregung für Ihren Entwicklungsprozess mit

NEXT: Microsoft VSTS code name „Rosario“

Lernen Sie die nächste VSTS Generation kennen! Erhalten Sie ein Überblick, was die nächste VSTS Generation mitbringen wird. Sehen Sie einige der Neuerungen des aktuellen CTP’s

VSTS Web und Load-Testing Möglichkeiten mit VSTS 2008

Mit Oliver Hilgers, einem unserer Development Consultants mit viel praktischer Erfahrung in diesem Bereich, werde ich zeigen, was man so alles mit VSTS Webtests und Loadtests machen kann. Auch werden wir den Prozess Performance Testing in Bezug auf Webtests genauer beleuchten.

Auch sollten Sie Thomas Schisslers Vortrag Implementierung einer hierarchischen Workitem-Organisation mit Hilfe der TFS API nicht verpassen!

Allso es lohnt sich:-)

Chris

Singleton Pattern

27.03.2008 18:15:00 | Peter Bucher

Auf gehts, das nächste Pattern nach Strategy.

Heute geht es darum, sicherzustellen, das von einer Klasse nur eine Instanz erstellt werden kann, dies ist bspw. bei einer Logging Klasse, einem Desktop Programm oä. nützlich.
Im Grunde verhindert dieses Pattern das Erstellen von Instanzen durch den Konstruktor.

Der ganze Trick besteht darin, den Konstruktor private zu setzen, sodass dieser nur intern verwendet werden kann.
Zudem braucht es einen statischen Member in der Klasse, der die einzigartige Instanz hält.

Um an trotzdem von Aussen an eine Instanz zu kommen, spendieren wird der Klasse eine öffentliche Methode bspw. Namens "getInstanz", in dieser wird - wen noch nicht vorhanden - ein Objekt erstellt, und zurückgegeben.
Eine Klasse die das Singleton Pattern anwendet, ist nicht "nur" ein Singleton, sondern enthält (sinnvollerweise) immer auch noch weitere Daten und Methoden (Wie am zweiten Beispiel zu sehen ist).

(Die Beispiele lehnen sich an Java an, in C# wirds auch mit einer Eigenschaft + get gehen)

Minimales Beispiel:

using System;
using System.Collections.Generic;
using System.Text;


namespace SingletonExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Logger l = Logger.getInstance();
            Console.WriteLine(l == null);
            Console.Read();
        }
    }

    public class Logger {
        private static Logger instance;

        private Logger() {
           
        }

        public static Logger getInstance() {
            if (instance == null)
                instance = new Logger();

            return instance;
        }
    }
}

Ein "erweitertes" Beispiel mit mehr Sinn:

using System;
using System.Collections.Generic;
using System.Text;


namespace SingletonExample
{
    public class App
    {
        private Logger _logger;

        public void Run() {
            this._logger = Logger.getInstance();
            this._logger.Add("Programm Fehler");

            this._logger = Logger.getInstance();

            foreach (string error in this._logger.Errors) {
                Console.WriteLine(error);
            }
            Console.Read();
        }
    }

    public class Logger
    {
        private List<string>  _errors = new List<string>();
        private static Logger  instance;

        public List<string> Errors {
            get { return this._errors; }
            set { this._errors = value; }
        }

        private Logger() { }

        public static Logger getInstance() {
            if (instance == null) {
                instance = new Logger();
            }
            return instance;
        }

        public void Add(string error) {
            this._errors.Add(error);
        }
    }
}

Definition des Singleton Patterns:

Das Singleton-Muster sichert, dass es nur eine Instanz einer Klasse gibt, und bietet einen globalen Zugriffspunkt für diese Instanz.

Und am Schluss das kleine aber feine Klassendiagramm:

An einem GET Formular feststehende Werte mitgeben

27.03.2008 17:40:00 | Peter Bucher

Typisches Beispiel, ein Suchformular.
Dieses sollte per GET (method="get") abgeschickt werden, um das Suchergebnis auch Linken zu können.

Wenn die Seite jetzt aber noch auf zusätzliche Parameter angewiesen ist, können die feststehenden Parameter nicht einfach an die Url im "action" Attribut des Formulars angehängt werden, weil diese überschrieben werden.

D.h. bei sowas:

<form name="myForm" action="suche.aspx?param1=value1" method="get">
...
</form>

Geht der Parameter "param1" ins Nirvana.

Um sowas trotzdem zu erreichen, kann ein dieser Wert in ein HiddenField _innerhalb_ des jeweiligen Formulars platziert werden.
Bspw. so:

<form name="myForm" action="suche.aspx" method="get">
    <br type="text" name="suche" />
    <input type="hidden" name="param1" value="value1" />
    <input type="submit" value="Los..." />
</form>

Nach dem Abschicken des Formulars bekommt man so dir richtige, gewünschte Url:

seite.aspx?param1=value1&suche=asp.net

(Hier wurde "asp.net" in das "suche" Feld eingetragen)

Wink an: Michael :-)

Gratis XML.NET Buch

27.03.2008 09:49:29 | Jan Welker

Der Online-Buchversand Terrashop bietet allen .NET-Forum.de - Usern das Buch

XML und Web Services mit dem .NET Framework kostenlos an.



Das Angebot ist bis zum 1.Mai 2008 gültig.

Es fallen lediglich Versandkosten in Höhe von 3,95€ an.
Ab einem Bestellwert von 20,- € ist die Bestellung versandkostenfrei!

Hier geht es zur Aktion.

Webradio Sidebar Gadget

25.03.2008 23:23:26 | Jan Welker

Für alle die gern beim Programmieren Radio hören dürfte dieses Vista Gadget sehr interessant sein.

RadioGadgetI

Das Gadget bietet eine große Auswahl von Radiosenden an die einfach angeklickt werden können. Im Hintergrund werkelt der Windows Mediaplayer. Die Bedienung erfolgt aber komplett über das Gadget.

RadioGadgetII

Die Liste der Radiosender kann sehr einfach über eine Textdatei angepasst werden.

Download in der Windows Live Gallery

dotnet-forum.de Individualisieren

25.03.2008 22:54:02 | Jan Welker

auf der Startseite des dotnet-forum.de ist folgendes zu lesen: Es werden alle Bereiche abgedeckt. Von der Entwicklung von Clientanwendungen, Webapplikationen,  bis zur Add-In Entwicklung für das Visual Studio.“

Diese Fülle an Themen bringt leider einen kleinen Nachteil mit sich, die Anzahl der Unterforen (zur Zeit 30), ist sehr hoch, dies kann schnell unübersichtlich werden. Vermutlich interessieren sich nicht alle Forenmitglieder für alle Themen bzw. Unterforen.

Die Foren – Software bietet hier ein sehr nützliche Funktion, das Individualisieren des Forums.

Durch einen Klick auf diesen unscheinbaren Link

IndividualisierenI

gelangt man zu einer sehr komfortable Oberfläche (Ajax) mit der man einzelne Unterforen ein und ausblenden kann.

IndividualisierenII

So können z.B. Webentwickler alle Foren ausblenden die sich mit der Entwicklung von Windows Clients beschäftigen.

Praktische Sache!

MbUnit PlugIn for R# 4.0 available

24.03.2008 13:09:11 | Albert Weinert

Update: A new Version which works in R# 4 Final is here

English

I've just made a quick port of my MbUnit 2.4 PlugIn to ReSharper 4.0

It's called Beta 7 and is available as download and as source.

No new features were added or bug fixed since Beta 6, if you use Beta 6 and ReSharper 3.1 then there is no need for downloading Beta 7.

 

Deutsch

Ich habe gerade mein MbUnit 2.4 PlugIn nach ReSharper 4.0 portiert. Es ist die Beta 7 und verfügbar als Download und im Quelltext.

Es wurden keinen neuen Funktionen hinzugefügt noch fehler behoben seit Beta 6. Wenn Du Beta 6 mit ReSharper 3.1 verwendest dann besteht kein Bedarf für Beta 7.

 

http://code.google.com/p/mbunit-resharper/

http://code.google.com/p/mbunit-resharper/downloads/list

 

Vista und Virtual PC Soundkarte (Soundcard) Problem

23.03.2008 13:36:00 | Ozgur Aytekin

Nach dem ich ein neues Virtual PC mit Vista als Guest OS installiert habe, meldet Vista einen Fehler betreffend der Soundkarte (Soundcard). Es fehlt der Soundkarte-Treiber.

Ich bin davon ausgegangen, wenn ich die Virtual Machine Additions installiere, sollten alle Komponenten automatisch vom Vista erkannt werden. Ausser der Soundkarte wurden alle anderen Treiber automatisch installiert.

Nach der Installation von Virtual Machine Additions kopiert Virtual PC in das Verzeichnis C:\Program Files\Virtual Machine Additions diverse Files. Auch der Soundkarte-Treiber befindet sich in diesem Verzeichnis. Wir müssen Virtual PC und Vista nur einbisschen nachhelfen, damit der nötige Treiber installiert werden kann.

Folgende Schritte sind für die Installation vom Treiber nötig:

1.  Auf dem Desktop My Computer auswählen und mit der rechten Maustaste drauf klicken. Anschliessend Menüeintrag Manage auswählen.

Step010

2. Im Tree Device Manager auswählen.

step020

3. Im rechten Tree unter Other devices finden wir die Soundkarte. Mit der rechten Maustaste auf den Eintrag Multimedia Audio Controller klicken.

step030

 

4. Browse my computer for driver Software auswählen.

step040

5. Unter Search for driver software in this location das Verzeichnis auswählen, in dem die Virtual Machine Additions installiert wurden. Anschliessend mit Next klicken.

step050

6.Nach eine erfolgreiche Installation erscheint das folgende Fenster.

step060

Viel Spass.

Inkrementelle Suche im Visual Studio

22.03.2008 19:58:36 | Jan Welker

Ich hatte vor einigen Wochen auf die Suchmöglichkeit mit dem Visual Studio AddIn SonicFileFinder hingewiesen.
Heute bin ich durch Zufall auf einen sehr nützlichen Shortcut im Visual Studio gestoßen.
Mit Strg+I ruft man die Inkrementelle Suche auf, der Vorteil dieser Suchvariante ist, dass mögliche Fundstellen schon während dem Tippen angezeigt werden. Der aktuell eingetippte Suchstring wird dabei in der Statuszeile angezeigt.

InkrementelleSuche

Die aktivierte inkrementelle Suche erkennt man an dem Mauszeiger mit dem Fernglass.

Diese Suchvariante hat auch zwei kleine Nachteile die man berücksichtigen sollte.
Es wird nur im aktuellen Dokument gesucht und ausgeblendete Quelltextbereiche werden ebenfalls ignoriert.

Weiterführende Informationen gibt es in der MSDN.

DELL Latitude D620 und die Sound-Aussetzer unter Vista

22.03.2008 18:21:43 | Albert Weinert

Eine Sache plagt mich ja schon ein wenig länger bei meinem kleinen Laptop.

Beim abspielen von Musik kam es immer wieder zu aussetzern, System-Sound ertönten manchmal verspätet. Irgendwie ärgerlich.

Im Internet liest man dass wohl ein Treiberproblem sei und mit aktuellen Treibern dass Problem behoben werden können.

Ja, soweit verständlich und auch logisch. Problem ist nur das es auf den DELL Seiten der SigmaTel Audio-Treiber von Januar 2007 ist und nichts neues in Sicht ist. Auch verweisen die üblichen Treiber-Seiten immer wieder auf den DELL-Treiber auch wenn ich nicht explizit nach DELL gesucht habe.

Habe ich also erst mal den ChipSatz Treiber von Intel für den Chipsatz des Laptops geholt und eingespielt. Da auch der auf der DELL ein wenig veraltet war.

Dieser hat jedoch nicht beim Sound-Problem geholfen.

Irgendwo habe ich dann davon gelesen dass Realtek HD Audio Treiber wohl zu vielen OnBoard Chipsätzen kompatibel sind und bei einem dessen Sound-Probleme dadurch behoben wurden.

Was habe ich zu verlieren dachte ich mir ;) Sei keine Pussy. Die Realtek Seite gesucht, den Download der Treiber angestoßen und parallel dazu die SigmaTel Treiber deinstalliert. Nun die Realtek Treiber installiert => Neustart.

Nach dem Neustart dann gebannte Stille, wird der Laptop wieder Töne von sich geben, bis zum Anmelde-Schirm gab es schon mal nichts auf die Ohren. Nach der Anmeldung dann die ersten Töne. Fein.

Dann MediaPlayer gestartet: "Wow. Der legt ja direkt los ohne drüber nachzudenken" so wie früher unter XP :) Aussetzer hatte ich bis jetzt auch noch keine und die System Sounds scheinen auch pünktlich abgesetzt zu werden. Hoffen wir mal dass dies auch zu bleibt.

So, vielleicht hilft dies ja auch noch anderen. Deshalb hier die Treiber Download: Realtek High Definition Audio Codecs

 

Technorati-Tags: ,,,,,

CeBIT '08 - Smart Projecting & Facial Recognition

22.03.2008 08:52:00 | Lori Grosland

At CeBIT a couple of weeks ago I got the chance to talk with two German startup companies that were there to present their innovative products. 

Benjamin Fritsch from VIOSO filled me in on their Smartprojecting product that makes it possible to adapt any projection and show it on any surface.  The Smartprojecting system consists of a camera, a computer and a projector and the correction of the content is done right before it is projected.  The geometric and color distortions as they would appear with normal projection can be dramatically reduced and the correction works pixel accurate.

Andreas Wiratanaya from CanControls showed me their facial recognition wheelchair with a video-based facial expression controller.  CanControls specializes in digital image processing for advanced man-machine interaction.  The wheelchair software analyzes the facial expressions and gestures of the driver and can be controlled by actions such as blinking, tilting of the head or opening of the mouth.

VIOSO Website…
http://www.vioso.com/en/welcome.html

VIOSO German Video…
http://www.on10.net/blogs/lorigros/21468/

CanControls Website…
http://www.cancontrols.com/

CanControls German Video…
http://www.on10.net/blogs/lorigros/CeBIT-08-Mimik-steuert-Rollstuhl/

 

Colorwars 2008 bei Twitter

21.03.2008 22:07:59 | Albert Weinert

colorwars 2008

Ein paar Informationen dazu.

http://www.neunetz.com/2008/03/20/internet-mememadness-heute-colorwars/

http://www.denquer.de/trends/twitter-colour-wars-twitter-in-farbe.html

http://www.spreeblick.com/2008/03/21/twitter-colorwars/

Hat sich schnell ausgebreitet, wird sicher lustig. Last die Spiele beginnen. Ich bin dem Gold-Team beigetreten. Also, lass dich nicht lange bitten. Mach mit.

Mein Account: http://twitter.com/DerAlbert
Das Gold-Team:   http://twitter.com/goldteam
und noch http://twitter.com/colorwars

CeBIT '08 - Meet People on Every Website

21.03.2008 20:13:00 | Lori Grosland

I spoke with Nikolai Roth from zweitgeist at the CeBIT in Hannover a couple of weeks ago.  He showed me their product called Weblin, which is software that enables people on the same web page to see and communicate with each other.  While you are surfing, you and others on the same web page are visible to each other as small avatars and you are able to interact and chat with each other.  The idea behind Weblin is to make the Internet come alive and create the largest virtual world of all.  Nikolai filled me in on how Weblin works and what kinds of features are available. 

For more info about Weblin, check out their website…
http://www.weblin.com

German version of video…
http://www.on10.net/blogs/lorigros/CeBIT-08-Weblin/

Speicherplatz nach Vista SP1-Installation freigeben

21.03.2008 15:53:45 | Albert Weinert

Bei wem dass Service Pack 1 für Windows Vista gut läuft und es nicht mehr deinstallieren möchte. Der verschenkt wertvollen Speicherplatz auf seiner System-Partition wenn er die zur Deinstallation benötigten Dateien nicht löscht.

Beim Vista-Blog ist beschrieben wie man sich den Speicherplatz, ohne wilden Tricks, wiederholen kann.

http://www.vistablog.at/stories/22834/

Das geht schnell und schmerzlos.

Technorati-Tags: ,

Community-Veranstaltung zum Thema C++ in Visual Studio 2008

20.03.2008 12:20:00 | Christian Binder

Am 17. April bieten wir für die C++-Entwickler-Gemeinschaft eine dreistündige Veranstaltung zum Thema C++ in Visual Studio 2008 und dem VS2008 Feature Pack für C++ in Frankfurt/Main. Wir haben zwei Program Manager aus der Product Group eingeladen und sie werden folgende Themen vortragen.

Der Vortrag wird in Englisch gehalten werden.

Top-Themen der Veranstaltung:

  1. What's new in Visual Studio 2008
    • walkthrough new C++ features
    • VSTS for C++ developers
  2. A deeper look into the VS2008 Feature Pack for C++
    • demo of improvements to MFC
    • the value of TR1
  3. A brief glimpse into the future of Visual C++
    • highlights from what we're building for the next version of C++

Fast Facts:

 

Speaker:

 

Boris Jabes is a program manager on the Visual C++ team. He is responsible for improving the IDE experience for C++ developers with a focus on furthering the quality of source editing, understanding, and analysis. Recently, he's been concentrating on making the IDE scale to multi-million line source bases. Before joining Microsoft, Boris obtained degrees from the University of Waterloo and Carnegie Mellon where he specialized in distributed systems and software engineering.

 

Blog:

http://blogs.msdn.com/borisj

Die Teilnahme an der Veranstaltung ist kostenfrei. Melden Sie sich am besten gleich für die Veranstaltung per E-Mail an!

Anmeldung hier.

Chris

Imagine Cup 2008 - Auf nach Paris!

18.03.2008 19:05:00 | Lori Grosland

Ich habe mit Henrike Röse, Academic Event Manager bei Microsoft über den Imagine Cup gesprochen. Der Imagine Cup ist der weltweit größte Technologiewettbewerb für Schüler und Studierende ab 16 Jahren.  Microsoft richtet diesen Wettbewerb bereits zum 6. Mal in Folge aus und jährlich werden es mehr Teilnehmer die ihren Ideen und ihrer Kreativität freien Lauf lassen und ihre Projekte in einer der 9 Kategorien einreichen.

Neben internationalem Networking (im vergangenen Jahr waren rund 100 Nationen aus der ganzen Welt vertreten!) gibt es wertvolle Sach- und Geldpreise in Höhe von bis zu 15.000 US$ und eine Reise zum weltweiten Finale im Juli nach Paris zu gewinnen!

Es gibt sowohl technologische Kategorien wie Software Design und Game Development aber auch Design-Kategorien wie Kurzfilm, Fotografie oder Interface Design.

 

Der Wettbewerb steht jedes Jahr unter einem Motto: nach den Themen Gesundheit und Bildung in den letzten Jahren lautet das diesjährige Motto: "gesündere Umwelt und besserer Umweltschutz durch Technologie"

Mitmachen kann man jetzt noch in folgenden Kategorien: Fotografie: einfach bis zum 2.Mai 2008 eine Fotoserie von bis zu 10 Bildern zum Thema Umwelt auf deinen Windows live space hochladen !

Oder bei den Sonderawards der Kategorien Software Design und Interface Design teilnehmen.

Neben internationalem Networking (im vergangenen Jahr waren rund 100 Nationen aus der ganzen Welt vertreten!) gibt es wertvolle Sach- und Geldpreise und die Reise zum weltweiten Finale im Juli nach Paris zu gewinnen!

Die Kategorie Software Design ist die einzige der 9 für die in jedem der teilnehmenden Länder Vorrunden durchgeführt werden.  In Deutschland gibt es vier regionale Finale (München, Dresden, Düsseldorf und Hamburg). Aus jeder Region wird 1 Team zum nationalen Finale nach Berlin eingeladen. Im Rahmen einer großen Student Technologie Conference wird im Mai 2008 das Team ausgewählt, das die deutsche Fahne beim internationalen Finale in Paris hochhalten wird!
Du kannst dabei sein wenn die Entscheidung fällt. Es wird Vorträge zu den aktuellen Technologiethemen, Networking und vieles mehr geben;  auf der STC 2008!

Alle informationen unter www.imaginecup.info

CeBIT '08 - Stephan Walcher & Live Writer Blog

18.03.2008 18:57:00 | Lori Grosland

Stephan Walcher ist Microsoft-MVP und leidenschaftlicher Blogger. Er führt unter anderem den populären Live Writer-Blog in drei Sprachen: Deutsch, Italienisch und Englisch und verfügt vermutlich über die größte Plugin-Sammlung für Live Writer außerhalb der Windows Live Writer Plugin Gallery – darunter Plug-Ins für Video-Einbettung, Integration der IMDB (Internet Movie Database), Übersetzung und viele andere Sachen – und kennt die deutsche Bloggerszene seit den Anfängen. Wer interessante Insideransichten über die Unterschiede zwischen deutschen und italienischen Blogs erfahren will, oder erfahren möchte wie Stefan ohne Internet über seine Tour entlang der Westküste der USA mit GPS und Virtual Earth bloggen wird, der sollte sich diesen Beitrag unbedingt ansehen.

MSDN Magazine March 2008

18.03.2008 18:26:00 | Ozgur Aytekin

MSDN Magazine March 2008 könnt Ihr unter http://msdn2.microsoft.com/en-us/magazine/cc301916.aspx herunterladen.

Unter der Kolumne Data Points findet Ihr ein interessantes Artikel über LINQ.

Data Points: Standard Query Operators with LINQ

LINQ to Objects and LINQ to Entities have an arsenal of Standard Query Operators that operate on sequences to perform a wide variety of operations. John Papa

Die Verwendung von LINQ to XML mit Office 2007 Dateien findet Ihr unter der Kolumne Advanced Basics.

Advanced Basics: Office 2007 Files and LINQ

LINQ to XML and the Microsoft SDK for Open XML Formats simplify access to the parts of a 2007 Office system Open XML document when retrieving or modifying data, resulting in shorter, less complex code. Ken Getz

 

Viel Spaß beim Lesen

Eigene Favoriten auf dotnet-snippets.de anlegen

18.03.2008 17:51:28 | Jan Welker

Seit einigen Tagen ist ein neues Feature auf dotnet-snippets.de verfügbar.
Es ist möglich, sich auf dotnet-snippets.de eine Liste eigener Favoriten zusammenzustellen.

favorit3


So hat man seine Lieblings-Snippets immer zur Hand, egal auf welchem Rechner man arbeitet.

favorit1

favorit2 

Die neue Funktion steht nur für registrierte und eingeloggte Mitglieder zur Verfügung.

Noch nicht registriert? Für die Registrierung reicht eine gültige Emailadresse, sie ist kostenlos und unverbindlich.

WPF-Anwendung mit Splash Screen

17.03.2008 18:42:00 | Klaus Bock

Da ich für ein Projekt immer wieder Zugriff auf diverse Leistungsindikatoren brauchte, überlegte ich mir eine kleine Helfer-Anwendung zu schreiben. Wenn schon eine neue Anwendung warum nicht gleich mit WPF, so als kleine Übung. Das klappte auch recht gut. Nur fiel mir beim Ausführen der Anwendung in C# Express eine sehr lange Startphase auf. Also einen Release-Build erstellt die Anwendung direkt gestartet; mit dem gleichen Ergebnis. Zurück im Debugger, und einige Stopwatch-Auswertungen später, war klar dass das laden der Leistungsindikatoren in eine ObservableCollection<T> doch sehr lange dauerte.  Der unschöne Effekt dabei war, dass die Anwendung erst auf dem Desktop sichtbar wurde, nachdem alle benötigten Objekte geladen waren. Jetzt stelle ich mir einen Benutzer vor der auf die Verknüpfung der Anwendung klickt und nach 5 Sekunden ist immer noch nichts passiert. Wie das endet kann sich jeder selbst ausmalen. In diversen Foren konnte ich nachlesen dass dieses Verhalten bekannt ist. Meist wird empfohlen einen Startbildschirm während des Ladens anzuzeigen. Die Recherche zu dem Thema förderte die verschiedensten Möglichkeiten zu Tage. Meistens wurde zum laden einer Grafik mittels PInvoke geraten. Das mag zwar eine sehr schnelle Lösung im Startverhalten sein, aber nicht dass was ich wollte. Nach dem Durchforsten von vielen weiteren Lösungsansätzen bin ich auf diese Diskussion im MSDN-Forum gestoßen. Der Beitrag von TomGiam gefiel mir auf Anhieb. Vor allem bleibt bei seiner Lösung das Initialisieren des Splash Screen, die Interaktion mit diesem währen des Ladens der zeitintensiven Objekte, sowie das Laden der Hauptanwendung an einem Platz; in der App-Klasse. Die gesamte Interaktion, sowohl mit der SplashScreen- als auch mit der Window1-Klasse, wird sauber und Cross-Thread safe mittels Delegaten gehandhabt.

Auf diesem Konzept aufbauend habe ich die Lösung in meiner Anwendung realisiert und war erstaunt wie schnell der Splash Screen geladen wurde. Obwohl komplett auf WPF basierend. Im einzelnen ein WPF-Fenster mit ProgressBar und einem TextBlock zur Ausgabe der Statusmeldungen sowie einem Button um die Anwendung währen des Ladens abbrechen zu können.

Da der gesamte Ladevorgang in einer Methode in der App-Klasse abläuft, kann der Fortschritt sowie evtl. Statusmeldungen jederzeit auf dem Splash Screen ausgegeben werden. Wenn alle benötigten Objekte geladen wurden, können diese einfach an eine Überladung des Kontruktors der Window1-Klasse übergeben werden.

Mir gefiel diese Lösung so gut, dass ich mir eine Projektvorlage daraus erstellt habe. Für interessierte habe ich einmal das Konzept als C# Projekt angehängt sowie eine fertige Projektvorlage als MSI Installer. Den Installer habe ich für den Template-Pfad unter C# Express erstellt. Ob diese Pfad auch in Visual Studio stimmt, weiß ich nicht.

Über Rückmeldungen und Kritiken, in jeder Form, würde ich mich freuen.

Downloads:

WPF Splash Screen Projekt herunterladen

WPF Splash Screen Template herunterladen

Technorati-Tags: | |

Ich bin im Fernsehen ...

16.03.2008 18:34:49 | Albert Weinert

Nun ja, fast ... immerhin bewegte Bilder mit Ton in Farbe und bunt.

Einmal auf on10.net bei Lori Grosland, dort jedoch erst ab der 6. Minute, mit ein paar Informationen zum Afterlaunch.


Microsoft Launch 2008

Und ein paar Sätze von mir zum Einsatz beim "Ask-The-Experts" auf dem Microsoft Launch Event 2008 wo ich mich den knallharten Fragen von Katrin Letzel stellte.

http://channel9.msdn.com/Showpost.aspx?postid=387603

Problem bei der Verschlüsselung von app.config-Dateien in Netzwerk-Anwendungen bei unterschiedlichen Clients

13.03.2008 13:09:00 | Mario Meir-Huber

Der Microsoft Student Partner, Roman Schacherl (FH Hagenberg) ist auf ein sehr interessantes Problem bei der Verschlüsselung von ConnectionStrings mit verschiedenen Clients gestoßen. Der Lösungsansatz ist unten aufgelistet:

Diese Anleitung beschreibt die Verschlüsselung eines Connection Strings in der app.config einer .NET
2.0 Windows-Anwendung, die über das Netzwerk aufgerufen wird. Dabei ist es notwendig, den
privaten Schlüssel der Verschlüsselung auf den Client-Rechner zu übertragen – ansonsten ist keine
Entschlüsselung mehr möglich.
Unverschlüsselte Konfigurationsdatei
In der app.config-Datei steht im Abschnitt <connectionStrings> die Verbindung zur
Datenbank:

 

<connectionStrings>
 

<add name="testConnectionString" connectionString="Data Source=pc-roman;Initial Catalog=testdb;
user id=test_user;password=test_pwd"
providerName="System.Data.SqlClient" />


</connectionStrings>

 

Erstellen eines RSA-Schlüsselcontainers
Mit Hilfe des Tools aspnet_regiis wird ein neuer Schlüsselcontainer erstellt. Führen Sie
folgenden Befehl in einer Eingabeaufforderung im Ordner
„C:\Windows\Microsoft.NET\Framework\v2.xxx“ aus:

 

aspnet_regiis –pc "TestKeys" -exp

 

Hinzufügen eines ProtectionProviders
Fügen Sie unmittelbar vor dem Abschnitt <connectionStrings> folgenden
<configProtectedData>-Abschnitt hinzu, wobei das Attribut name der Name des
ProtectionProviders ist (später wichtig) und der keyContainerName der Namen des soeben
erstellten Schlüsselcontainers sein muss.

 

<configProtectedData>
<providers>
<add name="TestProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,
System.Configuration, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
processorArchitecture=MSIL"
keyContainerName="TestKeys"
useMachineContainer="true" />
</providers>
</configProtectedData>

 

Verschlüsseln der Konfigurationsdatei
Mit folgendem Sourcecode können Sie die Verschlüsselung der app.config bewirken. Der
Parameter der Methode OpenExeConfiguration muss dabei dem Pfad der exe-Datei und nicht
der exe.config-Datei entsprechen!

 

Configuration conf = ConfigurationManager.OpenExeConfiguration(exeFilename);
ConfigurationSection section = conf.GetSection("connectionStrings");
if (section != null)
{
if (!section.IsReadOnly())
{
section.SectionInformation.ProtectSection("TestProvider");
conf.Save();

 

Der Abschnitt <connectionStrings> in der Konfigurationsdatei ist nun verschlüsselt:

<connectionStrings configProtectionProvider="TestProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>humGLBAxftFdI0GnKsRjyd8gPWXAFtftnaLjc0e5Z/hs7G02icfMU7U9aqL5jiJV1KVCeO/Wm
xA6ihExMg64Gj7Fq9amDKA+V1asWo4JdACrdhNwhAARynycabICbVPW+MDV+aYglwejUe4OeEVY0fi+1xc+utK
L2HLJlDDrSgI=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>QV46wMOK2c78NM/ngakm1NZ54YhDdq4fsh2G+yMoe+kRTxE8aDAgbizM6FjfiPfAMAYD8CXWP
AEc0Mi2CSGPEdUB4AXPthDmyFJ53+5mf4ni9lYD6KAO61cmqKx5oUUGqE74mjDFVu4J+8mUTJr7I9YxcWf2IXl
qDM2PE3wGNWL5LmWE2t3Sl0UxSbIGFrEluVscWgoevnMPt39fOOW3R0AgrXEofwjCGlL6yEJKCwBQw297pGAWn
HjZ0bwOU64ebR4FHnl9twV8DRCZGF5Vq4sJIpBjwfe/THSprr0xuIeAD1T6R9CRB9leiMuQfBYHLS1B2nT5Nda
3GCkIEoTB1G0P9gt1sPl8nKmiWtNUN9U=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>

 

Die Anwendung ist lokal weiterhin lauffähig, solange der entschlüsselnde Rechner gleich
dem verschlüsselnden Rechner ist. Für die Entschlüsselung sorgt .NET automatisch. Um die
Anwendung auch über das Netzwerk lauffähig zu machen, muss zuerst der
Schlüsselcontainer exportiert und importiert werden.


Exportieren des Schlüsselcontainers
Zum Exportieren des Schlüsselcontainers in eine xml-Datei wird wieder das Tool
aspnet_regiis verwendet:

aspnet_regiis –px "TestKeys" "C:\test-keys.xml" -pri

 

Importieren des Schlüsselcontainers
Auf jedem Client, auf dem die Anwendung lauffähig sein soll, muss jetzt der
Schlüsselcontainer wieder importiert werden:

 

aspnet_regiis –pi "TestKeys" "C:\test-keys.xml"

 

Anschließend liegt der Connection String in verschlüsselter Form vor und wird beim Start der
Anwendung (auch über das Netzwerk) automatisch entschlüsselt.
Dabei muss hingewiesen werden, dass es sich nur um eine relativ einfache Sicherheitsmaßnahme
handelt – nachdem der Private Key bekannt ist, lässt sich relativ leicht ein kleines .NET-Programm zur
Entschlüsselung und Anzeige der Konfigurationsdatei im Klartext erstellen.
Zusätzlich zu den beschriebenen Maßnahmen muss die Codezugriffssicherheit am Client angepasst
werden, um die Ausführung der Anwendung über das Netzwerk überhaupt zu erlauben.

 

Gefunden von: Roman Schacherl - www.schacherl.info

TechDays'08 Ich komme...

13.03.2008 08:00:00 | Jürgen Gutsch


Da komme ich doch heute ganz unbekümmert ins Büro und finde auf meinem Schreibtisch einen Brief aus der Schweiz.

Inhalt: Ein Schreiben mit dem Betreff "Microsoft TechDays'08 Ihre Teilnehmerunterlagen" und ein im Schreiben integrierter Teilnehmerausweis zum selber Basteln.

Cool! Nicht nur das die Teilnehmerunterlagen angekommen sind, sondern auch wegen des interessanten, waabenartigen Etwas in der Mitte des Teilnehmerausweis, das sich nach näherer Betrachtung und nochmaligen Durchlesens des Schreibens als ein sogenannter BeeTagg (www.beetagg.com) entpuppte. (Wieder eine interessante Web 2.0 Idee)

Ich freue mich auf jeden Fall schon auf die zahlreichen Sessions, sowie die große Launch-Party am Mittwoch Abend, viele Gespräche und darauf viele bekannte Leute zu treffen. Unter anderem sind auch Thomas Huber und Peter Bucher aus ASP.NET Zone anwesend.

Richtig Zoomen in DeepZoom

12.03.2008 15:18:00 | Mario Meir-Huber

Nachdem ich die ersten Hindernisse von DeepZoom überstanden habe dachte ich mir ich werde es mal allen Lesern dieses Blogs mitteilen wie man richtig Zoomed in Silverlight. Hierfür ist lediglich ein Multiscale-Image notwendig, welches ein DeepZoom Image enthält. Dieses wird z.B. mit Deep Zoom Composer erstellt.

Des weiteren ist es noch wichtig, das die Dateien, welche für Deep Zoom verwendet werden sich im ClientBin Verzeichnis befinden (sonst gibt's ne Böse Runtime Exception)

Nun gehe ich mal davon aus das ein "+" und ein "-" auf der Tastatur für's zoomen verwendet wird. Hierfür brauchen wir lediglich einen KeyDown-Event auf der Seite.

Das MultiScaleImage Objekt enthält bereits einige nette Funktionen. So können wir mit ZoomAboutLogicalPoint sehr einfach Zoomen. Diese Funktion benötigt 3 Parameter:

  1. Zoomfaktor (1.0 ist 100% - es ändert sich also nichts; 2.0 würde bedeuten das es 2x so groß wird, ...)
  2. X Position (Position über welche gezoomed wird - X)
  3. Y Position (Position über welche gezoomed wird - Y)

Die 2 Positionen sind jeweils von 0.0 bis 1.0 - geben also einen Prozentsatz des MultiScaleImage-Objekts an. Um die korrekte Position zu erfragen müssen wir vorerst die Mausposition abfragen (am besten im MouseMove in eine Var. vom Typ Point geben). Danach müssen wir die Mausposition in einem Wert zwischen 0.0 und 1.0 umrechnen - entweder anhand der Page oder anhand des MultiScaleImage-Objekts, sollte dies nicht der Page-Größe entsprechen).

Die nun errechnete Position geben wir als X und Y an die ZoomAboutLogicalPoint-Funktion weiter. Hierfür ist jedoch noch eine weitere Berechnung notwendig: Da das Image ja größer/kleiner wird, ist man nicht zwangsweise in einem Bereich zwischen 0 und 1. Dies würde dazu führen das man immer weiter oben zoomed. Um dies zu korrigieren gibt es die "ElementToLogicalPoint" Funktion des MultiScaleImage-Objekts.

Das ganze sieht dann in etwa so aus:

void Page_KeyDown(object sender, KeyEventArgs e)
{
    double xpos = 1.0 / this.Width * zoomPosition.X;
    double ypos = 1.0 / this.Width * zoomPosition.Y;

    if (e.Key == Key.Add)
    {
        this.deepZoomObject.ZoomAboutLogicalPoint(1.1, deepZoomObject.ElementToLogicalPoint(zoomPosition).X, deepZoomObject.ElementToLogicalPoint(zoomPosition).Y);
    }
    if (e.Key == Key.Subtract)
    {
        this.deepZoomObject.ZoomAboutLogicalPoint(0.9, deepZoomObject.ElementToLogicalPoint(zoomPosition).X, deepZoomObject.ElementToLogicalPoint(zoomPosition).Y);

    }
}

 

Anmerkung: zoomPosition wird in MouseMove gesetzt.

Morgen werde ich dann über DeepZoom Drag&Drop berichten.

Silverlight 2 : Deep Zoom & Developer Referenz

11.03.2008 21:45:00 | Mario Meir-Huber

Eines der neuen Features von Silverlight 2.0 Beta 1 ist Deep Zoom. Dies stellt die Möglichkeit dar, sehr große Bilder zu skalieren und zu Zoomen. Das ganze funktioniert über ein MultiScaleImage-Objekt.

Im Web gibt es bereits einige äußerst interessante Beispiele, eines davon ist die Memorabilia des Hard Rock Café:

http://memorabilia.hardrock.com/

Weiters sehr interessant ist die Developer Referenz: Auch diese wurde mit einem MultiScaleImage realisiert.

http://joestegman.members.winisp.net/DeepZoom/

Wie inkrementiere ich meine Assembly Versionen automatisch mit TFS2008 ?

11.03.2008 17:36:16 | Christian Binder

Letztes Jahr hatte ich dieses Thema für TFS2005 hier behandelt.
Mit TFS2008 hat sich aber in MSBuild einiges geändert, so dass man kleinere Änderungen vornehmen muss, um den Pattern auch mit TFS 2008 nativ verwenden zu können.

Hintergrund ist, dass die ColumnName class deprecated wurde, welche das von mir verwendete Field BuildNumber bereitgestellt hat:

[ObsoleteAttribute("This class has been deprecated. Please remove all references.")]
public static class ColumnName

Im TFSBuild.proj muss man den GetBuildPropertiesTask verwenden, um an die BuildNumber zu kommen.
Hier ein Snip mit den nötigen Änderungen, die das TFSBuild.proj File aus dem oben referenzierten Eintrag ergänzen:


<Target Name="CheckSettingsForEndToEndIteration">

<!--for 2008 use the GetBuildProperties Task to get the BuildNumber -->
    <GetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)">
      <Output TaskParameter="BuildNumber" PropertyName="BuildNumber"></Output>
    </GetBuildProperties>

<!--  extract the BuildRevision -->
    <ExtractRevisionTask BuildNumber="$(BuildNumber)">
      <Output TaskParameter="BuildRevision" PropertyName="BuildRevision" />
    </ExtractRevisionTask>

<!--  update the AssemblyInfo Props -->
    <CreateProperty Value="$(BuildRevision)">
      <Output TaskParameter="Value" PropertyName="AssemblyRevision"/>
    </CreateProperty>
    <CreateProperty Value="$(BuildRevision)">
      <Output TaskParameter="Value" PropertyName="AssemblyFileRevision"/>
    </CreateProperty>

<!--  just needed if you populate the AssemblyDescription  too like in the sample  -->
    <CreateProperty Value="$(BuildNumber)">
      <Output TaskParameter="Value" PropertyName="AssemblyDescription"/>
    </CreateProperty>

</Target>

Das wars damit funktioniert es auch mit TFS2008.

Viel Spass

Chris

 

 

Visual Basic contra C# in der Office Entwicklung

10.03.2008 18:47:00 | Mario Meir-Huber

Gerade eben schreibe ich an einer kleinen Demo-Applikation, welche die Visual Studio Tools for Office 3.0 vorstellen soll. Dabei bin ich auf ein (in VB) kleines Beispiel in der MSDN Library gestoßen, welches die Stärke von Visual Basic in der Office Entwicklung klar aufzeigt. Das Problem von C# ist nämlich, das optionale Parameter nicht vorhanden sind.

Das Beispiel führt eine Rechtschreibkontrolle durch. Dabei benötigt man in Visual Basic ca. 5 Zeilen. In C# wird das mit 12 optionalen Parametern, welche jeweils mit "ref missing" angegeben wird doch ziemlich umfangreich.

Das ganze kann man am unteren Ende des Artikels in der MSDN nachlesen:

http://msdn2.microsoft.com/de-de/library/ms178794.aspx

Anmerkung:

bin stark für C#. VSTO Entwickle ich jedoch mit Visual Basic. Für viele andere Dinge verwende ich auch C#

Visual Basic: Endlich richtig Casten

06.03.2008 13:17:49 | Jan-Cornelius Molnar

In diesem Artikel werden VB Funktionen wie CType, DirectCast, CInt, CStr, ... betrachtet.

Ist Option Strict aktiviert, fordert der Visual Basic Compiler, dass man beim Zugriff auf Funktionen und Eigenschaften eines Objekts den Datentyp angibt.

Beispiel 1
1 Dim person1 As Person 2 person1 = New Person 3 Console.WriteLine(person1.Name) ' funktioniert 4 Dim person2 As Object 5 person2 = New Person 6 Console.WriteLine(person2.Name) ' Compilerfehler, da Name keine Eigenschaft von Object ist.

In diesem Beispiel müsste man zuerst das Objekt person2 in den Typ Person casten.

Was ist ein Cast?

Bei einem Cast eines Objekts o in den Typ T, teilt man dem Compiler mit, dass er das Objekt o nun als eine Instanz des Typs T betrachten soll.

Beispiel 2
1 Dim o As Object 2 o = New Person 3 ' o ist vom Typ Person, also kann man dies dem Compiler mitteilen 4 Dim p As Person 5 p = DirectCast(o, Person)

Hier wurde dem Compiler mitgeteilt, das Objekt o als Instanz des Typs Person zu betrachten. Nun kann man auf die Eigenschaften und Funktionen, die Person bereitstellt, zugreifen.

Beim Casten bleiben die zugrundeliegenden Daten unverändert, man ändert nur die "Sichtweise".

VBs DirectCast ist ein "pures" Casting, es findet also keine Umwandlung statt, und damit ist es equivalent mit dem C# Cast.

VB
Dim p As Person = DirectCast(o, Person)
C#
1 Person p = (Person)o;

Was ist eine Conversion?

Unter VB steht neben DirectCast noch das Schlüsselwort CType zur Verfügung. Dieses Schlüsselwort kann neben "purem" Casting auch noch Conversions also Umwandlungen durchführen.

Beispiel 3
1 Dim o As Object 2 o = "12" 3 Dim i As Integer 4 i = CType(o, Integer)

In diesem Beispiel wird der Variable o der Wert "12" zugewiesen, somit ist sie vom Typ String. Eine Umwandlung mit DirectCast zum Typ Integer würde einen Fehler erzeugen, da der zugrundeliegende Datentyp nicht Integer sonder String ist und somit noch eine Umwandlung erforderlich wäre.

CType wandelt also die zugrundeliegenden Daten (hier vom Typ String in Integer).

Alternativ zu CType stellt Visual Basic noch spezielle Konvertierungsschlüsselwörter wie CStr, CInt, CDbl, CDate, etc. (Im Folgenden C* genannt) zur Verfügung, die für die Umwandlung in die entsprechenden Datentypen zur Verfügung stehen. Diese sind kürzer als die CType Notation und sparen somit Tipparbeit.

Beispiel 4
1 Dim o As Object 2 o = "12" 3 Dim i As Integer 4 i = CInt(o)

Beim Umwandeln von primitiven Datentypen wie Strings, Integers, etc. werden sowohl CType als auch C* vom Compiler in Aufrufe von Microsoft.VisualBasic.Conversion umgewandelt.

image

Ein Aufruf von CType(o, String) bzw. CStr wird vom Compiler in Microsoft.VisualBasic.Conversions.Str(o) umgewandelt.

Neben den VB Spezifischen Umwandlungen stellt das .NET Framework mit der Convert Klasse eine für alle .NET Sprachen einheitliche Möglichkeit zur Verfügung Daten umzuwandeln.

Beispiel 4
1 Dim o As Object 2 o = "12" 3 Dim i As Integer 4 i = Convert.ToInt32(o)

Performancebetrachtung

Die Visual Studio Intellisense empfiehlt stets eine Umwandlung mittels CType oder C* ist dann DirectCast vollkommen unnötig?

Hier gilt es zwei Fälle zu unterschieden:

  1. Typen, die nicht IConvertible implementieren (idR. Refrenztypen: Controls, Forms, selbst definierte Klassen, Interfaces, etc.)
    In Beispiel 1 wurde eine Variable vom Typ Object, die eine Instanz des Person Typs enthält, gecastet. Da es sich hier um einen Referenz handelt und keine Konvertierung möglich ist, wird CType vom Compiler als DirectCast übersetzt. Es macht hier also keinen Unterschied CType oder DirectCast zu nehmen.
  2. Typen, die IConvertible implementieren (idR. Datentypen: Integer, Double, Date, ... aber auch String)
    Hier macht es einen deutlichen Unterschied ob man CType, C*, DirectCast oder Convert verwendet.
    Um Aussage etwas mit Zahlen zu unterlegen habe ich einen kleinen Benchmark geschrieben, der die Dauer in Millisekunden angibt, die es auf meinem System benötigt hat die gewünschte Operation 100.000.000 mal durchzuführen.

    image 

Für mich ergibt sich daraus

  • Wann immer möglich DirectCast verwenden, da es bis zu 10 mal schneller ist als CType.
  • Ist eine Umwandlung des zugrundeliegenden Werts notwendig, dann zeigen die Methoden der .NET Convert Klasse deutlich bessere Performance als die Conversion Methoden von Visual Basic, weshalb man CInt(o), etc. durch Convert.ToInt32(o), etc. ersetzten sollte.
    Ausnahme bilden hier CStr und CDate, die nicht in VisualBasic.Conversion vertreten sind, sondern direkt Methoden des Frameworks aufrufen.
  • Stellen die Datentypen also eigene Umwandlungsmethoden zur Verfügung wie Integer.Parse bzw. Object.ToString, dann sind diese zu empfehlen.

Ergebnis

Dieser Artikel hat gezeigt, dass die Empfehlung der Visual Studio Intellisense bequem ist und Schreibarbeit spart, jedoch auch Performanceeinbußen mit sich bringt. Der tatsächliche Verlust ist zwar von Anwendung zu Anwendung verschieden aber in einigen Fallen macht er sich sogar mit Faktor 10 bemerkbar.

Schade ist, dass die Implementierung der Visual Basic Conversion doch deutlich langsamer ist als die des .NET Frameworks. Grund dafür ist wahrscheinlich die Abwärtskompatibilität zu VB6 ...

Ich werde mich in Zukunft an DirectCast und Convert halten, was auch den Vorteil hat, dass C#-ler meinen Code leichter lesen können.

Source Code

Den verwendeten Source Code habe ich in diesem Beispielprojekt zusammengefasst.

http://www.dev-jc-vb.de/dev-jc-vb/blog/images/VisualBasicEndlichrichtigCasten_CF01/ConversionPerformance.zip

Mix08: Silverlight 2.0 Beta steht in den Startlöchern

04.03.2008 22:23:00 | Mario Meir-Huber

In den letzten Stunden herrschte ziemliche Aktivität in den Blogs von Silverlight.net - dies darauf zu schließen das Silverlight 2.0 Beta 1 demnächst erscheinen soll. Morgen beginnt die Mix. In der Keynote wird bestimmt nicht auf Silverlight verzichtet.

In der Zwischenzeit gibt es hier bereits einige Controls: http://michaelsync.net/2008/01/09/opensource-silverlight-20-controls-and-how-to-use-them

Ferner gibt es auf dem Silverlight-Blog einige Infos: http://geekswithblogs.net/lbugnion/archive/2008/03/04/mix08-random-pieces-of-news-3.aspx

Also, warten wir gespannt auf die neue Version ;)

Regeln | Impressum