.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Juli 2010

Silverlight Tipp der Woche: XML Namespace Definition

31.07.2010 19:06:00 | Stefan Lange

In diesem Tipp geht es um die Verwendung des XmlnsDefinition Attributs.

Zusammenfassung

Um eigene Controls in XAML Dateien verwenden zu können, kann man eine Namespace-Definition der Form xmlns:xyz="clr-namespace:MyNamespace;assembly=MyAssembly" verwenden. Es ist jedoch einfacher eigene Controls mit Hilfe des XmlnsDefinition Attributs zu verwalten.

Beschreibung

Controls, die nicht aus dem Default Namespace http://schemas.microsoft.com/winfx/2006/xaml/presentation stammen, benötigen eine XML Namespace-Definition, um in XAML Code verwendet werden zu können. Eine solche Definition bildet einen .NET CLR Namespace auf einen XML Namespace Präfix ab. In Silverlight 2 musste man dafür im Root-Element der XAML Datei ein Attribut mit folgendem Aufbau angeben:

<UserControl xmlns:xyz="clr-namespace:MyNamespace" ...>
- oder -
<UserControl xmlns:xyz="clr-namespace:MyNamespace;assembly=MyAssembly" ...>

Über den Präfix xyz kann man dann Controls aus dem angegebenen CLR Namespace und der entsprechenden Assembly verwenden. Wächst nun ein Projekt im Laufe der Entwicklung immer weiter an, verteilen sich die selbst geschriebenen Custom- und insbesondere User-Controls meist auf mehrere Namespaces und Assemblies. Dies führt zum einen zu vielen verschiedenen Namespace-Definitionen pro XAML Datei in der sie verwendet werden und zum anderen wird auch das Refactoring immer mühsamer.

Seit Silverlight 3 gibt es nun das aus WPF bekannte Attribut XmlnsDefinition, welches auf Assembly-Ebene das Mapping von XML Namespaces auf CLR Namespaces regelt.

[assembly: XmlnsDefinition("http://mycompany.com/xaml", "MyNamespace.Controls")]
[assembly: XmlnsDefinition("http://mycompany.com/xaml", "MyNamespace.Controls.Xyz")]

Dieses Attribut kann mehrfach vorkommen und steht typischerweise in der Datei AssemblyInfo.cs. Es stellt sicher, dass alle Controls aus allen aufgeführten Namespaces in einer XAML Datei über ein und dieselbe Url angesprochen werden können. Auch wenn die Controls aus verschiedenen Assemblies stammen, die jeweils ihre eigenen XmlnsDefinition Attribute haben, reicht jetzt eine einzige Namespace-Definition:

<UserControl xmlns:abc="http://mycompany.com/xaml" ...>
<abc:MyControl ...>

Die Url selbst kann beliebig gewählt werden und hat keine weitere Bedeutung, außer dass sie eindeutig sein muss.

Über das Attribut XmlnsPrefix kann man optional noch festlegen, welches der Default Namespace-Prefix sein soll, den ein XAML Designer-Tool automatisch vergibt, wenn das erste Control per Drag & Drop zu einem User Control hinzugefügt wird.

[assembly: XmlnsPrefix("http://mycompany.com/xaml", "abc")]

Microsoft verwendet beispielsweise in Silverlight 4 den Präfix toolkit für Controls aus dem Silverilght Toolkit.

Ausnahmen

Theoretisch könnte man so vollständig auf die Schreibweise mit clr-namespace verzichten, gäbe es nicht eine Ausnahme. Wenn man in einer XAML Datei ein Control verwenden möchte, welches aus der selben Assembly stammt wie die XAML Datei, muss für dieses Control eine clr-namespace basierte Definition verwendet werden. Oder anders ausgedrückt: Die Url basierte Namespace Definition funktioniert nur für Controls, die aus referenzierten Assemblies stammen. Controls aus der eigenen Assembly werden leider nicht gefunden und ein Fehler angezeigt. Meiner Ansicht nach ist das ein Bug im XAML Parser, da ich keinen Grund sehe, warum dies "by Design" so sein sollte.

Hier geht's zum nächsten Tipp.

Silverlight Tipp der Woche

31.07.2010 19:05:00 | Stefan Lange

In mehr als zwei Jahren Einsatz von Silverlight in ganz unterschiedlichen Projekten habe ich jede Menge Erfahrungen gesammelt und hatte viele große und kleine Probleme zu lösen. Wenn ich davon erzähle, höre ich oft, dass auch andere einen nicht unerheblichen Teil ihrer Zeit mit dem "Herausfinden von Dingen" verbringen. Daraus ist nun die Idee entstanden, die interessantesten Erfahrungen aufzuschreiben und hier regelmäßig als Silverlight Tipp der Woche zu veröffentlichen.

Der Aufbau der Tipps wird so gestaltet, dass es für den Leser möglichst einfach ist zu entscheiden, ob die jeweilige Information für ihn von Interesse ist oder nicht. Daher gibt es jeweils am Anfang eine nur wenige Sätze lange Zusammenfassung, in der die wesentliche Aussage des Tipps beschrieben wird. Danach kommen dann weitere Erläuterungen, sowie ggf. Hintergrundinformationen und Links.

Hier geht's zum ersten Tipp.

WICHTIGE Vorankuendigung: Ausserplanmaessiges Microsoft Sicherheitsupdate am 02.08.2010

31.07.2010 13:22:36 | Kay Giza

Die Sicherheit seiner Kunden und Partner ist für Microsoft ein vordringliches Anliegen. Um diese beim sicheren Betreiben Ihrer IT-Infrastruktur bzw. ihres Computers optimal zu unterstützen, wird Microsoft voraussichtlich am nächsten Montag, den 2. August 2010, gegen 19:00 Uhr Mitteleuropäische Zeit eine außerplanmäßige Sicherheitsaktualisierung (Out of Band Release to address Microsoft Security Advisory 2286198 welches diese Microsoft-Sicherheitsempfehlung (2286198) betrifft) veröffentlichen. Diese wird, soweit mein Kenntnisstand, alle unterstützten Versionen von Microsoft Windows betreffen. Solche außerplanmäßigen Sicherheitsupdates werden von Microsoft nur aus wichtigen Gründen veröffentlicht und sollten daher umgehend installiert werden. Diese Vorabinformation soll Ihnen helfen, die außerplanmäßigen Sicherheitsaktualisierungen auch in Ihrem Unternehmen bzw. auf Ihrem Privat Computer möglichst rasch zum Einsatz zu bringen... [... mehr Details in diesem ausführlichen Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

UML mit VS 2010 Webast Serie

31.07.2010 08:16:38 | Thomas Schissler

TDD als Erziehungsmaßnahme

30.07.2010 16:36:00 | Christoph Tohermes

In meinem ersten Eintrag im neuen Blog möchte ich mal etwas theory crafting betreiben und mich dem Thema TDD von einer etwas anderen Seite nähern.

Mittlerweile ist es 3 Monate her seitdem ich angefangen habe mich ernsthaft mit TDD zu beschäftigen. Eine zugegebenermaßen noch recht kurze Zeit. Trotzdem habe ich einige Interessante Erfahrungen gewonnen und Eindrücke gesammelt.
Zunächst einmal ist es eine gewisse Hürde Test first zu entwickeln. Es erfordert umdenken und das Umstellen gewohnter Entwicklungsprozesse. Das ist ein Fakt. Es erfordert Mühe und Einarbeitungszeit bis man wirklich den Prozess verinnerlicht hat und die Produktivität nicht mehr allzu viel leidet. Ein von Kritiker sehr häufig genutztes Argument: "Ich verliere sehr viel Zeit." Unstrittig ist jedoch wiederum, das automatisierte Tests heute zu einem de facto Standard geworden sind. Ohne automatisierte Tests kommt eigentlich kein Entwickler mehr aus. Dies führt in eine Zwickmühle: Der Entscheidung zwischen Produktivität auf der einen und Qualität auf der anderen. Es gilt also, den goldenen Weg zu finden, der das Ziel dem Kunden ein solides Endprodukt zur Verfügung zu stellen am besten Unterstützt. Denn: Hier drum geht es immer noch; dem Kunden das Projekt zu liefern das er möchte.

 Eine Art damit umzugehen hat Thomas Bandt im Artikel über "seinen TDD Alltag" beschrieben. Er testet (um es einmal auf das wesentliche zu reduzieren) nur noch Business Logik. Einfache alltägliche Dinge kann man einfacher in Integrationstest testen. Das gewährleistet notwendige Qualität und steigert die Produktivität. Ralf Westphal wiederum vertritt (etwas überspitzt gesagt) die Meinung, dass es keine alternative zu komplett test first getriebener Entwicklung gibt. Seine Argumente sind so einfach wie überzeugend: Qualität, hoher grad von Automatisierung, Evolvierbarkeit. Diese unterschiedlichen Meinungen bieten viel Diskussionsstoff. Ich möchte hier gar nicht so darauf eingehen, was nun der bessere Weg ist.

Nichts ist so wertvoll, wie Erfahrung

Obgleich diese Diskussion sehr spannend ist und es natürlich auch richtig ist diese zu führen, bin ich sicherlich nicht der einzige, der das Gefühl hat, dass das Thema ein zu hohes Gewicht bekommt. TDD ist nur ein Tool zur Qualitätssteigerung. Wenn auch ein sehr effizientes. Es gibt noch andere Möglichkeiten, den meisten ist das natürlich bewußt. Gleichzeitig wird eine interessante Komponente von TDD übersehen: Der, ich taufe es mal, Erziehungseffekt. Wer sich intensiv mit TDD beschäftigt setzt automatisch viele Werte der CCD um, als Beispiel: KISS. Das ist der erste positive Effekt, denn das CCD etwas gutes ist, darüber sind sich wohl alle einig. Gleichzeitig liefert uns korrekt durchgeführtes TDD doch aber auch ein Gefühl für Edge cases. Die Grenzfälle, die unser Programm oftmals vor schwierige Herausforderungen stellen. Mit der Zeit bedenkt man diese Fälle fast automatisch. Wie selbstverständlich werden die passenden Tests für diese Fälle mit erstellt. Darüber hinaus bekommen wir weiterhin ein Gefühl für Fehler.
Der typische Prozess Red-Green-Refactor zwingt das Programm ja zunächst zu "Fehlern". Zug um Zug implementiere ich Feature um Feature. Ich verinnerliche eine Thematik, die für den Entwicklungsprozess besonders wichtig ist.

Meine Beobachtung bzw. These ist nun folgende:
TDD verbessert meine Codequalität auch dann, wenn ich in einem späteren Projekt nicht mehr für jede Komponente einzelne Tests entwerfe, bzw. diese nicht test first entwickle, da ich durch TDD dazu erzogen wurde, bestimmte Fehlerfälle von vorneherein zu bedenken. Das Thema "Fehler" hat durch meine Erfahrungen einen anderen Stellenwert, es ist präsent. Natürlich geht auch dies mit der Zeit verloren, wenn man sich mit TDD für einen gewissen Zeitraum beschäftigt und es danach links liegen lässt. Auch der falsche Ansatz.

Wenn ich jedoch wo möglich TDD verwende, bin ich der festen Überzeugung, dass es auch die Projekte beeinflusst, wo aus welchen Gründen auch immer, kein TDD möglich oder gewünscht ist. Seien es nun die angesprochenen Preisgründe, Brownfield-Projekte, usw.
Meine bisherige Arbeit mit TDD spiegelt genau diese Sichtweise wieder. In meinem Projekt entwickle ich nicht nach TDD. Im Coding Dojo und zu Hause in meinen Projekten wiederum schon. Die während der mit TDD gemachten Erfahrungen kommen mir nun auch in den "business" Projekten zugute. Mein Code ist durch die implizite Anwendung von TDD besser geworden. Es ist nun keine Patentlösung TDD zu nutzen oder nicht zu nutzen. Doch finde ich zeigt dies doch auf, dass eben schon das nachdenken über den TDD Prozess mich in der Entwicklung ohne dieses Tool weiterbringen kann. Denn bei allem was man hier tut sollte die wichtigste Voraussetzung sein nachzudenken. Zu reflektieren wie sind meine Anforderungen, welche Werkzeuge brauche ich. Wie hole ich das Optimum aus diesem Projekt.

Und da bleibt für mich ein Fazit: Ich kann mich durch TDD dazu erziehen besseren Code zu schreiben, da sich meine Denkweise ändert. Selbst wenn ich TDD als Tool bei Projekten danach weglasse.

Mich würde an dieser Stelle wirklich interessieren wie Eure Erfahrungen bei diesem Thema sind und was ihr zum "Erziehungseffekt" zu sagen habt. Ist es schwachsinn was ich hier schreibe, entspricht es auch euren Erfahrungen, oder geht euch die ganze TDD Diskusison mittlerweile auf den Keks? Ich freue mich auf eure Kommentare.

Internal Adaption: TFS 2010 Team Build baut EndtoEnd Visual Studio

30.07.2010 15:13:18 | Christian Binder

Brian Harry hat auf seinem Blog alle Details zu diesem Meilenstein beschrieben, da wir ja auch mit TFS 2010 den Workflow auf WF4 umgestellt haben :-)

Der wichtigste Punkt dabei ist, dass wir das GatedCheck-In Feature in TFS 2010 entsprechend weiterentwickelt haben, so dass nun auch mehrere Checkins gleichzeitig via Gated Checkin eingecheckt werden können. Dies war notwendig, da der Visual Studio EndtoEnd Build halt nicht in 10min erledigt ist und somit das ganze nicht skaliert. Smart ist, dass im Fehlerfall alle Checkins automatisch einzeln behandelt werden und nur der Checkin, der den Fehler erzeugt zurückgewiesen wird. Zudem hat Brian angekündigt, dass diese Features in der nächsten TFS Version enthalten sein werden :-)

Chris

Silverlight: Set Focus to selected item in Listbox

30.07.2010 14:01:00 | Patric Schouler

If you want to set the focus to the selected item in your Silverlight Listbox Control you have to use this dirty trick:

   1: int selectedIndex = itemsListBox.SelectedIndex;
   2:                itemsListBox.SelectedIndex = 0;
   3:                itemsListBox.Focus();
   4:                itemsListBox.SelectedIndex = selectedIndex;

Silverlight: DataGrid and Comboxbox with MVVM

30.07.2010 13:59:00 | Patric Schouler

If you are using a MVVM pattern with a view model you have generally the problem to bind a combobox inside a Datagrid because you cannot access the data context of your view by referencing with the elementname syntax. The trick to bind your Comboxbox inside a DataGridTemplateColumn is to define the reference to your viewmodel with a StaticResoucre and use this for the DataContext-Binding and combobox-Binding:

StaticResoucre of the viewmodel
   1:  
   2:     <controls:ChildWindow.Resources>
   3:         <ViewModels:SettingsViewModel x:Key="SettingsViewModel" />
   4:     </controls:ChildWindow.Resources>
Binding the view to your viewmodel
   1: <Grid x:Name="LayoutRoot" Margin="2" DataContext="{StaticResource SettingsViewModel}">
Combobox-Binding in the Datagrid
   1: <sdk:DataGridTemplateColumn.CellEditingTemplate>
   2:     <DataTemplate>
   3:         <ComboBox ItemsSource="{Binding Gesellschaften,Source={StaticResource SettingsViewModel}}" 
   4:                   DisplayMemberPath="Name" SelectedValue="{Binding GesellschaftId, Mode=TwoWay}" 
   5:                   SelectedValuePath="GesellschaftId"  />
   6:     </DataTemplate>
   7: </sdk:DataGridTemplateColumn.CellEditingTemplate>

ApplicationPoolIdentity des IIS 7.x als SQLServer-Login verwenden

30.07.2010 13:50:00 | Alexander Zeitler

Entwickelt man eine ASP.NET (MVC) Website mit dem ASP.NET Development Server und hat eine SQL Server Datenbank im Einsatz, funktioniert zunächst alles problemlos.

Verwendet man jedoch für die Entwicklung einen “echten” IIS 7.x, also z.B. unter Windows 7, erhält man bei Datenbankzugriffen die folgende Exception:

Cannot open database requested by the login. The login failed. Login failed for user IIS APPPool


Die Lösung ist ziemlich einfach – man muss die Application Pool Identity “IIS APPPOOL\mvcapp” zu den Usern in der Datenbank zuweisen.

Leider klappt dies mit dem SQL Server Management Studio nicht.

Man kann zwar den Namen der Applicationpool Identity einfügen

Benutzer auswählen

und durch “Check Names” validieren lassen

Benutzer validieren

Nach dem Klick auf “OK”, erhält man jedoch die Fehlermeldung, dass der User nicht gefunden wurde:

Create failed for Login

Abhilfe schafft die Generierung des Logins via Script:

CREATE LOGIN [IIS APPPOOL\mypool] FROM WINDOWS WITH DEFAULT_DATABASE=[master] USE [mydatabase] CREATE USER [IIS APPPOOL\mypool] FOR LOGIN [IIS APPPOOL\mypool]

Danach kann man im SQL Server Management Studio die Berechtigungen zuweisen, so dass die Website mit der Application Pool Identity funktioniert.

DotNetKicks-DE Image

msdn tv–Nachrichten für Entwickler (Ausgabe 12/2010)

29.07.2010 15:57:17 | Jan Schenk

Get Microsoft Silverlight


Hier spricht der Chef: Frank Fischer, langjähriger Manager der deutschen „Technical Developer Evangelists“, kümmert sich künftig bei Microsoft Deutschland ums Thema „Mobile Communications“. Im Gespräch mit msdn tv-Moderator Jan Schenk berichtet er über sein neues Aufgabenfeld und die Herausforderungen, die ihn dort erwarten.
In den Kurznachrichten: Infos zu den Siegern des diesjährigen Imagine Cup-Wettbewerbs und zu einer neuen Anleitung des Patterns & Practices Teams von Microsoft mit dem Titel „Developing Applications for SharePoint 2010“, die in der MSDN Library abrufbar ist. Außerdem: News zur Beta-Version der Windows Phone Developer Tools, zu „Web Matrix“, einem Tool zur Erstellung, Anpassung und Veröffentlichung von Websites, das ebenfalls als Beta bereitsteht, und zu einem neuen Fachbuch von Microsoft Press mit dem Titel „PHP programmieren unter Windows - Webanwendungen mit IIS, SQL Server, Active Directory, Exchange“, in das Sie in der „PressPreview“ hier bei MSDN Online bereits hineinschnuppern können: als PDF- und XPS-Dokument ist dort das Kapitel „Einrichten von Active Directory“ abrufbar.


msdn tv ist ein neues Video-Nachrichtenformat, und hat seinen Ursprung auf MSDN Online (http://www.msdn-online.de/msdntv/). Alle zwei Wochen präsentiert Ihnen Jan Schenk, Developer Evangelist mit Hut, die wichtigsten Neuigkeiten für Entwickler, Hintergrundberichte und Interviews zu aktuellen Technologien sowie Highlights von Messen und Konferenzen. Das ganze kompakt, in ca. 15 Minuten erfrischend jung verpackt , und sowohl als Download für Ihren Rechner oder im Online-Player per Streaming verfügbar.

msdn tv is a German-speaking new and innovative video news series, and has originally been featured exclusively on the German MSDN Online Platform (http://www.msdn-online.de/msdntv/). Hatted Developer Evangelist Jan Schenk biweekly presents latest news for developers, background-stories and interviews concerning current and upcoming technologies, as well as video-highlights from fairs and conferences. Packed into 15 minutes, these news videos feature a fresh informative style, and are downloadable as well as available as online streaming video.

REST mit WCF 4.0: Conditional GET und ETag-Unterstützung

28.07.2010 19:54:58 | Manfred Steyer

Mit Conditional GET wird ein durch das HTTP-Protokoll unterstützter Mechanismus bezeichnet, der es Clients erlaubt, Dokumente lediglich unter der Bedingung, dass sie sich seit dem letzten Aufruf geändert haben, anzufordern. Hat sich das Dokument nicht geändert, antwortet der Server mit dem Statuscode 304 (Not Modified). Ansonsten wird das geänderte Dokument zurückgeliefert.

Um entscheiden zu können, ob sich ein Dokument geändert hat, sendet der Server mit den einzelnen Antworten einen sogenannten Entity Tag (ETag). Dieser beinhaltet einen Wert, welcher die aktuelle Version repräsentiert. Dabei kann es sich zum Beispiel um eine Versionsnummer, einen Zeitstempel oder einen Hashwert handeln. Bei weiteren Anfragen, welche sich auf dasselbe Dokument beziehen, sendet der Client diesen Wert an den Server zurück. Durch einen Vergleich mit dem aktuellen ETag kann dieser somit entscheiden, ob der Client bereits die aktuelle Version hat oder ob sich das Dokument seit dem letzten Abrufen geändert hat.

Ein Beispiel für die serverseitige Implementierung von Conditional-Get findet sich im nachfolgenden Listing. Nachdem der angeforderte Flug geladen wurde, wird dessen ETag, welcher im betrachteten Listing der Eigenschaft Version entspricht, ermittelt. Mit der Methode CheckConditionalRetrieve wird anschließend geprüft, ob dieser ETag dem eventuell vom Client mitgesendeten ETag entspricht. Falls dem so ist, löst diese Methode eine WebFaultException mit dem Http-Statuscode 304 (Not Modified) aus. Ansonsten wird der aktuelle ETag mit der Methode SetETag definiert. Somit wird festgelegt, dass dieser im Zuge der Antwortnachricht zum Client gesendet werden soll. Danach wird der gewünschte Flug zurückgeliefert.


public Flug FindFlight(string flugNummer)
{
Flug flug = […] // Flug laden
string etag = flug.Version.ToString();
WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(etag);
WebOperationContext.Current.OutgoingResponse.SetETag(etag);
return flug;
}







Dieser Eintrag ist ein Auszug aus meinem aktuellen Buch .Net 4 Update , das ich zusammen mit Holger Schwichtenberg verfasst habe.




Das nächste Listing zeigt eine zur gerade betrachteten serverseitigen Implementierung passende Implementierung eines Clients. Im Feld lastETag wird der ETag des letzten Abrufs festgehalten. Die gewünschte Resource wird unter Verwendung von WebRequest und WebResponse abgerufen. Über den Header-Eintrag If-None-Match wird der letzte bekannte ETag an den Client gesendet. Dieser Eintrag legt fest, dass die angforderte Resource nur dann an den Client gesendet werden soll, wenn sie sich seit dem letzten Abruf geändert hat. Mit GetResponse wird die Antwort des Servers abgerufen. Kommt es dabei zu einer WebException, wird geprüft, ob es sich beim übermittelten HTTP-Statuscode um den Wert 304 (Not Modified) handelt. Ist dem so, wurde das Dokument in der Zwischenzeit nicht geändert. Ansonsten ist ein (anderer) Fehler aufgetreten. Wurde die Resource zum Client gesendet, wird sie unter Verwendung des DataContractSerializer in ein Objekt übergefürt.


[…]
private static string lastETag = null;

private static void FindFlight()
{
WebRequest request;
WebResponse response = null;

request = WebRequest.Create("http://localhost:4924/FlugService.svc/flight/LH0815");

if (!string.IsNullOrEmpty(lastETag))
{
request.Headers["If-None-Match"] = lastETag;
}

try
{
response = request.GetResponse();
}
catch (WebException e)
{
HttpWebResponse r = e.Response as HttpWebResponse;
if (r.StatusCode == HttpStatusCode.NotModified)
{
Console.WriteLine("Keine Änderung!");
}
else
{
Console.WriteLine(e.Message);
}
return;
}

lastETag = response.Headers["ETag"];

DataContractSerializer s = new DataContractSerializer(typeof(Flug));
Flug f = (Flug)s.ReadObject(response.GetResponseStream());

Console.WriteLine(f.FulgNummer + ", Version: " + f.Version);
}

Erstellung einer StartRemoteProcess-Build-Activity

28.07.2010 16:10:00 | Martin Hey

Die neuen Build-Workflows für den Team Foundation Server sind ein cooles Feature. Und wenn man Standard-Projekttypen verwendet funktioniert das auch alles super, da in den meisten Fällen Copy&Paste-Deployment ausreichend ist.
In meinem Anwendungsfall war es notwendig, am Ende des Builds eine Activity auszuführen, die auf einem Remote-Server (z.B. Integrationssystem) einen Prozess startet. Eine solche Activity habe ich im Standard nicht gefunden. Daher hab ich selbst eine geschrieben.
Eine eigene Activity zu erstellen ist gar nicht so schwer. Einen guten Einstieg geben die Posts von Jim Lamb und Ewald Hofman. Bei der Entwicklung der Activity hat sich die Projektaufteilung von Ewald als sehr praktisch erwiesen. Nur so war es mir möglich, die selbst erstellte Activity dem Workflow dann auch hinzuzufügen.
Um einen Prozess zu starten, sind folgende Informationen notwendig:
  • Name oder IP-Adresse des Remote-Servers
  • auszuführendes Command
  • Credentials (abweichend vom TFS-Service-Account)
Daher erhält die Activity in Summe fünf Input-Argumente: Command, RemoteMachine, Domain, UserName und Password. Damit sieht der Rumpf der Actitvity wie folgt aus:
[BuildActivity(HostEnvironmentOption.All)]
public sealed class StartProcessOnRemoteMachine : CodeActivity
{
[RequiredArgument]
public InArgument<string> Command
{
get;
set;
}

[RequiredArgument]
public InArgument<string> RemoteMachine
{
get;
set;
}

[RequiredArgument]
public InArgument<string> Username
{
get;
set;
}

[RequiredArgument]
public InArgument<string> Password
{
get;
set;
}

[RequiredArgument]
public InArgument<string> Domain
{
get;
set;
}
}
Bei der Implementierung sollte man sich überlegen, so sensible Daten wie Credentials ggf. anders abzubilden als per Input-Parameter - für dieses Beispiel soll diese Lösung aber ausreichend sein, damit es nicht zu komplex wird. Die eigentliche Arbeit übernimmt dann die im folgenden dargestellte Methode ExecuteProcessOnRemoteMachine, die per WMI einen Prozess auf einem anderen Rechner startet. Dazu ist es notwendig, die Assembly System.Management zu referenzieren.
private static void ExecuteProcessOnRemoteMachine(string remoteMachine, string username, string password, string domain, string commandLine)
{
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Authority = "ntlmdomain:" + domain;
connectionOptions.Username = username;
connectionOptions.Password = password;
connectionOptions.Authentication = AuthenticationLevel.Default;
connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
connectionOptions.EnablePrivileges = true;

ManagementScope managementScope = new ManagementScope(string.Format(@"\\{0}\ROOT\CIMV2", remoteMachine), connectionOptions);
managementScope.Connect();

ManagementPath managementPath = new ManagementPath("Win32_Process");
ManagementClass processClass = new ManagementClass(managementScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
inParams["CommandLine"] = commandLine;

ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);
}
Der Rest ist trivial: In der Methode Execute werden die Input-Parameter entgegengenommen und an die Methode ExecuteProcessOnRemoteMachine übergeben.
protected override void Execute(CodeActivityContext context)
{
string startProcessCommand = context.GetValue(this.Command);
string remoteMachine = context.GetValue(this.RemoteMachine);
string username = context.GetValue(this.Username);
string password = context.GetValue(this.Password);
string domain = context.GetValue(this.Domain);


ExecuteProcessOnRemoteMachine(remoteMachine, username, password, domain, startProcessCommand);
}
Die Activity wird nun in den Workflow eingebunden und die notwendigen Daten bereitgestellt.
Am Ende des Builds werden nun die Dateien aus dem DropFolder genommen und mittels der Standard-Activity CopyDirectory auf den Integrationsserver kopiert. Die neu erstellte Activity führt dann die Installation durch.

Global Assembly Cache reloaded

28.07.2010 07:07:00 | Martin Hey

Das .NET Framework 4 ist nun schon ein paar Tage alt und abgesehen von tollen neuen Features bringt es auch einige gewöhnungsbedüftige Sachverhalte mit sich. Einer davon ist die Änderung im Global Assembly Cache.
Wer bisher die Fusion-Ansicht des Global Assembly Cache verwendet hat und per Drag & Drop Assemblies installiert hat, wird bemerken, dass alle neuen Assemblies sich nicht mehr installieren lassen, obwohl keine Fehlermeldung erscheint. Installiert man die Assemblies hingegen per gacutil, so wird man feststellen, dass zwar eine Erfolgsmeldung kommt, aber unter C:\Windows\assembly keine Veränderung geschieht.
Woran liegt das? Mit dem .NET Framework 4 gab es einige Änderungen im Konzept des GAC. Hier ein kurzer Auszug aus der MSDN:
In .NET Framework 4.0, the GAC went through a few changes. The concept of placing assemblies into a global directory began in CLR v1.1. In case of .NET Framework 1.1 (which had CLR v1.1) and .NET Framework 2.0 (which had CLR 2.0), the GAC was split into two, one for each CLR. This avoided the leaking of assemblies across CLR versions. For example, if both .NET 1.1 and .NET 2.0 shared the same GAC, then a .NET 1.1 application, loading an assembly from this shared GAC, could get .NET 2.0 assemblies, thereby breaking the .NET 1.1 application.
The CLR version used for both .NET Framework 2.0 and .NET Framework 3.5 is CLR 2.0. As a result of this, there was no need in the previous two framework releases to split the GAC. The problem of breaking older (in this case, .NET 2.0) applications resurfaces in Net Framework 4.0 at which point CLR 4.0 released. Hence, to avoid interference issues between CLR 2.0 and CLR 4.0, the GAC is now split into private GACs for each runtime.
Zusammengefasst bedeutet das, dass der GAC nicht mehr für alle Assemblies C:\Windows\assembly ist, sondern dass dort alle Pre-Framework-4-Assemblies liegen. Alle neuen Assemblies liegen im Assembly-Ordner des .NET-Frameworks (also z.B. C:\Windows\Microsoft.NET\assembly).


Für mich erklärt der MSDN-Auszug nun nicht ganz, warum hier ein anderer Ordner notwendig war, der sich auch noch anders verhält als der bisherige (s. Bild) - irgendwie hatte man sich ja schon an die Fusion-Ansicht gewöhnt. Für mich bleiben bei der aktuellen Implementierung viele Fragen offen:
  • Hätte man nicht unter C:\Windows\assembly noch eine Ordnerebene einführen können, die die Frameworkversion widerspiegelt?
  • Weshalb hat der neue GAC keine Fusion-Ansicht, in der so wichtige Informationen wie der Public-Key-Token und die Culture auf einen Blick sichtbar sind?
  • Weshalb kann die Fusion-Ansicht im alten GAC per Drag & Drop nicht selbstständig in die richtigen Ordner installieren?
  • ....
Glücklich bin ich mit der jetzigen Lösung nicht, aber ich werde mich - wie viele andere - damit auch arrangieren. Und vielleicht kommt ja noch ein Update oder ServicePack, das alles wieder schön macht.

Globale Namespaces für die Razor-Syntax und den ASP.NET WebPages

28.07.2010 01:33:29 | Albert Weinert

Wenn man bei WebForms nicht auf jeder Page oder jedem UserControl die notwendigen Namespace importieren möchte. So hat man diese in der Web.config hinterlegt.

Dies funktioniert wunderbar bei WebForms und der WebForm-ViewEngine unter ASP.NET MVC.

Mit den neuen WebPages (.cshtml) und der Razor-Syntax kann man mit

@using Regularly.Models
@using Regulary.Areas.Administration.Models

auch entsprechende Namespaces der Template bekannt machen, Jedoch funktioniert der Weg über die web.config nicht (ob sich dies ändert steht wohl nicht nicht fest).

Aber man einen anderen Weg gehen, dazu muss man beim Application-Start über die Klasse CodeGeneratorSettings die Namespaces hinzufügen.

CodeGeneratorSettings.AddGlobalImport("Regularly.Models");
CodeGeneratorSettings.AddGlobalImport("Regularly.Extensions");

Diese Klasse befindet sich im Namespace Microsoft.WebPages.Compilation

03.08.10 Treffen der .NET Developer Group Braunschweig - Better "Results" with ASP.NET MVC

27.07.2010 13:35:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 03.08.2010 um 19:00 im Restaurant Zucker (Tagungsraum). Uns kommt Daniel Fisher mit einem Vortag über ASP.NET MVC besuchen.

Abstract:

Mit ASP.NET MVC ist ein völlig neues Konzept am Markt, mit dem Ergebnisse nicht nur im HTML-Format an den Browser ausgeliefert werden können. In dieser Session wird unter Anderem gezeigt, wie eine WebAnwendung Informationen für JavaScript nutzbar macht, Termine und Kontaktdaten für Outlook und Co. bereitstellt. Ein Muss für jede WebAnwendung die die interagiert oder selbst als Mash-up fungiert.

Bio:

Daniel Fisher ist Mitbegründer der Firma devcoach® (www.devcoach.biz), die Unternehmen beim Einsatz der Microsoft® .NET Plattform in konkreten Projekten von der Architektur bis zum Deployment ganzheitlich unterstützt und begleitet.

Im Mittelpunkt seiner Arbeit stehen Service-Orientierung (SOA), agile Methoden und Prozesse, das Web und Datenzugriff. Er ist ein ausgewiesener Experte im SOA-Umfeld und plant und realisiert seit mehreren Jahren verteilte Systeme auf der Microsoft Plattform.

Daniel ist einer der Windows Communication Foundation (WCF) -Experten der ersten Stunde und war Mitglied im Technical Adoption Program der Microsoft Corporation. Für das Bundesamt für Sicherheit in der Informationstechnik (BSI) hat er zusammen mit Michael Willers (Projectlead) eine umfangreiche Sicherheits-Analyse durchgeführt und praxiserprobte Leitfäden für den Umgang mit WCF im Projektalltag entwickelt. Als Experten zum Thema „SOA mit .Net“ bereisten sie im Auftrag von Microsoft den europäischen Kontinent, um bei Workshops mit Architekten aus aller Welt deren Anforderungen zu diskutieren und bei der Implementierung von konkreten Lösungen zu beraten.

Daniel entwickelt seit 1995 Software (seit 1999 auf der .NET Plattform) und verfügt über Projekterfahrung als Entwickler, Architekt, Projektleiter und Berater aus den Branchen Versicherung, Großhandel, Mobilfunk und Bankwesen.

Er ist Leiter der .NET-Entwickler-User-Group Niederrhein (www.netug-niederrhein.de) und Vorstand der JustCommunity e.V. (www.justcommunity.de), dem Veranstalter des größten regionalen Community-Events für Software-Entwickler und IT-Professionals (www.nrwconf.de). Sie finden sein Blog unter lennybacon.com.

 

Wie immer ist dieses Event kostenlos und jeder .NET Interessierte ist herzlich willkommen!

Weitere Informationen zur DNUG Braunschweig findest du hier.

Silverlight: Paging für DataGrid oder andere Steuerelemente

27.07.2010 11:01:24 | Gregor Biswanger

Die Übersichtlichkeit geht verloren wenn zu viele Daten bei einem DataGrid, ListBox oder anderen Controls dargestellt wird. Nicht nur das, es kann zu Performance Problemen kommen. Silverlight rendert wie bei einem Daumenkino (oder auch Film) mehrere Bilder die Sekunde (Frames) um die Oberfläche darstellen zu lassen. Wenn der Inhalt kürzer gehalten wird, kann die Oberfläche selbstverständlich schneller reagieren. Dazu gibt es das altbekannte Paging um Dateninhalte auf mehrere Seiten zu unterteilen.

Ab Silverlight 3 gibt es das DataPager-Steuerelement. Dieses muss explizit an einer PagedCollectionView gebunden werden. Alle anderen Steuerlemente die den späteren Inhalt darstellen sollen, werden auch an die PagedCollectionView gebunden. Der DataPager gibt dann alle weiteren Commands an die PagedCollectionView. Die anderen Steuerelemente erhalten dann automatisch den jeweiligen Inhalt.

Beispiel:

In diesem Beispiel wird gezeigt wie Daten von einem Model ins ViewModel geladen werden. Im ViewModel wird direkt eine Instanz einer PagedCollectionView erzeugt und die Daten vom Model überreicht.

Listing 1.4. – Source-Code der Implementierung von SelectionChangedMethod.

Beim Ausführen der Anwendung, erscheint nun bei der Auswahl eines Items die jeweilige MessageBox.

Abb-1-5–Die-Auswahl-eines-Items-wird-in-einer-MessageBox-dargestellt

Abb.1.5. – Die Auswahl eines Items wird in einer MessageBox dargestellt.

Fazit

Behaviors sind immer wichtiger geworden. Ich selbst sehe Sie auch als eine Art Aspektorientierte Programmierung für das Frontend. Es muss kein Code geschrieben werden, es kann zudem immer wieder verwendet werden und die Übersichtlichkeit des eigenen Codes bleibt gegeben. Die neuen Behaviors in Expression Blend 4 bringen eine große Abhilfe bei den Stolpersteinen der heutigen Entwicklung mit sich. Zum Beispiel bei der Entwicklung mit dem MVVM.

Eigene Routed Events unter Silverlight

27.07.2010 11:01:24 | Gregor Biswanger

Routed Events sind gerade bei verschachtelten Steuerelementen enorm wichtig. Jedoch bringen Sie unter Silverlight einige Probleme mit sich. Zum einem sind Sie unter Silverlight auf folgende Events beschränkt:

KeyDown
KeyUp
GotFocus
LostFocus
MouseLeftButtonDown
MouseLeftButtonUp
MouseMove
MouseWheel
BindingValidationError
DragEnter
DragLeave
DragOver
Drop

Das wäre normal nicht wirklich schlimm, wenn man wie unter WPF seine eigenen Routed Events schreiben könnte. Leider kann man aktuell ab Silverlight 4 immer noch keine eigenen Routed Events schreiben. Das schränkt die Freiheiten bei bestimmten Anforderungen stark ein. Das nächste Problem wäre zudem die Abhängichkeit in der Code-Behind durch ein Event. Für die so eben genannten Probleme habe ich folgende Lösung parat: CallMethodAction-Behavior + UserControl-Facade.

Ein einfaches Beispiel: Die ListBox

Das folgende Beispiel verbildlicht ein gängiges Szenario unter Silverlight. Es soll auf ein Klick innerhalb der ListBox mit eigener Logik reagiert werden können. Dazu wurde bereits eine ListBox mit Beispieldaten und einem CallMethodAction-Behavior in Expression Blend 4 angelegt. Das CallMethodAction-Behavior soll auf das MouseLeftButtonDown-Event reagieren und die Methode ListBoxMouseLeftButtonDown im ViewModel aufrufen.

 

Das ist der folgende XAML-Code dazu:

   1:  ....
   2:          <ViewModel:ViewModelExample x:Key="ViewModel" />
   3:      </UserControl.Resources>
   4:   
   5:      <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource ViewModel}">
   6:          <ListBox x:Name="LbItems" Margin="36,43,39,58" ItemTemplate="{StaticResource ItemTemplate}" 
                        ItemsSource="{Binding Source={StaticResource SampleDataSource}, Path=Collection}">
   7:              <i:Interaction.Triggers>
   8:                  <i:EventTrigger EventName="MouseLeftButtonDown">
   9:                      <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ListBoxMouseLeftButtonDown" />
  10:                  </i:EventTrigger>
  11:              </i:Interaction.Triggers>
  12:          </ListBox>
  13:      </Grid>
  14:  ....

Listing 1.4. – Source-Code der Implementierung von SelectionChangedMethod.

Beim Ausführen der Anwendung, erscheint nun bei der Auswahl eines Items die jeweilige MessageBox.

Abb-1-5–Die-Auswahl-eines-Items-wird-in-einer-MessageBox-dargestellt

Abb.1.5. – Die Auswahl eines Items wird in einer MessageBox dargestellt.

Fazit

Behaviors sind immer wichtiger geworden. Ich selbst sehe Sie auch als eine Art Aspektorientierte Programmierung für das Frontend. Es muss kein Code geschrieben werden, es kann zudem immer wieder verwendet werden und die Übersichtlichkeit des eigenen Codes bleibt gegeben. Die neuen Behaviors in Expression Blend 4 bringen eine große Abhilfe bei den Stolpersteinen der heutigen Entwicklung mit sich. Zum Beispiel bei der Entwicklung mit dem MVVM.

Microsoft Expression 4 auf Deutsch verfuegbar

27.07.2010 08:11:05 | Kay Giza

Anfang Juni wurde die neue Version der Expression-Produktfamilie offiziell vorgestellt, seit letzter Woche ist Expression Studio nun auch auf Deutsch erhältlich: Auf der deutschen Expression-Webseite sind ab sofort deutschsprachige 60-Tage-Testversionen zum Download verfügbar. Microsoft Expression ist eine Sammlung professioneller Designwerkzeuge zur Entwicklung und Gestaltung von Webanwendungen, Benutzeroberflächen für Windows-Anwendungen und multimediale Rich-Media-Anwendungen. Ab Mitte August wird Expression 4 dann auch im Handel verfügbar sein. Expression-User, die Expression 3 im Einzelhandel erworben haben, können sich die Testversionen von Expression Studio 4 Ultimate oder Expression Studio 4 Web Professional herunterladen. Sofern Expression 3... [... mehr in diesem Blogposting auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Rehl Factory - eine Singleton Instanz

26.07.2010 20:10:00 | Timo Rehl

Die Rehl Factory hat eine Singleton Instanz in die Welt gesetzt:

using System;

/// <summary>
/// Die wunderbare und einzigartige Struktur einer atemberaubenden Singleton.
/// Partial deshalb, weil die Klassendefinition immer mehr und mehr erweitert
/// werden wird.
/// </summary>
public partial class Bianca
{
    /// <summary>
    /// Die einzigartige Instanz.
    /// </summary>
    private static Bianca m_EinzigartigeBianca = new Bianca();

    /// <summary>
    /// Bianca gehört zur Rehl Family und es kann nur über die
    /// Singleton Instanz auf sie zugegriffen werden.
    /// </summary>
    private Bianca()
    {
    }

    /// <summary>
    /// Liefert den Zustand, ob Bianca hungrig ist.
    /// </summary>
    public bool IstHungrig
    {
        get { return GetWunderlicheAntwortObHungrig(); }
    }

    /// <summary>
    /// Liefert den Zustand, ob Bianca gerade schläft.
    /// </summary>
    public bool SchlaeftGerade
    {
        get
        {
            return (!IstHungrig && AugenZu && GleichmaessigeAtmung);
        }
    }

    /// <summary>
    /// Die wunderliche Antwort auf die Frage, ob Bianca hungrig ist
    /// liefert nur die Singleton Instanz mit Hilfe von inneren Zuständen,
    /// die on außen nicht einsehbar sind.
    /// (Trotz .Net und Reflection keine Chance ;-)
    /// </summary>
    /// <returns>True, wenn hungrig, andernfalls False.</returns>
    private bool GetWunderlicheAntwortObHungrig()
    {
        // Miracle, obscure and strange code here
    }
}


Mal schauen, was für Extension Methods sie noch bekommt. Unklar ist auch, wie die künstliche Intelligenz die Internen Datenströme wandern lässt. Und par tout hat sich noch nicht aller Code entschlüsseln lassen, trotz Refector (Ultraschall), oder genauerer Analyse. Ein Debuggen war leider nur von außen möglich. Die Factory und auch die Helferinstanzen (Ärzte) sind sich aber einig, sie lebt und sie ist gesund ;-)

Ich habe in den embedded Ressourcen noch ein Bild gefunden:


Die ist ja soo goldig ;-)))

NRW Conf 2010

26.07.2010 12:48:00 | Alexander Zeitler

NRW Conf 2010

Der Just Community e.V. veranstaltet nun bereits zum sechsten Mal in Folge die NRW Conf. War das Event in den Anfängen noch eine reine Abendveranstaltung, so wird in diesem Jahr ein zweitägiges Event, mit einem Workshop- und einem Konferenztag, angeboten.

Drei Workshops, mehr als 24 Fach-Vorträge und viel Gelegenheit für Networking bilden dabei die Grundlage für eine außergewöhnliche Community-Veranstaltung.

Das Feedback der letzten Jahre wurde eingearbeitet und so gibt es in diesem Jahr wieder kleine Änderungen, um die Wünsche der Teilnehmer noch besser zu erfüllen.

Das internationale Sprecherfeld ist hochkarätig besetzt und und es gibt wieder eine große Vielfalt an Sessions aus den Themengebieten Data, Design, Dev, IT-Pro, Soft Skills und Web.

Die Workshops am 09.09.2010 haben die Themen: „Developer – Effizientes C# – Die wirklich wichtigen Features“, „Microsoft Business Intelligence für Entwickler“ und „SharePoint/Nintex – Nintex for runaways“ und sind mit 59,– € für einen Ganztagesworkshop ein echtes Schnäppchen.

Genauso die Konferenz am 10.09.2010. Denn es hat sich nichts geändert an der Teilnahmegebühr von unschlagbar günstigen 15,– € und dem Veranstaltungsort, der Börse in Wuppertal.

Wer besonders schnell ist und sich bis zum 31.07.2010 zur Konferenz anmeldet und seine Gebühr überweist, hat als Early Bird zusätzlich noch die Chance auf interessante Preise.

 


DotNetKicks-DE Image

Kostenlose "Works with Windows Server 2008 R2" Software Zertifizierung jetzt verfügbar!

26.07.2010 10:05:00 | Peter Kirchner

Sie möchten Ihre Software-Anwendung auf die Kompatibilität mit Windows Server 2008 R2 prüfen? Im Microsoft Platform Ready Portal – die zentrale Anlaufstelle für Softwareentwickler rund um neue Microsoft Technologien finden Sie das "Works with Windows Server 2008 R2" Software Certification Toolkit.

Dieses Toolkit unterstützt Sie dabei, Ihre Anwendung auf die Zertifizierung vorzubereiten und enthält technische Beschreibungen, Tools, Dokumentationen, Code-Beispiele sowie weitere Hilfestellungen rund um die Anwendungskompatibilität.

Mit dem Toolkit prüfen Sie Ihre Anwendungskompatibilität indem Sie einen Selbsttest durchführen, das heißt, Sie testen Ihre Software-Anwendung in Ihrem Haus und teilen uns das Ergebnis per XML-Datei mit. Sie laden Ihre Testergebnisse einfach über das Microsoft Platform Ready Portal hoch, und erhalten dann eine Bestätigung Ihrer Anwendungskompatibilität.

Mit dem erfolgreichen Bestehen dieses Selbsttests haben Sie die "Works with Windows Server 2008 R2" Software Zertifizierung erlangt und somit auch eines der Voraussetzung für die Microsoft Partner Network Silver ISV Kompetenz erfolgreich absolviert.

www.microsoftplatformready.com/de

Expression 4 auf Deutsch verfügbar

26.07.2010 09:15:29 | Oliver Scheer

Anfang Juni wurde die neue Version der Expression-Produktfamilie offiziell vorgestellt, seit letzter Woche ist Expression Studio nun auch auf Deutsch erhältlich: Auf der deutschen Expression-Webseite sind ab sofort deutschsprachige 60-Tage-Testversionen zum Download verfügbar. Microsoft Expression ist eine Sammlung professioneller Designwerkzeuge zur Entwicklung und Gestaltung von Webanwendungen, Benutzeroberflächen für Windows-Anwendungen und multimediale Rich-Media-Anwendungen.  Ab Mitte August wird Expression 4 dann auch im Handel verfügbar sein.

Expression-User, die Expression 3 im Einzelhandel erworben haben, können sich die Testversionen von Expression Studio 4 Ultimate oder Expression Studio 4 Web Professional herunterladen. Sofern Expression 3 auf dem PC installiert ist, wird die Vollversion von Expression 4 automatisch frei geschaltet. Besitzer von Expression Web 3 können kostenfrei auf Expression Studio 4 Web Professional upgraden, Besitzer von Expression Studio 3 auf Expression Studio 4 Ultimate. Weitere Informationen zum Expression Studio 4 Upgrade finden Interessierte im deutschen Silverlight und Expression Studio Blog.

Was ist neu?

Expression Studio 4 weist viele Neuerungen und Verbesserungen auf: So bietet Expression Blend 4 zum Beispiel Support für Visual Studio 2010 und Windows Phone. Außerdem sind neue Eigenschaften, Pixel Shader-Effekte, verbesserter Adobe Photoshop-Import oder Unterstützung für Model View View-Model hinzugekommen. Bei Expression Web 4 sind unter anderem SEO Reporting, ein neues Erweiterungsmodell für HTML, JavaScript und CSS sowie eine überarbeite SuperPreview zu erwähnen. Bei Expression Encoder 4 Pro schließlich stechen neue Features wie Live Smooth Streaming (VC-1 und H.264), verbessertes Screen Capturing und ein neuer H.264 Encoder ins Auge. Mehr Informationen zu den einzelnen Programmen finden Sie auf der Expression-Produktseite.

Ultimate, Web Professional und MSDN Subscription

Die neue Version von Expression Studio ist in zwei verschiedenen Editionen verfügbar: Expression Studio 4 Ultimate ist das Komplettpaket und enthält alle vier Expression-Produkte Blend, Web, Design und Encoder. Die Ultimate-Edition richtet sich an Webdesigner, Interface-Designer sowie Entwickler von Rich Internet Applications (RIA) basierend auf Silverlight. Außerdem verfügbar ist Expression Studio 4 Web Professional – diese Edition beinhaltet Web, Design und Encoder und ist als Werkzeug für professionelle und semi-professionelle Webdesigner gedacht.

Inhaber einer MSDN Subscription haben ebenfalls Zugriff auf die neuen Versionen der Expression-Produktfamilie: Expression Studio Ultimate ist Teil von Visual Studio Ultimate mit MSDN und Expression Studio Premium ist Teil von Visual Studio Premium mit MSDN. Der Unterschied liegt vor allem darin, dass nur bei der Ultimate-Version SketchFlow verfügbar ist, außerdem enthält die Premium-Version eine kleinere Ausgabe des Expression Encoder.

Neue Downloads für Entwickler

Neben den Expression-Versionen an sich stehen auch zwei neue deutschsprachige Downloads für Entwickler zur Verfügung: das Expression Blend 4 SDK für Silverlight sowie das Expression Blend 4 SDK für .NET 4.0 Beide Pakete enthalten weitervertreibbare Komponenten, die bei der Erstellung von Expression Blend 4-Anwendungen hilfreich sind.

Neues rund um Expression 4

26.07.2010 08:51:31 | Jan Schenk

Expression 4 auf Deutsch verfügbar

Anfang Juni wurde die neue Version der Expression-Produktfamilie offiziell vorgestellt, seit letzter Woche ist Expression Studio nun auch auf Deutsch erhältlich: Auf der deutschen Expression-Webseite sind ab sofort deutschsprachige 60-Tage-Testversionen zum Download verfügbar. Microsoft Expression ist eine Sammlung professioneller Designwerkzeuge zur Entwicklung und Gestaltung von Webanwendungen, Benutzeroberflächen für Windows-Anwendungen und multimediale Rich-Media-Anwendungen.  Ab Mitte August wird Expression 4 dann auch im Handel verfügbar sein.

Expression-User, die Expression 3 im Einzelhandel erworben haben, können sich die Testversionen von Expression Studio 4 Ultimate oder Expression Studio 4 Web Professional herunterladen. Sofern Expression 3 auf dem PC installiert ist, wird die Vollversion von Expression 4 automatisch frei geschaltet. Besitzer von Expression Web 3 können kostenfrei auf Expression Studio 4 Web Professional upgraden, Besitzer von Expression Studio 3 auf Expression Studio 4 Ultimate. Weitere Informationen zum Expression Studio 4 Upgrade finden Interessierte im deutschen Silverlight und Expression Studio Blog.

Was ist neu?

Expression Studio 4 weist viele Neuerungen und Verbesserungen auf: So bietet Expression Blend 4 zum Beispiel Support für Visual Studio 2010 und Windows Phone. Außerdem sind neue Eigenschaften, Pixel Shader-Effekte, verbesserter Adobe Photoshop-Import oder Unterstützung für Model View View-Model hinzugekommen. Bei Expression Web 4 sind unter anderem SEO Reporting, ein neues Erweiterungsmodell für HTML, JavaScript und CSS sowie eine überarbeite SuperPreview zu erwähnen. Bei Expression Encoder 4 Pro schließlich stechen neue Features wie Live Smooth Streaming (VC-1 und H.264), verbessertes Screen Capturing und ein neuer H.264 Encoder ins Auge. Mehr Informationen zu den einzelnen Programmen finden Sie auf der Expression-Produktseite.

Ultimate, Web Professional und MSDN Subscription

Die neue Version von Expression Studio ist in zwei verschiedenen Editionen verfügbar: Expression Studio 4 Ultimate ist das Komplettpaket und enthält alle vier Expression-Produkte Blend, Web, Design und Encoder. Die Ultimate-Edition richtet sich an Webdesigner, Interface-Designer sowie Entwickler von Rich Internet Applications (RIA) basierend auf Silverlight. Außerdem verfügbar ist Expression Studio 4 Web Professional – diese Edition beinhaltet Web, Design und Encoder und ist als Werkzeug für professionelle und semi-professionelle Webdesigner gedacht.

Inhaber einer MSDN Subscription haben ebenfalls Zugriff auf die neuen Versionen der Expression-Produktfamilie: Expression Studio Ultimate ist Teil von Visual Studio Ultimate mit MSDN und Expression Studio Premium ist Teil von Visual Studio Premium mit MSDN. Der Unterschied liegt vor allem darin, dass nur bei der Ultimate-Version SketchFlow verfügbar ist, außerdem enthält die Premium-Version eine kleinere Ausgabe des Expression Encoder.

Neue Downloads für Entwickler

Neben den Expression-Versionen an sich stehen auch zwei neue deutschsprachige Downloads für Entwickler zur Verfügung: das Expression Blend 4 SDK für Silverlight sowie das Expression Blend 4 SDK für .NET 4.0 Beide Pakete enthalten weitervertreibbare Komponenten, die bei der Erstellung von Expression Blend 4-Anwendungen hilfreich sind.

Einladung zum Treffen der .NET Usergroup Dresden am 25.08.2010

25.07.2010 16:49:00 | Martin Hey

Das nächste Treffen der .NET Usergroup Dresden findet am 25.08.2010 statt. Austragungsort ist dieses Mal die Communardo Software GmbH.

Wie bereits im Juli-Treffen angekündigt werden dabei folgende Themen eine Rolle spielen:

Branching/Merging Strategien mit dem TFS (Robert Mühsig)
Nachdem wir bei der letzten Usergroup den Themenkomplex Buildmanagement vertieft haben, setzt Robert seinen Vortrag zum Thema TFS fort. Dieses Mal geht es um Branching- und Merging-Strategien.

Einführung in die Entwicklung für Windows Phone 7 (Martin Hey)
Windows Phone 7 wird dieses Jahr gelauncht. Der Vortrag soll eine Einführung in die Möglichkeiten und Besonderheiten der Entwicklung für Windows Phone 7 geben.

Das Treffen beginnt wie immer um 18:00 Uhr. Wer daran interessiert ist zu kommen, den bitten wir sich in einer der Teilnehmerlisten (Xing oder Doodle) einzutragen. Nach dem Treffen ist jeder gern eingeladen, beim Stammtisch an einem Plausch in lockerer Atmosphäre über .NET oder alles andere teilzunehmen.

Reactivating this site

25.07.2010 14:16:40 | Thomas Freudenberg

germany.hamburgYes, this blog is still alive, though the last post is about two and a half years old.

It has happened a lot since then, but it can be condensed in two points: a) I moved again, this time to Bernau am Chiemsee at the “other end” of Germany, and b) I got married. And the latter caused the former :-)

Anyway, after 30 month of silence I think I should reactivate this blog. In the past I hesitated because most of the time I thought my topics are too trivial to write about. But that’s because whenever I had a particular programming error, I thought about it and tried to solve it. But at the point of the solution I’m already so familiar with the problem that I think it’s not interesting enough anymore to blog about it.

But on the other hand, other might have had the same problem, so why not help them and publish a possible solution? At least Google will find it.

Additionally blogging will help me to sharpen my rusty English skills ;)

Anyway, in my profession and in my spare time I deal with WPF, IoC containers, ASP.NET MVC, NoSQL databases (RavenDB in particular) among others, so you know what to expect in the future.

LightCore 1.4 Release

25.07.2010 07:44:00 | Peter Bucher

*Update: Die Quellcode Lizenz von LightCore wurde auf MS-PL umgestellt und die aktuelle Version ist inzwischen 1.4.1.

Es hat eine Weile gedauert, doch nun ist es soweit: LightCore ist in der Version 1.4 verfügbar und die Website glänzt mit neuem Design und Inhalt.

Mit diesem Release wurden bekannte Fehler aus der Version 1.0 behoben, intern viel verändert und bietet natürlich auch neue Features.

Silverlight 3.0 und Compact Framework 3.5 Unterstützung wurden gefordert, diese Forderung wurde umgesetzt und zusätzlich findet sich jetzt auch eine .NET 4.0 Variante, die den neuen Lazy<T>-Typ integriert.

Unter anderem wurde folgendes geändert:

  • Interne Änderungen, mehr UnitTests, Optimierungen, Fehlerbehebungen.
  • Open Generic Unterstützung per XML-Registrierung.
  • Unterstützung von mehreren, typisierten Argumenten pro Registration mit XML oder per Code.
  • Bessere Fehlermeldungen und Fehlerbehandlung.
  • Viel mehr Features durch die RegistrationSources, bspw. Factory- oder Array-RegistrationSource.
  • Unterstützung von ASP.NET MVC 2.0.
  • Property Injection Performance verbessert.
  • Benannte Registrierungen sind ab dieser Version nicht mehr unterstützt.
  • Compile- und Laufzeit-Argumente in verschiedener Form (XML, anonymer Typ, IDictionary<string, object>,Argument beim Resolve Aufruf).

LightCore ist unter http://lightcore.ch/ erreichbar.

An dieser Stelle möchte ich Jürgen Gutsch, Gregor Biswanger, Dennis Bischof, Golo Roden und Roberto Bez danken, die mir während der Entwicklung und für die Dokumentation von LightCore stets mit Rat und Tat zur Seite stehen.

Was kostet LightCore?

Die Binaries von LightCore dürfen in jeglicher Art von Projekten (privat, kommerziell, ...) kostenlos genutzt werden.
Der Quellcode von LightCore steht unter der MS-PL-Lizenz.

WinDbg Commands

24.07.2010 22:45:03 | Alexander Groß

I just finished watching Ingo Rammer’s sessions on debugging from NDC 2010:

While I consider myself experienced in debugging with Visual Studio I still didn’t know the Ctrl+B trick Ingo shows in the first session to create breakpoint groups, for example to break on all methods named WriteLine.

Ingo’s second session goes into detail how to start with WinDbg. During his talk Ingo wrote down quite a lot of WinDbg commands that I copied and extended a bit for my own reference.

# Use debugger according to architecture that is being debugged.

# Drag exe onto WinDbg to start debugging.

# Debugging services:
# 1. Using Global Flags
#  - On "Image File" tab, enter service exe
#  - Set debugger to cdb.exe -server tcp:port=1234
# 2. Start service
# 3. Start WinDbg
#  - connect to remote session: tcp:server=localhost,port=1234
# Also works (unsecured) over networks

!help

.loadby sos mscorwks # CLR 2
.loadby sos clr      # CLR 4, both after the debuggee has loaded the CLR
.chain               # Shows loaded extensions

sxe <event code> # Stop
sxn <event code> # Notify
sxi <event code> # Ignore
# ... on <event code> exceptions (for example, <event code> = clr)

g            # Go
.cls         # Clear screen

!pe          # Print exception
!clrstack    # Display stack trace
!clrstack -a # Stack trace with additional information (parameters and locals)
# If there is no stack information the JIT optimized the code away (i.e. inlining).
!dumpstack   # Another way to get the stack trace

!u <address> # Unassemble code at <address>
# Look for calls into managed code (to the right) to find the line/call that caused the exception.
# <assembly>_ni = Native image

!do <address> # Dump object
!da <address> # Dump array
# To copy addresses: Left double-click a numeric value, double right-click to copy it to the command line.

~            # Show all (managed and unmanaged) threads
!threads     # Show managed threads
~2s          # Switch to thread 2 (#2 in the unnamed column)
!runaway     # Show thread execution times (user-mode) - to find hanging threads

!dumpheap    # Show heap information, 1 line per instance
!dumpheap -stat # Heap statistics, most memory-consuming at the bottom. MT = class "pointer"
!dumpheap -stat -type TextBox # Show instances of classes containing "TextBox"
!dumpheap -type TextBox
!dumpheap -mt <type> # Dumps all instances of "TextBox" or <type>
!gcroot <address> # Why is the instance at <address> in memory?
# Domain = new GC root that reference <address> (~ static instance)
# Ignore WeakReferences, look for (pinned) references

# Create dumps from code:
[DllImport("DbgHelp.dll", SetLastError = true]
static extern bool MiniDumpWriteDump(
    IntPtr hProcess,
    int processId,
    IntPtr fileHandle,
    int dumpType, // 0x0 or 0x6 for managed code
    IntPtr exceptionInfo,
    IntPtr userInfo,
    IntPtr extInfo);

Benutzerbild in dotnet-kicks.de einbinden

24.07.2010 10:05:00 | dotnet-kicks.de Blog

Inzwischen verwenden die meisten aktiven dotnet-kicks.de Nutzer ein eigenes Benutzerbild. Für alle, die nicht wissen wie ein solches Bild bei dotnet-kicks.de eingebunden werden kann, beschreibt die folgende Kurzanleitung die Vorgehensweise.

image

Bei dotnet-kicks.de werden die Bilder nicht direkt hochgeladen, es wird auf das Bild zurückgegriffen, das bei dem kostenlosen Dienst Gravatar veröffentlicht wurde. Gravatar bietet den Vorteil, dass das eigene Bild an einer zentralen Stelle verwaltet werden kann. Alle anderen Webseiten, die den Gravatar-Dienst nutzen, holen sich das Bild von Gravatar und zeigen es an. Die Bilder werden anhand ihrer Email Adresse identifiziert.

image

1.    öffnen der Webseite http://gravatar.com/
2.    auf den Button >Get your Gravatar today< klicken
3.    auf der nachfolgen Seite die Emailadresse eingeben, mit der man  auch bei dotnet-kicks.de registriert ist
4.    Bestätigungsmail abrufen und den Aktivierungslink in der Mail anklicken
5.    auf der nun geöffneten Seite einen Benutzernamen und ein Passwort festlegen
6.    im nächsten Schritt kann ein Bild hochgeladen oder direkt über  eine Webcam aufgenommen werden
7.    Fertig, ab jetzt wird das Benutzerbild bei dotnet-kicks.de und allen anderen Seiten angezeigt die Gravatare unterstützen

Office Solution Troubleshooting & Deployment

23.07.2010 14:24:50 | Jens Häupel

Manchmal sind es die vermeintlich offensichtliche Dinge, die andere davon abhalten, erfolgreich zu sein. Aber nur, weil man es selbst schon hunderte Male durchlaufen hat, wissen es noch immer nicht alle. Wenn man sich sehr lange mit bestimmten Dingen beschäftigt, fällt es manchmal schwer zu unterscheiden.

Hier wieder ein paar interessante Informationen und Tips zu VSTO:

Windows 7–Beispielanwendung Fishbowl

22.07.2010 10:50:00 | Oliver Scheer

Auf http://developforwindows.com/ wird eine sehr tolle Facebook-Client mit dem Titel Fishbowl vorgestellt. Vollständig auf Windows 7 Technologien basierend und mit einer wirklich tollen Oberfläche kann man sein Facebook-Leben auch auf dem Desktop geniessen.

image

Link: http://www.fishbowlclient.com/

Nachlese zum Treffen der .NET Usergroup am 21.07.2010

22.07.2010 08:23:00 | Martin Hey

Gestern Abend trafen sich wieder begeisterte .NET Anhänger zur .NET Usergroup. Erfreulich war, dass wir ganz viele neue Gesichter dabei hatten, was mir zeigt, dass wir auf dem richtigen Weg sind und was uns dazu veranlasst hat, zu Beginn noch eine kurze Vorstellungsrunde zu setzen.

Direkt danach ging es schon tief ins Fachliche und ich habe anhand eines Beispiels gezeigt, wie man dynamische LINQ-Queries mit Hilfe einer geschickten Kombination der Klassen aus dem Namespace System.Linq.Expressions generieren kann. Hier hat sich auch gut gezeigt, wie die Community funktioniert, denn eines meiner Beispiele funktionierte nicht auf Anhieb (das Risiko des Live-Codings) und die hilfreichen Tipps von den Zuschauern haben mich auf die richtige Spur gebracht. Dass hier Interesse besteht, hat auch die anschließende kurze Diskussion "Typsicherheit vs. Dynamik", welche sich aus dem Thema entwickelt hat, gezeigt. Für das Beispielprojekt gibt es auch einen Downloadlink.

Nach einer kurzen Pause ging es mit Robert dann in die Tiefen automatischer Builds mit Hilfe von Team Foundation Server 2008 und 2010 und MSBuild-Skripten. Zwar hatte jeder der Anwesenden sich schon einmal mit dem Thema beschäftigt, aber in den Tiefen von MSBuild waren nur sehr wenige bisher unterwegs. Allen Teilnehmern, die sich etwas eingehender mit dem Thema MSBuild beschäftigen wollen, sei die MSBuild Serie von Thorsten Hans ans Herz gelegt, die Robert ja kurz erwähnt hat.

Im Anschluss an die Usergroup konnte man dann bei einem kühlen Bier in der Terrasse am Bischofsplatz noch fachsimpeln und den Abend ausklingen lassen.

Die BASTA! geht wieder auf Tour

22.07.2010 07:52:00 | Jörg Neumann

Zu meiner Freude macht die BASTA! ON TOUR diesmal in Hamburg halt. Vom 15. bis 16. November geht es unter dem Motto "Webanwendungen mit .NET" zwei Tage lang um die Entwicklung von Browser-basierten Anwendungen mit ASP.NET und Silverlight.
Hierbei werde ich die folgenden zwei Workshops bestreiten:

  • Silverlight Architecture Patterns
  • Silverlight Tipps & Tricks

Mehr Infos gibt’s auf www.basta-on-tour.de.

Vielleicht sieht man sich ja!

Basta_on_Tour_Banner325x125v2neu rot

BizTalk2010 - Host Instanz hält einen Eintrag in der MessageBox

22.07.2010 07:51:00 | Timo Rehl

Wir haben mit den Tests unter BizTalk2010 festgestellt, dass die MessageBox nicht von Grund auf leer ist. Eine Rückfrage bei der Microsoft Produktgruppe hat ergeben, dass wohl eine Host-Instanz einen internen Eintrag in der MessageBox vornimmt. Der Eintrag ist keiner Service- bzw. Messageinstanz zuzuordnen.

Siehe auch Microsoft Connect.

Das "Schlimme" daran ist, dass selbst eine WMI Abfrage "SELECT * FROM MSBTS_MessageInstance" diesen internen Eintrag zurückliefert, und das glaube ich nicht, dass das "ByDesign" ist. Wir werden da nachhaken.

Ein kleiner Test

22.07.2010 01:19:36 | Albert Weinert

using System;
using System.Text;
using System.Windows.Forms;

namespace SyntaxHighlight
{
    public class HtmlGenerator
    {
        private WebBrowser browser;

        private WebBrowser Browser
        {
            get
            {
                if (browser == null)
                    browser = new WebBrowser();
                browser.ScriptErrorsSuppressed = false;
                return browser;
            }
        }

        public string GenerateEditorHtml(string code, SyntaxHighlighter30Provider provider)
        {
            var publishHtml = GeneratePublishHtml(code, provider);
            var resourceReader = new ResourceReader();
            var html = new StringBuilder();
            html.AppendLine("");
            html.AppendLine("");
            html.AppendLine("");
            html.AppendLine("");
            html.AppendLine(publishHtml);
            html.AppendLine("");
            html.AppendLine("");
            html.AppendLine("");


            string result = string.Empty;
            try
            {
                EnsureBrowserDocument();

                if (Browser.Document != null)
                {
                    Browser.Document.OpenNew(true);
                    Browser.Document.Write(html.ToString());
                    result = GetConvertedHtml(Browser.Document.Body);
                }
            }
            catch (Exception ex)
            {
#if DEBUG
                MessageBox.Show(ex.ToString());
#endif
                result = publishHtml;
            }
            return result;
        }

        private string GetConvertedHtml(HtmlElement htmlElement)
        {
            return htmlElement.InnerHtml;
        }

        private void EnsureBrowserDocument()
        {
            if (Browser.Document == null)
            {
                Browser.DocumentText = "";
            }
        }

        public string GeneratePublishHtml(string code, SyntaxHighlighter30Provider provider)
        {
            string preClass = "brush: c#";
            return string.Format("
{1}
", preClass, code); } } }

Silverlight 3D Engine von PostVision

21.07.2010 13:58:00 | Oliver Scheer

Bin gerade zufällig drüber gestolpert (danke an Rene Schulte).

Auf http://postvision.net/SilverMotion/DemoTech.aspx finden sich unglaublich beeindruckende Demos mit der von PostVision entwickelten 3D Engine in Silverlight.

image

Wow.

Window 7–Beispielanwendung Book.Show

21.07.2010 12:42:44 | Oliver Scheer

Auf der Website: http://developforwindows.com/ gibt es einige sehr coole Beispielanwendung für die Anwendungsenwicklung unter Windows 7.

image

Die Anwendung sieht nicht aus wie eine typische "alte” Windows-Anwendung, sondern kommt mit einer sehr ansprechenden, individuellen Oberfläche daher. In der Anwendung sind diverse Bücher enthalten, die man einfach aus einem Bücherregal herauspicken und lesen kann.

Macht wirklich Spaß und das coolste ist, der Sourcecode ist frei mit dabei.

Link: http://developforwindows.com/

Neue Informationen hier im Blog

21.07.2010 00:36:07 | Albert Weinert

Da ich hier und da Anfragen nach Vorträgen bekomme habe ich hier im Blog nun angefangen die Vorträge die ich halte zu hinterlegen. Diese Liste wird mit der Zeit erweitert.

Firmen und User Groups können bei mir für einen Vortrag vor Ort anfragen.

 

Technorati Tags: ,,,

Termine

21.07.2010 00:11:42 | Albert Weinert

Zukünftige Termine

Folgende Termine mit Voträgen sind geplant

Vergangende Termine

Termine an denen ich Vorträge gehalten heben.

2010

List of SharePoint 2010 related documents and software

20.07.2010 20:25:00 | Ozgur Aytekin

Below is a list of SharePoint 2010 related documents and software available from Microsoft.

Developing Applications for SharePoint 2010
Developing Applications for SharePoint 2010 contains guidance documentation, detailed examples, and a reusable class library.

SharePoint 2010 Walkthrough Guide
This guide was written as a companion to the SharePoint Server 2010 Evaluation Guide for Technical and Business Decision Makers.

Planning guide for Microsoft SharePoint Server 2010
This document provides information and guidelines to lead a team through the steps of planning the deployment of a solution based on Microsoft SharePoint Server 2010.

Technical reference for Microsoft SharePoint Server 2010
This document includes technical information about the Microsoft SharePoint Server 2010 provider for Windows PowerShell and other helpful reference information about general settings, security, and tools.
 
Operations guide for SharePoint Foundation 2010
This document describes how to operate and maintain your servers, server farms, sites, and solutions in Microsoft SharePoint Foundation 2010.

 Planning guide for Microsoft SharePoint Server 2010
This document provides information and guidelines to lead a team through the steps of planning the deployment of a solution based on Microsoft SharePoint Server 2010.

Upgrading to Microsoft SharePoint Foundation 2010
This document is designed to guide administrators and IT professionals through the process of upgrading to Microsoft SharePoint Foundation 2010 from Windows SharePoint Services 3.0.


Operations guide for SharePoint Foundation 2010
This document describes how to operate and maintain your servers, server farms, sites, and solutions in Microsoft SharePoint Foundation 2010.

Microsoft SharePoint Designer 2010 (32-bit)
SharePoint Designer 2010 is the tool of choice for the rapid development of SharePoint applications. Using SharePoint Designer, advanced users and developers alike can rapidly create SharePoint solutions in response to business needs.

Microsoft SharePoint Foundation 2010
SharePoint Foundation 2010 is the new version of Microsoft Windows SharePoint Services. It is the essential solution for organizations that need a secure, manageable, web-based collaboration platform.

 Sharepoint 2010 Developer Training Kit
The SharePoint 2010 Developer Training Kit provides developers with deep guidance on how to develop for SharePoint 2010.

...

http://www.mssharepointtips.com/tip.asp?id=1000

Microsoft Visual Studio Scrum 1.0 released

20.07.2010 20:17:11 | Thomas Schissler

Das Processtemplate für Scrum gab’s von Microsoft bereits als Beta, nun wurde die endgültige Version auf der Visual Studio Gallery veröffentlicht.

Folgende Elemente enthält das Template:

  • Work Item Types
    • Sprint
    • Product Backlog Item
    • Bug
    • Task
    • Impediment
    • Test Case
  • Reports
    • Release Burndown
    • Velocity
    • Sprint Burndown
    • Build Success Over Time
    • Build Summary
    • Test Case Readiness
    • Test Plan Progress
  • SharePoint Project Portal

Hier noch Screenshots zum Sprint Burndown und Release Burndown Report.

Download

http://visualstudiogallery.msdn.microsoft.com/en-us/59ac03e3-df99-4776-be39-1917cbfc5d8e

Weitere Informationen zum Template
http://blogs.msdn.com/b/aaronbjork/archive/2010/07/19/announcing-microsoft-visual-studio-scrum-1-0.aspx

Riskieren Sie einen Blick auf Visual Studio Team System 2010

20.07.2010 09:45:26 | Jens Häupel

Wir zeigen Ihnen, was Visual Studio im Team wirklich kann und wie es Ihnen bei der täglichen Arbeit hilft.

Weitere Infos

  • 27. Juli 2010 - Böblingen
  • 03. August 2010 - München
  • 17. August 2010 - Hamburg
  • 31. August 2010 - Berlin
  • 14. September 2010 - München
  • 21. September 2010 - Bad Homburg

Teilnahmegebühr: 49 Euro (wer sich bis zum 29.7. bei mir meldet, bekommt einen Anmeldecode umsonst)

Die Anmeldung erfolgt hier.

Microsoft® Visual Studio® Scrum 1.0 Release

20.07.2010 07:52:52 | Christian Binder

 

Das SCRUM Template 1.0 ist nun als finale Version verfügbar. Es ergänzt die schon vorhandenen MSF Templates und soll SCRUM Teams besser unterstützen.
Folgende Work Items und Reports sind Teil des Templates:

Work Item Types

  • Sprint
  • Product Backlog Item
  • Bug
  • Task
  • Impediment
  • Test Case

Reports

  • Release Burndown
  • Velocity
  • Sprint Burndown
  • Build Success Over Time
  • Build Summary
  • Test Case Readiness
  • Test Plan Progress
  • SharePoint Project Portal

Download des Templates in der Visual Studio Gallery

Eine erste grundliegende Dokumentation für das Template findet sich hier auf MSDN.
Andere Tools, Templates und Informationen  rund um Prozesse im TFS gibt’s auf der Process Templates and Tools Website.

Feedback ist willkommen :-)

Neue Version des WorldWide Telescope

19.07.2010 09:30:00 | Oliver Scheer

Letzte Woche wurde auf dem jährlich stattfindenden Microsoft Research Faculty Summit die neueste Verson von WorldWide Telescope vorgestellt.

Durch eine permanente Zusammenarbeit mit der NASA hat Microsoft nun die vollständigste Visualisierung des Mars in 3D von einem Pol zum Anderen geschaffen, die es so auf dieser Welt (!!!) gibt. Aber auch andere Planeten und deren Trabanten lassen sich nun in 3D näher besichtigen.

Sehr interessant sind die Panoramaansichten, die auf den diversen Missionen der NASA erstellt wurden.

image

Panaromaansicht auf die Landungsstelle von Apollo 12

image

Apollo 17: Shorty Crater

 

image

Pathfinder auf dem Mars

Das WordWide Telescope gibt es in zwei Varianten, der Online-Silverlight-Variante und der Offline-Client-Variante.

Mehr Informationen gibt es hier.

Gegen schwüle Entwicklung mit Interfaces und Typed Parameter

18.07.2010 01:17:08 | Gordon Breuer

Bei der Planung des letzten Kundenwebs stellte sich mal wieder die Aufgabe eine Navigation zu erstellen, die auf der Datenbank unseres eigenen CMS ConLIVE! basiert. Jedes Web hat dabei eine eigene Datenbank, die jedoch auf einer größtenteils einheitlichen Tabellenstruktur basiert. Vor zwei Jahren entwickelten wir alle Webs noch mit classic ASP und es existierte hierfür eine selbstgeschriebene Library mit Standartfunktionen, u.a. um besagte Navigation zu generieren. Inzwischen sind auch wir auf .NET-Programmierung umgestiegen, allerdings musste deshalb zunächst auch für jedes Web individuell das Auslesen und Zusammenstellen aller Daten erfolgen da die bisherige Library unbrauchbar geworden war. Eine eher “schwüle” Situation, von DRY also keine Spur. Eine neue Library musste her!

In classic ASP hatten wir in jedem Web die jeweilige Datenbank in der Variablen “db” initialisiert. Da die Tabellennamen und deren Struktur gleich sind konnten wir in der Library mit einfachen SQL-Anweisungen die Daten abrufen. Natürlich könnte man es ähnlich auch jetzt in .NET machen, andererseits bieten O/R-Mapper wie Linq2Sql nicht zu Unterschätzende Vorteile, nicht zuletzt Intellisense, Typsicherheit und Syntaxkontrolle bereits zum Zeitpunkt des Kompilierens. Doch auch wenn die für unsere Anwendungszwecke benötigten Tabellennamen und -spalten unter den Webs identisch sind so werden doch immer mal individuelle Anpassungen vorgenommen. Im Falle von Linq2Sql bedeutet das, dass jedes Web seine eigene DBML-Datei erhält und wir keine globale für alle Webs verwenden. Doch wie dann eine global verwendbare Bibliothek erstellen? Die Antwort waren für uns die oft unterschätzten Interfaces kombiniert mit Typed Parametern.

interface Zunächst einmal ist es notwendig ein Interface der Klasse zu erstellen, welche bei Linq2Sql im DataContext die jeweilige Tabelle repräsentiert. Eine solche Schnittstelle enthält dabei lediglich die Signaturen von u.a. den Methoden ohne die jeweilige Implementation. Mit den so definierten Eigenschaften kann man dann arbeiten ohne die eigentliche Klasse zu kennen: Die Tatsache, dass sie das Interface implementiert garantiert das Vorhandensein der definierten Methoden und Ereignisse. Um ein solches Interface zu erstellen setzen wir den Cursor innerhalb der gewünschten Klasse und drücken die Tastenkombination STRG+R STRG+I (englisches Visual Studio 2010) oder wählen alternativ im Kontextmenü “Refactor” – “Extract Interface…”. Im folgenden Dialog (siehe Bild) können die in das Interface zu übernehmenden Methoden etc. ausgewählt werden. Nach einem Klick auf “OK” wird Schnittstelle automatisch erstellt und der Klasse zugewiesen. Letzteres ist jedoch problematisch, da die vom Linq2Sql-Designer generierte CS-Datei jederzeit wieder neu erstellt werden könnte. Unsere Klasse würde dann das gerade erstellte Interface nicht mehr implementieren. Da alle Klassen jedoch automatisch als “partial” erstellt werden können wir unsere Interface-Implementierung einfach in eine neue Datei auslagern und die Änderungen der automatisch erstellten Klasse wieder verwerfen:

public partial class Dept : IDept { }

Ausser den Klassen, die den benötigten Tabellen entsprechen benötigen wir ausserdem, auch noch den DataContext den Linq2Sql angelegt hat. Auch hier erstellen wir uns wieder ein Interface, welches die Klassen beinhaltet die wir im vorherigen Schritt ebenfalls mit einer Schnittstelle implementiert haben:

public interface IDataContext {
    System.Data.Linq.Table<Dept> Depts { get; }
}

Wenn wir die jeweiligen Interfaces in ein neues Projekt verschieben, welches unsere künftige Library repräsentiert, fällt schnell ein Problem auf: Hier ist die im Interface verwendete Klasse “Dept” unbekannt. Man könnte jetzt auf die Idee kommen hier einfach statt Dept das eben erstellte Interface IDept einzusetzen. Doch wenn wir dann in unserem Web dem Linq2Sql DataContext unser Interface zuweisen wie schon der partiellen Dept-Klasse zuvor bekommen wir eine Fehlermeldung: Der DataContext implementiert unser Interface nicht da dort “Depts” vom Typ “Table<Dept>” ist und eben nicht “Table<IDept>” wie von der Schnittstelle gefordert. Wir müssen also auch in IDataContext “Table<Dept>” verwenden.

Die Lösung ist ein typisierter Parameter für das Interface zu verwenden:

public interface IDataContext<Dept>
    where Dept : class, IDept {
    System.Data.Linq.Table<Dept> Depts { get; }
}

Über die where-Bedingung geben wir an, dass Dept eine Klasse sein muss welche außerdem das Interface IDept implementiert. Jetzt können wir innerhalb unserer Library sowohl mit dem DataContext als auch mit der Dept-Tabelle über die Interfaces arbeiten:

public class ClDept<TDept>
    where TDept : class, IDept {

    private IDataContext<TDept> _db;

    public ClDept(IDataContext<TDept> db) {
        _db = db;
    }

    public string GetUrlFromDept(int idDept) {
        var result = new StringBuilder();
       var dept = _db.Depts.SingleOrDefault(d => !d.Flg_del && d.Id_dept.Equals(idDept));
        if (dept.Equals(null))
            throw new ArgumentOutOfRangeException("idDept", "There is no dept entry with this id.");
        if (dept.Id_dept_parent.HasValue)
            result.Append(GetUrlFromDept((int)dept.Id_dept_parent));
        result.Append("/" + dept.Dept_name.CleanUrl());
        return result.ToString();
    }
}

Innerhalb der Webseite können wir auf unsere ausgelagerte Funktion nun ebenfalls recht einfach zugreifen nachdem wir die DLL referenziert haben. Zunächst müssen wir oben beschrieben die partiellen Klassen mit den Interfaces erweitert werden. Auf die Methode “GetUrlFromDept(int)” können wir ebenso einfach zugreifen:

var db = new Dms_meinweb(); //implementiert IDataContext<Dept>
var navHelper = new ClDept<Dept>(db);
string url = navHelper.GetUrlFromDept(25); // gibt bsp. “/Aktuelles/Veranstaltungen/Mainz” zurück


Fazit: Schreibt man für eine im grunde identische Funktionalität den Quellcode mehrfach (von der Copy-Pasta ganz zu schweigen) macht man etwas verkehrt. Die CCD sprechen von der Verletzung des DRY-Prinzips, doch egal wie man es nennt: Es ist fehleranfällig, mühsam bei einer Änderung überall anzupassen, unübersichtlich und schlußendlich genau so unangenehm wie schwül-warmes Sommerwetter!

Artikel empfehlen auf .NET-Kicks Deutschland

Gegen schwüle Entwicklung mit Interfaces und Typed Parameter

17.07.2010 16:17:08 | Gordon Breuer

Bei der Planung des letzten Kundenwebs stellte sich mal wieder die Aufgabe eine Navigation zu erstellen, die auf der Datenbank unseres eigenen CMS ConLIVE! basiert. Jedes Web hat dabei eine eigene Datenbank, die jedoch auf einer größtenteils einheitlichen Tabellenstruktur basiert. Vor zwei Jahren entwickelten wir alle Webs noch mit classic ASP und es existierte hierfür eine selbstgeschriebene Library mit Standartfunktionen, u.a. um besagte Navigation zu generieren. Inzwischen sind auch wir auf .NET-Programmierung umgestiegen, allerdings musste deshalb zunächst auch für jedes Web individuell das Auslesen und Zusammenstellen aller Daten erfolgen da die bisherige Library unbrauchbar geworden war. Eine eher “schwüle” Situation, von DRY also keine Spur. Eine neue Library musste her!

In classic ASP hatten wir in jedem Web die jeweilige Datenbank in der Variablen “db” initialisiert. Da die Tabellennamen und deren Struktur gleich sind konnten wir in der Library mit einfachen SQL-Anweisungen die Daten abrufen. Natürlich könnte man es ähnlich auch jetzt in .NET machen, andererseits bieten O/R-Mapper wie Linq2Sql nicht zu Unterschätzende Vorteile, nicht zuletzt Intellisense, Typsicherheit und Syntaxkontrolle bereits zum Zeitpunkt des Kompilierens. Doch auch wenn die für unsere Anwendungszwecke benötigten Tabellennamen und -spalten unter den Webs identisch sind so werden doch immer mal individuelle Anpassungen vorgenommen. Im Falle von Linq2Sql bedeutet das, dass jedes Web seine eigene DBML-Datei erhält und wir keine globale für alle Webs verwenden. Doch wie dann eine global verwendbare Bibliothek erstellen? Die Antwort waren für uns die oft unterschätzten Interfaces kombiniert mit Typed Parametern.

interface Zunächst einmal ist es notwendig ein Interface der Klasse zu erstellen, welche bei Linq2Sql im DataContext die jeweilige Tabelle repräsentiert. Eine solche Schnittstelle enthält dabei lediglich die Signaturen von u.a. den Methoden ohne die jeweilige Implementation. Mit den so definierten Eigenschaften kann man dann arbeiten ohne die eigentliche Klasse zu kennen: Die Tatsache, dass sie das Interface implementiert garantiert das Vorhandensein der definierten Methoden und Ereignisse. Um ein solches Interface zu erstellen setzen wir den Cursor innerhalb der gewünschten Klasse und drücken die Tastenkombination STRG+R STRG+I (englisches Visual Studio 2010) oder wählen alternativ im Kontextmenü “Refactor” – “Extract Interface…”. Im folgenden Dialog (siehe Bild) können die in das Interface zu übernehmenden Methoden etc. ausgewählt werden. Nach einem Klick auf “OK” wird Schnittstelle automatisch erstellt und der Klasse zugewiesen. Letzteres ist jedoch problematisch, da die vom Linq2Sql-Designer generierte CS-Datei jederzeit wieder neu erstellt werden könnte. Unsere Klasse würde dann das gerade erstellte Interface nicht mehr implementieren. Da alle Klassen jedoch automatisch als “partial” erstellt werden können wir unsere Interface-Implementierung einfach in eine neue Datei auslagern und die Änderungen der automatisch erstellten Klasse wieder verwerfen:

public partial class Dept : IDept { }

Ausser den Klassen, die den benötigten Tabellen entsprechen benötigen wir ausserdem, auch noch den DataContext den Linq2Sql angelegt hat. Auch hier erstellen wir uns wieder ein Interface, welches die Klassen beinhaltet die wir im vorherigen Schritt ebenfalls mit einer Schnittstelle implementiert haben:

public interface IDataContext {
    System.Data.Linq.Table<Dept> Depts { get; }
}

Wenn wir die jeweiligen Interfaces in ein neues Projekt verschieben, welches unsere künftige Library repräsentiert, fällt schnell ein Problem auf: Hier ist die im Interface verwendete Klasse “Dept” unbekannt. Man könnte jetzt auf die Idee kommen hier einfach statt Dept das eben erstellte Interface IDept einzusetzen. Doch wenn wir dann in unserem Web dem Linq2Sql DataContext unser Interface zuweisen wie schon der partiellen Dept-Klasse zuvor bekommen wir eine Fehlermeldung: Der DataContext implementiert unser Interface nicht da dort “Depts” vom Typ “Table<Dept>” ist und eben nicht “Table<IDept>” wie von der Schnittstelle gefordert. Wir müssen also auch in IDataContext “Table<Dept>” verwenden.

Die Lösung ist ein typisierter Parameter für das Interface zu verwenden:

public interface IDataContext<Dept>
    where Dept : class, IDept {
    System.Data.Linq.Table<Dept> Depts { get; }
}

Über die where-Bedingung geben wir an, dass Dept eine Klasse sein muss welche außerdem das Interface IDept implementiert. Jetzt können wir innerhalb unserer Library sowohl mit dem DataContext als auch mit der Dept-Tabelle über die Interfaces arbeiten:

public class ClDept<TDept>
    where TDept : class, IDept {

    private IDataContext<TDept> _db;

    public ClDept(IDataContext<TDept> db) {
        _db = db;
    }

    public string GetUrlFromDept(int idDept) {
        var result = new StringBuilder();
       var dept = _db.Depts.SingleOrDefault(d => !d.Flg_del && d.Id_dept.Equals(idDept));
        if (dept.Equals(null))
            throw new ArgumentOutOfRangeException("idDept", "There is no dept entry with this id.");
        if (dept.Id_dept_parent.HasValue)
            result.Append(GetUrlFromDept((int)dept.Id_dept_parent));
        result.Append("/" + dept.Dept_name.CleanUrl());
        return result.ToString();
    }
}

Innerhalb der Webseite können wir auf unsere ausgelagerte Funktion nun ebenfalls recht einfach zugreifen nachdem wir die DLL referenziert haben. Zunächst müssen wir oben beschrieben die partiellen Klassen mit den Interfaces erweitert werden. Auf die Methode “GetUrlFromDept(int)” können wir ebenso einfach zugreifen:

var db = new Dms_meinweb(); //implementiert IDataContext<Dept>
var navHelper = new ClDept<Dept>(db);
string url = navHelper.GetUrlFromDept(25); // gibt bsp. “/Aktuelles/Veranstaltungen/Mainz” zurück


Fazit: Schreibt man für eine im grunde identische Funktionalität den Quellcode mehrfach (von der Copy-Pasta ganz zu schweigen) macht man etwas verkehrt. Die CCD sprechen von der Verletzung des DRY-Prinzips, doch egal wie man es nennt: Es ist fehleranfällig, mühsam bei einer Änderung überall anzupassen, unübersichtlich und schlußendlich genau so unangenehm wie schwül-warmes Sommerwetter!

Artikel empfehlen auf .NET-Kicks Deutschland

Silverlight: Drag & Drop Timing problems

17.07.2010 11:45:00 | Patric Schouler

If you use the new Silverlight 4 controls for drag&drop you have sometimes the problem that in your control the drag Event started even if you only select the next item in your listbox or treeview. The reason for this is that you maybe have long running events at your SelectedItem-Events. This forces the Drag&Drop-Container to raise a DragEnter-Event because the control does not become the MouseUp-Event in the desired time.

To solve this problem we made in our current project several approaches (Background process etc.). But the best way to reach your goal is a very “oldschool” method:

Using a timer to make your long running events  in the SelectedItem-Event

On SelectedItem Changed:
   1: var selectedEntryChangedTimer =
   2:                     new DispatcherTimer
   3:                         {
   4:                             Interval =
   5:                                 new TimeSpan(0, 0, 0, 0,
   6:                                             250)
   7:                         };
   8:                 selectedEntryChangedTimer.Tick += OnSelectedEntryChangedTimer;
   9:                 selectedEntryChangedTimer.Start();
 
Eventhandler:
   1: private void OnSelectedEntryChangedTimer(object o, EventArgs args)
   2: {
   3:     var timer = (DispatcherTimer)o;
   4:     timer.Stop();
   5:  
   6:     EventBroker.GetEvent<SelectedBilanzObjektChangedEvent>().Publish(
   7:         new SelectedBilanzObjektChangedEventArgs(_selectedEntry));
   8: }

Silverlight: Dataform Required field data UI customizing

17.07.2010 11:33:00 | Patric Schouler

If you use a dataform with the autogenerate property set to true, you can customize the behaviour and the look and feel of the dataform in the OnAutoGeneratingField Event.

For example you can set the look and feel of required fields to your individual style.

1. step: DataAnnotation for your properties
   1:  
   2:             [Display(Name = "WKN", ResourceType = typeof(DataResources), Order = 7)]
   3:             [StringLength(6, ErrorMessageResourceName = "ValidationErrorStringTooLong", ErrorMessageResourceType = typeof(ErrorResources))]
   4:             [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))]
   5:             public string WKN { get; set; }


2. step: Override OnAutoGeneratingField

Define your own DataForm control which inherits from DataForm. Then you can override the OnAutoGeneratingField method and do a lot of tricky things. Manipulating the behaviour of your autogenerated datafields or give them a different style. In my example we used in our project this mechanism to attach a GotFocus and LostFocus-Event to each TextBox and DatePicker, if there is a Required-Attribute defined.

   1: RequiredAttribute requiredAttribute = (RequiredAttribute)(from Attribute a in customAttributes 
   2:                   where a is RequiredAttribute select a).FirstOrDefault();
   3:  
   4: if (requiredAttribute != null) 
   5: {
   6:     if ((e.Field.Content is TextBox) || (e.Field.Content is DatePicker))
   7:     {
   8:         ((Control)e.Field.Content).GotFocus += new RoutedEventHandler(BilanzObjektDataForm_GotFocus);
   9:         ((Control)e.Field.Content).LostFocus += new RoutedEventHandler(BilanzObjektDataForm_LostFocus);
  10:     }
  11: }

The GotFocus- and LostFocus-Events looks like this:

   1: void BilanzObjektDataForm_LostFocus(object sender, RoutedEventArgs e)
   2:         {
   3:             // State auf "kein" Pflichtfeld setzen.
   4:             // State "normal" kann nicht definiert werden, da dieser eindeutig benamt werden muss
   5:             VisualStateManager.GoToState((Control)sender, "NotRequired", true);
   6:         }
   1: void BilanzObjektDataForm_GotFocus(object sender, RoutedEventArgs e)
   2:         {
   3:             // die Pflichtfeld-Behandlung gilt nur für TextBox- und DatePicker-Controls
   4:             // und nur dann, wenn der Text leer ist
   5:             if (((sender is TextBox) && (String.IsNullOrEmpty(((TextBox)sender).Text))) || 
   6:                 ((sender is DatePicker) && (String.IsNullOrEmpty(((DatePicker)sender).Text))))
   7:             {
   8:                 // State auf Pflichtfeld setzen
   9:                 VisualStateManager.GoToState((Control)sender, "Required", true);
  10:             }
  11:         }

In this Eventhandlers we use the VisualStateManager to give the controls, if the content is empty, a new visual state “Required” or in the other case the visual state “NotRequired”.

Now you have only to define the two new states in your style and you can enjoy the new Required field effect.

3. step: Add new States to your style

In the VisualStateManager section:

   1: <VisualStateGroup x:Name="RequiredStates">
   2:                                <VisualState x:Name="NotRequired">
   3:                                    <Storyboard>
   4:                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="PflichtfeldInfo">
   5:                                            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>                                            
   6:                                        </DoubleAnimationUsingKeyFrames>
   7:                                    </Storyboard>
   8:                                </VisualState>
   9:                                <VisualState x:Name="Required">
  10:                                    <Storyboard>
  11:                                        <Storyboard>
  12:                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="PflichtfeldInfo">                                                
  13:                                                <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1" >
  14:                                                    <EasingDoubleKeyFrame.EasingFunction>
  15:                                                        <CubicEase EasingMode="EaseOut"/>
  16:                                                    </EasingDoubleKeyFrame.EasingFunction>
  17:                                                </EasingDoubleKeyFrame>
  18:                                                <EasingDoubleKeyFrame KeyTime="0:0:2" Value="0"/>
  19:                                            </DoubleAnimationUsingKeyFrames>
  20:                                        </Storyboard>                                        
  21:                                    </Storyboard>
  22:                                </VisualState>
  23:                            </VisualStateGroup>

The content style:

   1: <Grid  >                              
   2:                                 <ScrollViewer x:Name="ContentElement" 
   3:                                               BorderThickness="0"
   4:                                               IsTabStop="False"
   5:                                               Margin="4,0,2,2"
   6:                                               VerticalAlignment="Center"  />
   7:                                 <TextBlock x:Name="PflichtfeldInfo"
   8:                                    Text="Pflichtfeld"
   9:                                    Style="{StaticResource PflichtfeldStyle}"
  10:                                    Opacity="0" />
  11:                             </Grid>                            
  12:                         </Grid>

Upgrade eines des MSF Agile 4.2 Templates nach Upgrade auf TFS 2010

15.07.2010 15:05:09 | Christian Binder

Nach Upgrade eines TFS 2008 auf TFS 2010 wird das Prozess Template nicht automatisch angepasst, so dass die neuen TFS 2010 Features nicht direkt zur Verfügung stehen. Hier sind also Manuelle Schritte notwendig, um die Neuen Features nutzen zu können. Hakan hat auf seinen Blog einen Script bereit gestellt, welches das Upgrade eines nicht angepassten MSF Agile 4.2 Templates teilautomatisiert. Download Hier.  Das Script kann als guter Startpunkt für eine Migration herangezogen werden und wenn notwendig angepasst werden.

smtp4dev – Dummy-Mailserver für Entwickler

14.07.2010 11:50:00 | Alexander Zeitler

Ab und an möchte man beim Entwickeln Mail-Funktionen testen und Test-Mails aus dem entwickelten Code absenden.

Da nicht auf jedem Entwicklungsrechner ein vollwertiger SMTP-Server installiert / konfiguriert ist, gibt es mit smtp4dev einen leichtgewichtigten SMTP-Server, der eben genau für solche Testfälle geeignet ist.

smtp4dev liegt im Systray und wartet unter der konfigurierten IP und dem entsprechenden Port auf Mails und zeigt diese beim Eintreffen an.

smtp4dev

In den Optionen lassen sich Features wie IP, Port oder Authentifizierung einstellen:

smtp4dev User Interface Options

smtp4dev Server Options


DotNetKicks-DE Image

Heimvorteil: TechEd 2010 in Berlin

14.07.2010 11:09:22 | Jens Häupel

Wir freuen uns, dass wir auch in diesem Jahr Gastgeberland sind und erneut tausende IT Begeisterte in Berlin begrüßen dürfen.

Vom 8. bis 12. November  2010 stellt Microsoft im Convention Center der Messe Berlin technische Neuerungen im Detail vor und gibt einen Ausblick auf zukünftige Technologien. 

clip_image002

Early Birds (bis 31.8.) sparen 200 € !  Hier geht’s zur Anmeldung.

Dateitypen für Windows 7 Explorer Preview registrieren leicht gemacht mit PreviewConfig

14.07.2010 10:05:00 | Alexander Zeitler

Wenn man Dateien hat, deren Endung noch nicht für die Windows 7 Explorer Preview registriert sind, kann man diese von Hand in der Registry nachtragen.

Oder man verwendet einfach PreviewConfig von Ramesh Srinivasan:

Einfach die gewünschte Dateiendung auswählen oder eintippen, Vorschau-Typ auswählen und auf Apply klicken:

PreviewConfig


DotNetKicks-DE Image

Die ASP.NET ObjectDataSource und abhängige Business Objekte

14.07.2010 09:08:57 | Andre Kraemer

Ja, ich gebe es offen und ehrlich zu! Ich habe sie noch nie wirklich genutzt, die ASP.NET WebForms ObjectDataSource. Irgendwie hatte ich ein Unbehagen bei der Vorstellung mir das alles bloß zusammen zu klicken und habe daher bisher einen Bogen um die ObjectDataSource gemacht. Außerdem habe ich bisher auch noch niemanden getroffen, der ernsthaft in Erwägung gezogen hätte die ObjectDataSource zu nutzen - oder sich zumindest getraut hätte, dies zuzugeben ;-)

Kürzlich war es dann aber soweit. meine Für eine kleine Demo startete ich damit, die serverseitige ASP.NET MVC Implementierung meiner Beispielanwendung für meinen jQuery Vortrag auf der dotnet Colgone nach Webforms zu konvertieren. Mein Ziel war es dabei, wo immer es nur geht, den WebForms "Baukasten" zu nehmen. Da ich bereits einen bestehenden Business Service hatte, der mir meine Objekte laden und persistieren konnte, kreuzte sie nun also meinen Weg, die ObjectDataSource.

Nach ein paar Klicks durch den Wizzard und einem beherztem F5 bestätigte sich vorerst mein initiales Vorurteil: "Totaler Mist!".

Mein Business Service hatte nämlich eine Abhängigkeit auf eine weitere Klasse, die für die  Datenhaltung zuständig war. Diese Abhängigkeit fand sich in meinem Quellcode in Form eines Konstruktor Parameters wieder. In meiner ASP.NET MVC Implementierung war der DI Container StructureMap für das Auflöösen dieser Abhängigkeit zuständig.

Die WebForms Variante brach die Ausführung des Codes nun allerdings mit einer Exception ab und wies mich in freundlichem Gelb darauf hin, dass mein Business Objekt keinen parameterlosen Konstruktor hätte.

In der Hoffnung, eine Factory für mein Business Objekt angeben zu können durchsuchte ich also die Eigenschaften der ObjectDataSource. Leider wurde ich nicht fündig, fluchte ein wenig darüber, dass meine Anforderung doch gar nicht so ungewöhnlich wäre und beendete Visual Studio frustriert.

Glücklicherweise guckte ich ein wenig später doch noch mal nach einer Lösung. So kann zwar keine Eigenschaft für eine Factory angegeben werden, stattdessen wird jedoch ein Ereignis zur Verfügung gestellt, in dem ich das entsprechende Business Objekt erstellen und meiner ObjectDataSource zuweisen kann.

Konkret sieht dies wie folgt aus:

protected void AufgabenDataSource_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
   AufgabenService service = ObjectFactory.GetInstance<AufgabenService>
   e.ObjectInstance = service;
}

Nun habe ich über die ObjectFactory zwar einen direkten Verweis innerhalb meiner CodeBehind Datei auf den genutzten DI Container (in meinem Fall StructureMap), dies ist mir aber immer noch lieber, als die Abhängigkeit zur Persistenzschicht in meinem Business Service hart zu verdrahten.

Und die Moral von der Geschicht ...

... lautet: Erst ausprobieren und dann (gegebenenfalls) meckern ;-)

Die ASP.NET ObjectDataSource und abhängige Business Objekte

14.07.2010 07:08:57 | Andre Kraemer

Ja, ich gebe es offen und ehrlich zu! Ich habe sie noch nie wirklich genutzt, die ASP.NET WebForms ObjectDataSource. Irgendwie hatte ich ein Unbehagen bei der Vorstellung mir das alles bloß zusammen zu klicken und habe daher bisher einen Bogen um die ObjectDataSource gemacht. Außerdem habe ich bisher auch noch niemanden getroffen, der ernsthaft in Erwägung gezogen hätte die ObjectDataSource zu nutzen - oder sich zumindest getraut hätte, dies zuzugeben ;-)

Kürzlich war es dann aber soweit. meine Für eine kleine Demo startete ich damit, die serverseitige ASP.NET MVC Implementierung meiner Beispielanwendung für meinen jQuery Vortrag auf der dotnet Colgone nach Webforms zu konvertieren. Mein Ziel war es dabei, wo immer es nur geht, den WebForms "Baukasten" zu nehmen. Da ich bereits einen bestehenden Business Service hatte, der mir meine Objekte laden und persistieren konnte, kreuzte sie nun also meinen Weg, die ObjectDataSource.

Nach ein paar Klicks durch den Wizzard und einem beherztem F5 bestätigte sich vorerst mein initiales Vorurteil: "Totaler Mist!".

Mein Business Service hatte nämlich eine Abhängigkeit auf eine weitere Klasse, die für die  Datenhaltung zuständig war. Diese Abhängigkeit fand sich in meinem Quellcode in Form eines Konstruktor Parameters wieder. In meiner ASP.NET MVC Implementierung war der DI Container StructureMap für das Auflösen dieser Abhängigkeit zuständig.

Die WebForms Variante brach die Ausführung des Codes nun allerdings mit einer Exception ab und wies mich in freundlichem Gelb darauf hin, dass mein Business Objekt keinen parameterlosen Konstruktor hätte.

In der Hoffnung, eine Factory für mein Business Objekt angeben zu können durchsuchte ich also die Eigenschaften der ObjectDataSource. Leider wurde ich nicht fündig, fluchte ein wenig darüber, dass meine Anforderung doch gar nicht so ungewöhnlich wäre und beendete Visual Studio frustriert.

Glücklicherweise guckte ich ein wenig später doch noch mal nach einer Lösung. So kann zwar keine Eigenschaft für eine Factory angegeben werden, stattdessen wird jedoch ein Ereignis zur Verfügung gestellt, in dem ich das entsprechende Business Objekt erstellen und meiner ObjectDataSource zuweisen kann.

Konkret sieht dies wie folgt aus:

protected void AufgabenDataSource_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
    AufgabenService service = ObjectFactory.GetInstance<AufgabenService>();
    e.ObjectInstance = service;
}

Nun habe ich über die ObjectFactory zwar einen direkten Verweis innerhalb meiner CodeBehind Datei auf den genutzten DI Container (in meinem Fall StructureMap), dies ist mir aber immer noch lieber, als die Abhängigkeit zur Persistenzschicht in meinem Business Service hart zu verdrahten.

Und die Moral von der Geschicht ...

... lautet: Erst ausprobieren und dann (gegebenenfalls) meckern ;-)



blog.codemurai.de © André Krämer |Impressum | Abonieren

.NET User Group Karlsruhe: Vedea und MCCS

14.07.2010 00:20:00 | Alexander Zeitler

.NET Usergroup Karlsruhe Logo

Am 22.07.2010 um 18:00 Uhr findet das nächste Treffen der .NET Usergroup Karlsruhe (XING-Gruppe der .NET Usergroup Karlsruhe) statt.

Themen

Vedea und MCCS

Details zu den Themen

Andreas Heil gibt einen Einblick in die Arbeit von Microsoft Research ahnhand der beiden Projekte Vedea und MCCS.

 Vedea

Veedea - Projekt (Microsoft Visualization Language)
http://blogs.msdn.com/b/martinca/archive/2009/12/03/introducing-the-microsoft-visualization-language.aspx

 

Microsoft Computational Science Studio

Microsoft Computational Science Studio (MCCS)
http://blogs.msdn.com/b/martinca/archive/2009/11/02/microsoft-computational-science-studio.aspx

 

Über den Sprecher

Andreas Heil ist ein unabhängiger Software Ingenieur, Berater und Autor.
Er ist Autor für das dotnetpro Magazin und zurzeit arbeiter er beratend für Microsoft Computational Science Laboratory in Cambridge, UK.

Teilnahme

Bitte meldet Euch wieder via XING an, die Location ist wieder DJK-Ost:

DJK-Ost
Friedrichstaler Allee 52
76131 Karlsruhe


DotNetKicks-DE Image

Microsoft Dynamics NAV 2009 –> SP1

13.07.2010 23:23:41 | Nico Franze

Ich richte gerade meinen tollen neuen NAV-Server ein und habe erst 2009 installiert und danach erst das SP1 (ja, es ist schon spät und dunkel draußen).

Auf jeden Fall hatte ich einen lustigen Fehler beim Starten des rllenbasierten Clients. Die Pages wurden nicht richtig dargestellt und es entstand folgender Fehler:

Fehler: Die Metadaten für das Objekt vom Typ 'Page' mit der ID '9060' befinden sich in einem
fehlerhaften Zustand, der auf eine frühere Ausnahme zurückzuführen ist:

Fehler beim Kompilieren von Assembly 'C:\ProgramData\Microsoft\Microsoft Dynamics
NAV\60\Server\MicrosoftDynamicsNavServer\assembly\Page9060.dll'. Dies kann auf
Unterschiede zwischen Binärdateien in der Installation oder der Datenbank zurückzuführen
sein. Stellen Sie sicher, dass alle Installationskomponenten konsistent und auf dem neuesten
Stand sind. Fehlerdetails: 'c:\ProgramData\Microsoft\Microsoft Dynamics
NAV\60\Server\MicrosoftDynamicsNavServer\source\Page\Page9060.cs(63,9) : error CS1501:
Keine Überladung für die Methode RegisterSourceExpression erfordert 5-Argumente...

So, nun, nach ca. zwei Stunden herumexperimentieren ist die Lösung einmal wieder ganz einfach. Ab in den klassischen Client und einmal im Objekt Designer einfach alles komplett durchkompilieren… Und siehe da.. es geht. So komisch hier sah das aus…

RTC error

Einfach laufen lassen! Mit Tools und Applikationen, die alles veraendern!

13.07.2010 23:09:46 | Kay Giza

Und was werden Sie mit Visual Studio 2010 alles tun? Ich sage nur: Mops, Krokodil oder Hai - Hauptsache, es läuft. ;-)
 


Mehr Informationen zu Visual Studio finden Sie auf der Microsoft Produkt-Webseite zu Visual Studio

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Notepad++ mit git verwenden

13.07.2010 21:18:00 | Alexander Zeitler

Wenn man msysgit unter Windows installiert, wird als Default-Editor vi installiert.

Will man stattdessen einen anderen Editor, z.B. Notepad++ verwenden, muss man Kommando in der Git Bash aufrufen:

$ git config --global core.editor "'C:\Program Files (x86)\Notepad++\Notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

Ruft man danach z.B.

git commit -a

auf, wird dann Notepad++ gestartet, um die Commit-Message zu bearbeiten:

Git Commit Message In Notepad++

Nach dem Schließen von Notepad++ wird der Commit entsprechend ausgeführt:

Erfolgter Git Commit

Update:

Verwendet man Cygwin, muß der Aufruf wie folgt lauten:

$ git config --global core.editor "'C:/Program Files (x86)/Notepad++/Notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
DotNetKicks-DE Image

Sharing my ‘Daily Fun’ links

13.07.2010 19:16:09 | Gordon Breuer

Gooood morning... Do you know this situation: You just got into office, reading all those mails you got since quitting time, starting up your main programs to work with, drinking your first bland office coffee … but there is missing just a love tap to actually begin with your daily work?


I gathered a small collection of web-comics and other funny stuff to fill just those 10 lazy minutes you need to acclimate and actually begin with your work. Most of them are english, some of them are dev-related and two links at the end with german content. You may take the first link to a ShareTabs-Page with all links arranged on one website with a small preview image, or you may cherry-pick only those you like most from the list below.

And here are the links it will display in tab format:

Have Fun! :-)

kick it on .NET Kicks Artikel empfehlen auf .NET-Kicks Deutschland

WP7 CTP and Beta bug: IsolatedStorageFile.GetFileNames("searchPattern”)

13.07.2010 15:58:39 | Peter Nowak

I’ve just stumbled over the method IsolatedStorageFile.GetFileNames("searchPattern”).

Lets take the given code:

try

            {

IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();

 

                file.CreateFile("test1.txt").Close();

                file.CreateFile("test2.txt").Close();

                file.CreateFile("test3.txt").Close();

                file.CreateFile("test4.txt").Close();

                file.CreateFile("test5.txt").Close();

                file.CreateFile("leer1.txt").Close();

                file.CreateFile("leer2.txt").Close();

                file.CreateFile("leer3.txt").Close();

                file.CreateFile("leer4.txt").Close();

                file.CreateFile("leer5.txt").Close();

 

string[] files = file.GetFileNames();

                files = file.GetFileNames("test*.txt"); //Returns 10 entries, instead of 5

 

            }

catch (IsolatedStorageException ios)

            {

            }

 

This shows that GetFileNames with search patterns fails in CTP and current beta returning in the sample with 10 entries, instead of 5.

If you use the sample including a subfolder, the values returned are correct.

 

SO, forr now, beware using this method on the Isolated Storage base folder.



This posting is provided "AS IS" with no warranties, and confers no rights.

WP7 CTP uninstalling issues

13.07.2010 15:49:51 | Peter Nowak

If you still haven’t heard of it: The Visual Studio 2010 Express for Windows Phone Beta has been released yesterday.

For installing this beta version, it is necessary to uninstall the April CTP.

In general it is a good thing to have a VM running the bits, as you can install them fresh. But there are sometimes circumstances that this isn’t possible, which leads a couple of times, that the uninstall fails of several reasons.

Ginny Caughey, as well a Device Application Development MVP, sharred a linkt to the US forums, which gives a few good advices and tipps, how to come around some uninstallation issues. The forum post can be found here.

Thanks Ginny!



This posting is provided "AS IS" with no warranties, and confers no rights.

PDC 2010

13.07.2010 10:39:34 | Jens Häupel

Ja, es wird in diesem Jahr wieder eine PDC geben. Leider nicht in LA, sondern in Redmond, auf dem Microsoft Campus. Aber da ist ja zumindest die Landschaft schöner und das Wetter ist eigentlich auch besser als sein Ruf.

Wann und wo?

  • 28.-29. October 2010
  • Hosted at the Microsoft Conference Center, Building 33, Redmond
  • Steve Ballmer wird die Keynote halten

Themen: “Devices + Cloud”

  • Windows Phone 7
  • Cloud Services
  • Web

Customer registration is open!

clip_image002

Sharing my ‘Daily Fun’ links

13.07.2010 10:16:09 | Gordon Breuer

Gooood morning... Do you know this situation: You just got into office, reading all those mails you got since quitting time, starting up your main programs to work with, drinking your first bland office coffee … but there is missing just a love tap to actually begin with your daily work?


I gathered a small collection of web-comics and other funny stuff to fill just those 10 lazy minutes you need to acclimate and actually begin with your work. Most of them are english, some of them are dev-related and two links at the end with german content. You may take the first link to a ShareTabs-Page with all links arranged on one website with a small preview image, or you may cherry-pick only those you like most from the list below.

And here are the links it will display in tab format:

Have Fun! :-)

kick it on .NET Kicks Artikel empfehlen auf .NET-Kicks Deutschland

Exam 71-573: Microsoft SharePoint 2010 Application Development

13.07.2010 07:41:00 | Martin Hey

Mitte Mai bekam ich eine Mail von Microsoft, in der ich gefragt wurde ob ich nicht an den Beta-Prüfungen zu SharePoint 2010 teilnehmen möchte. Zu jeder der vier neuen Prüfungen gab es einen Promo-Code. Da es zeitlich gerade nicht ganz so rosig aussah, entschied ich mich zumindest eine der Prüfungen anzugehen und die MCTS in WSS 3.0 Application Development und MOSS 2007 Application Development auf SharePoint 2010 anzuheben.
Das spannende an Beta-Prüfungen ist: Man erfährt nicht sofort, ob man bestanden hat. Man ist ja gemeinsam mit vielen anderen das "Versuchskaninchen" für die neuen Fragen. Oft dauert die Auswertung mehrere Wochen oder bis zum Release der eigentlichen Prüfung. Heute morgen nun war es soweit: Eine neue Mail von Microsoft berichtet mir davon, dass ich das Exam bestanden habe und nun MCTS für SharePoint 2010 Application Development bin.
Ich freue mich darüber und wenn ich wieder eine Einladung zu einer Beta-Prüfung bekomm, werd ich das Angebot sicher wieder in Anspruch nehmen.

Game - Mount & Blade - Warband

10.07.2010 16:45:00 | Ozgur Aytekin

In a land torn asunder by incessant warfare, it is time to assemble your own band of hardened warriors and enter the fray. Lead your men into battle, expand your realm, and claim the ultimate prize: the throne of Calradia.

In a genre all its own, come experience The one and only Medieval combat /kingdom building sandbox game.
Mount and Blade Warband is a unique blend of intense strategic fighting, real time army command, and deep kingdom management.


http://www.taleworlds.com/main.aspx

RIA Services: Windows Phone 7 and SOAP endpoint

10.07.2010 15:53:00 | Patric Schouler

You can use RIA services as a normal WCF service with several clients. For example as Excel OData-Source or as data delivery service for your Windows Phone 7 application. To achieve this goal you have to install the latest RIA Services Toolkit and do a little configuration work.

Reference for Microsoft.ServiceModel.DomainServices.Hosting

Add a reference of Microsoft.ServiceModel.DomainServices.Hosting to your RIA Services project.

It is important that you choose the version which was shipped by the RIA Services (Silverlight) toolkit. The standard standard assembly from the SDK does not contain the SoapXmlEndpointFactory and JSonEndpointFactory.

So take this one:

image

For the OData endpoint you need the System.ServiceModel.DomainServices.Hosting.OData assembly from the SDK directory.

Configure the endpoints

Configure the Json, Soap and OData endpoints in the web.config:

<system.serviceModel>
      <domainServices>
        <endpoints>
          <add name="Soap" 
               type="Microsoft.ServiceModel.DomainServices.Hosting.SoapXmlEndpointFactory, Microsoft.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
          <add name="Json" 
               type="Microsoft.ServiceModel.DomainServices.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
          <add name="OData"
               type="System.ServiceModel.DomainServices.Hosting.ODataEndpointFactory, System.ServiceModel.DomainServices.Hosting.OData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </endpoints>
      </domainServices>
       <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
     </system.serviceModel>
Using of RIA Services in your Windows Phone 7 application

To use the rias service (Soap endpoint) in your Windows Phone 7 application you have only to add a new reference and enter the Uri of your ria service.

Your Uri consists of the <namespace of your ria service>-<classname of your ria service>.svc where “.” are replaced with “-“ !

image

 

Now you can create a proxy client and access to your Domainservice methods:

   1: public partial class MainPage : PhoneApplicationPage
   2:     {
   3:         object _selectedItem;
   4:         PrivatbilanzService.FinancialPlanningDomainServiceSoapClient client;
   5:  
   6:         public MainPage()
   7:         {
   8:             InitializeComponent();
   9:  
  10:             client = new PrivatbilanzService.FinancialPlanningDomainServiceSoapClient();
  11:  
  12:             SupportedOrientations = SupportedPageOrientation.Portrait;
  13:             Loaded += new RoutedEventHandler(MainPage_Loaded);
  14:  
  15:             PageTransitionList.Completed += new EventHandler(PageTransitionList_Completed);
  16:  
  17:             // Set the data context of the listbox control to the sample data
  18:             DataContext = new MainViewModel();
  19:         }

 

Uri of all endpoints

The Uri for our exposed endpoints are:

OData : http://localhost:[portnumber]/<namespace of your ria service>-<classname of your ria service>.svc/OData/

SOAP: http://localhost:[portnumber]/<namespace of your ria service>-<classname of your ria service>.svc

JSON: http://localhost:[portnumber]/<namespace of your ria service>-<classname of your ria service>.svc/JSON/

With these exposed endpoints, you can talk to multiple clients:

  • Excel Power pivot - Using the OData endpoint
  • Windows Phone 7 – Using the SOAP endpoint
  • AJAX client – Using the JSON endpoint

MSSQL Server alle Tabellen- und Spaltennamen aufisten

10.07.2010 14:03:00 | Timo Rehl

Wer die komplette Struktur einer Datenabank einmal ausgeben lassen möchte, der kann das mit folgenden SQL Zeilen sehr schnell realisieren:
SELECT SysObjects.[Name] as TableName, SysColumns.[Name] as ColumnName, SysTypes.[Name] As DataType, SysColumns.[Length] As Length
FROM SysObjects
INNER JOIN SysColumns ON SysObjects.[Id] = SysColumns.[Id]
INNER JOIN SysTypes ON SysTypes.[xtype] = SysColumns.[xtype]
WHERE SysObjects.[type] = 'U'
ORDER BY SysObjects.[Name]

[Poll] Nutzt ihr den Social-Micropayment-Dienst Flattr?

09.07.2010 22:12:05 | Gordon Breuer

Diese kleine Abstimmung ist hauptsächlich ein Test der BlogPoll REST API und einem passenden Plugin für den Windows Live Writer von Dariusz Parys, das sich noch in der Beta-Phase befindet.

Ich persönlich finde so ein Plugin grundsätzlich ja schon praktisch, da man so unabhängig von der Blog-Plattform relativ schnell eine Abstimmung einbinden kann. Und die Verwendung von Silverlight finde ich persönlich ja sowieso schon mal cool ;-)

VisualStudio Debug Visualizer für Dictionary

09.07.2010 14:04:00 | Timo Rehl

Dieser Artikel wurde zum 1. Mal am 09.07.2010 upgedatet

Ich habe nun sehr oft das Problem, dass ich in VisualStudio in einer Debug Session den Inhalt eines Dictionaries mir anzeigen, oder gar verändern möchte. Dictionaries sind bei mir recht häufig als Übergabeparameter definiert.

Was sind "Debug Visualizer"?

Debug Visualizer kennt jeder (aber wahrscheinlich nicht mit dem Begriff ;-). Ein berühmtes Beispiel ist der String-Visualizer:



Ich habe nun für VisualStudio 2005 und 2010 einen eigenen Visualizer für Dictionaries geschrieben.

Dictionary Visualizer Solution Aufbau:


Ein eigner Visualizer ist grundsätzlich vom Aufbau her immer gleich:
- Der Visualizer ist eine Class Library
- Es existiert eine Einstiegsklasse, die vom VS Debugger aufgerufen werden kann
- Es gibt ein Datenobjekt, das der Debugger zum (de-)serialisieren verwendet
- In der AssemblyInfo stehen die Informationen, damit VS weiß, welche Objekte mit dem Visualizer angezeigt werden können

In meinem Beispielprojekt ist das so aufgeteilt:
- DictionaryVisualizer.cs => Einstiegsklasse, die von der abstrakten Klasse DialogDebuggerVisualizer abgeleitet ist
- DictionarySource.cs => Die Datenklasse, von VisualizerObjectSource abgeleitet
- frmDictionaryVisualizer.cs => Das anzuzeigende Dialogfenster (äußerst trivial gehalten ;-)
- DataTableConverter.cs => Hilfsklasse, die Konvertierungen von und zu DataTables realisiert

Beschreibung der einzelnen Bestandteile:

DictionaryVisualizer.cs:

    /// <summary>
    /// Visualisiert ein Dictionary in einer Debug Session.
    /// </summary>
    public class DictionaryVisualizer : DialogDebuggerVisualizer
    {
        /// <summary>
        /// Zeigt einen modalen Dialog, das den Inhalt des Dictionaries visualisiert.
        /// </summary>
        /// <param name="windowService">Der Windows Context, in dem der Debugger läuft.</param>
        /// <param name="objectProvider">Das Dictionary-Objekt, das visualisiert werden soll.</param>
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            IDictionary dictToShow = null;
            
            // Versuchen, das Objekt aus dem Debugger zu extrahieren
            try
            {
                dictToShow = objectProvider.GetObject() as IDictionary;
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    String.Format("Folgender Fehler ist aufgetreten:\n{0}\nStack:\n{1}", ex.Message, ex.StackTrace),
                    "Fehler",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);

                // Fehler werden ausgegebenund weitere Schritte werden ignoriert
                dictToShow = null;
            }

            // Dictionary anzeigen lassen
            if (dictToShow != null)
            {
                using (frmDictionaryVisualizer dialog = new frmDictionaryVisualizer())
                {
                    dialog.Data = DataTableConverter.ConvertFromDictionary(dictToShow);
                    windowService.ShowDialog(dialog);
                    objectProvider.ReplaceObject(DataTableConverter.ConvertToIDictionary(dialog.Data, dictToShow.GetType()));
                }
            }
        }
    }

Die Methode Show wird vom Debugger ausgeführt, wenn auf die Lupe gedrückt wird (siehe TextVisualizer-Bild oben). Der Ablauf ist Straight-Forward:
- Zunächst wird versucht das eingehende Objekt aus dem objectProvider in ein IDictionary Objekt zu casten
- Sollte das geklappt haben, so wird aus dem Objekt ein DataTable Objekt konvertiert und dem Dialog übergeben
- Ist der Dialog zurückgekehrt, so wird dessen DataTable in ein neues Dictionary des gleichen Typs gewandelt und dem Debugger zurückgegeben

DictionarySource.cs:

    public class DictionarySource : VisualizerObjectSource
    {
        public override void GetData(object target, System.IO.Stream outgoingData)
        {
            IDictionary dictToSerialize = target as IDictionary;
            if (dictToSerialize != null)
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(outgoingData, dictToSerialize);
            }
        }
    }

Ebenfalls sehr einfach gestrickt. Hier wird die Methode GetData überschrieben, damit eine eigene Serialisierung des IDictionary Objektes stattfinden kann. Das ist quasi nur ein BinaryFormatter Wrapper.

AssemblyInfo.cs:

Hier ist es wichtig, dass über Attribute definiert wird, welche Objekte für einen Visualizer überhaupt in Frage kommen. Das definiert sich folgendermaßen:
[assembly: System.Diagnostics.DebuggerVisualizer(typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionaryVisualizer),
           typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionarySource),
           Target = typeof(System.Collections.DictionaryBase),
           Description = "Visualize IDictionary")]
[assembly: System.Diagnostics.DebuggerVisualizer(typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionaryVisualizer),
           typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionarySource),
           Target = typeof(System.Collections.Hashtable),
           Description = "Visualize IDictionary")]
[assembly: System.Diagnostics.DebuggerVisualizer(typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionaryVisualizer),
           typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionarySource),
           Target = typeof(System.Collections.Specialized.ListDictionary),
           Description = "Visualize IDictionary")]
[assembly: System.Diagnostics.DebuggerVisualizer(typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionaryVisualizer),
           typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionarySource),
           Target = typeof(System.Collections.Specialized.HybridDictionary),
           Description = "Visualize IDictionary")]
[assembly: System.Diagnostics.DebuggerVisualizer(typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionaryVisualizer),
           typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionarySource),
           Target = typeof(System.Collections.Specialized.OrderedDictionary),
           Description = "Visualize IDictionary")]
[assembly: 
System.Diagnostics.DebuggerVisualizer(typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionaryVisualizer),
          
 typeof(Rehl.DebuggingTools.DictionaryVisualizer.DictionarySource),
          
 Target = typeof(System.Collections.Generic.Dictionary<,>),
          
 Description = "Visualize IDictionary")]

Der Aufbau ist fast selbsterklärend. Der erste Parameter einer jeden Visualizer Definition ist der entsprechend aufzurufende Visualizer. In meiner ClassLibrary gibt es nur den einen DictionaryVisualizer. Der zweite Parameter bestimmt das Objekt, das zum (de-)serialisieren verwendet wird. Hier also auch immer wieder nur eines, nämlich das DictionarySource. Das Target definiert das Objekt, für welches der Visualizer gelten soll. In meiner Sammlung werden also DictionaryBase, Hashtable, ListDictionary, HybridDictionary und OrderedDictionary unterstützt.

Leider habe ich bis jetzt keine Möglichkeit gefunden generische Objekte hierfür definieren zu können. Wenn hier einer mehr weiß, dann kann er mir die Info gerne zukommen lassen, das wüde ich auch mit einbauen. Als Workaround kann man im Debugger ohne Probleme ein generisches Dictionary zu einem statischen casten und dnn die Visualisierung darauf laufen lassen.
Update: Inzwischen habe ich es herausgefunden, das war zu einfach ;-)

frmDictionaryVisualizer.cs und DataTableConverter.cs:
Auf diese beiden Bestandteile gehe ich jetzt nicht im Detail ein, das kann jeder nach Interesse selbst in der Solution erforschen.

Installation des Visualizers:
1. Die Solution mit VisualStudio öffnen und einmal als Release durchkompilieren lassen.
2. Dann VisualStudio schließen
3. Die Rehl.DebuggingTools.DictionaryVisualizer.dll aus dem bin/release Ordner in das entsprechende VisualStudio Verzeichnis kopieren, bei mir wäre das z.B. D:\Program Files\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\Visualizers
4. VisualStudio neu starten

Anwendung des Visualizers:
Sollte das Kompilieren und Kopieren abgeschlossen sein, so befindet sich in meiner Solution ein Test Konsolenprojekt, das eine eigene HashTable befüllt und an eine Testmethode übergibt.
Es sollte ein Breakpoint an der Stelle
string s = "OnlyToStopDebugger!";
gesetzt werden und dann Debugging des Projektes gestartet werden (wieder auf Debug umstellen nach einer Installation!).
Jetzt kann, wenn das Programm angahalten hat mit der Maus über den Übergabeparameter IDictionary data gefahren werden, und die Lupe erscheint. Sollte keine Lupe zu sehen sein, dann hat etwas mit der Installation nicht geklappt.
Ein Klick auf diese Lupe lässt das Dialogfenster erscheinen:


Jetzt lässt sich der Inhalt sortieren, und auch editieren.

Besonderes zu beachten:
Sollten eigene Dictionary Implementierungen verwendet werden, dann empfiehlt es sich von einem oben genannten Objekt abzuleiten. Weiterhin muss beachtet werden, dass das Serializable Attribut und eine Implentierung des Sonderkonstruktors für ISerializable vorhanden sin. In meiner Testapplikation wird das realisiert:
    [Serializable]
    public class InheritanceTestClass : Hashtable, ISerializable
    {
        public InheritanceTestClass()
            : base()
        {
        }

        public InheritanceTestClass(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
    }


Downlaod:
VS2005 Solution
VS2010 Solution

[Poll] Nutzt ihr den Social-Micropayment-Dienst Flattr?

09.07.2010 13:12:05 | Gordon Breuer

Diese kleine Abstimmung ist hauptsächlich ein Test der BlogPoll REST API und einem passenden Plugin für den Windows Live Writer von Dariusz Parys, das sich noch in der Beta-Phase befindet.

Ich persönlich finde so ein Plugin grundsätzlich ja schon praktisch, da man so unabhängig von der Blog-Plattform relativ schnell eine Abstimmung einbinden kann. Und die Verwendung von Silverlight finde ich persönlich ja sowieso schon mal cool ;-)

Neuer Artikel bei dotnetpro: TDD Anti-Patterns - Am schlechten Beispiel lernen

09.07.2010 10:45:17 | Gregor Biswanger

In der aktuellen Ausgabe der dotnetpro gibt es einen neuen Artikel meinerseits:

dotnetpro-logo

Am schlechten Beispiel lernen

Das „Test-Driven Development“ hat sich durch seine vielen positiven Aspekte einen hohen Rang in der Softwarearchitektur erarbeitet. Dennoch fällt es immer wieder schwer, den Einstieg dazu zu finden. Dieser kann unter Umständen besser gelingen, wenn er sich nicht an den guten Vorbildern, sondern vielmehr an schlechten Beispielen und ihren Konsequenzen entlanghangelt.

A1008TDDAnti-Cover

Zu lesen ist der Artikel bei dotnetpro, Ausgabe 08/2010.
Oder http://www.dotnetpro.de/articles/onlinearticle3397.aspx

WCF REST-Services mit ASP.NET über Routen verheiraten

09.07.2010 00:18:36 | Manfred Steyer

WCF REST-Services können ab .Net 4 über ASP.NET-Routen veröffentlicht werden, sofern vom ASP.NET- Kompatibilitätsmodus gebraucht gemacht wird. Zur Veranschaulichung zeigt das folgende Listing eine Implementierung der Methode RegisterRoutes, welche unter anderem eine ServiceRoute, welche auf den REST-Service FlugService verweist, registriert. An den Konstruktor dieser Methode wird die Route, eine Instanz von WebServiceHostFactory sowie der Typ der Service-Implementierung übergeben. Dies bewirkt, dass der REST-Service über die Url FlugService verfügbar gemacht wird.


public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

WebServiceHostFactory factory = new WebServiceHostFactory();
routes.Add(new ServiceRoute("FlugService", factory, typeof(FlugService.FlugService)));

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}




Dieser Eintrag ist ein Auszug aus meinem aktuellen Buch .Net 4 Update , das ich zusammen mit Holger Schwichtenberg verfasst habe.

Eine neue Folge von msdn tv ist online: Ausgabe 11/2010

08.07.2010 17:52:09 | Oliver Scheer

„msdn tv – Nachrichten für Entwickler“ meldet sich diesmal vom Microsoft „Web Camp“, das im Juni in der Nähe von München stattgefunden hat. Interviewpartner dort war Jon Galloway, ASP.NET Community Program Manager und einer der Referenten der Veranstaltung. Er verrät u.a., was er vom ASP.NET MVC 2 hält.
Vorab zum Einstieg aber wie immer zunächst ein paar Kurznachrichten: Los geht’s mit Neuigkeiten zur Internet Explorer 9 Platform Preview 3, der aktuellen Entwicklervorschau auf die nächste Generation des Internet Explorer. Außerdem gibt’s Infos zu einer Videoaufzeichnung der letzten TechTalk-Roadshow, die sich mit der Entwicklung von Windows Phone Apps beschäftigt hat, zu einer neuen MSDN-Orientierungshilfe rund um Visual Studio 2010, einer Webcast-Serie über ‘C++0x‘ und dem Service Pack 3 für Exchange Server 2007.

http://msdn-online.de/msdntv

Get Microsoft Silverlight

msdn tv–Nachrichten für Entwickler (Ausgabe 11/2010)

07.07.2010 15:30:34 | Jan Schenk

Get Microsoft Silverlight


„msdn tv – Nachrichten für Entwickler“ meldet sich diesmal vom Microsoft „Web Camp“, das im Juni in der Nähe von München stattgefunden hat. Interviewpartner dort war Jon Galloway, ASP.NET Community Program Manager und einer der Referenten der Veranstaltung. Er verrät u.a., was er vom ASP.NET MVC 2 hält.
Vorab zum Einstieg aber wie immer zunächst ein paar Kurznachrichten: Los geht’s mit Neuigkeiten zur Internet Explorer 9 Platform Preview 3, der aktuellen Entwicklervorschau auf die nächste Generation des Internet Explorer. Außerdem gibt’s Infos zu einer Videoaufzeichnung der letzten TechTalk-Roadshow, die sich mit der Entwicklung von Windows Phone Apps beschäftigt hat, zu einer neuen MSDN-Orientierungshilfe rund um Visual Studio 2010, einer Webcast-Serie über ‘C++0x‘ und dem Service Pack 3 für Exchange Server 2007.


msdn tv ist ein neues Video-Nachrichtenformat, und hat seinen Ursprung auf MSDN Online (http://www.msdn-online.de/msdntv/). Alle zwei Wochen präsentiert Ihnen Jan Schenk, Developer Evangelist mit Hut, die wichtigsten Neuigkeiten für Entwickler, Hintergrundberichte und Interviews zu aktuellen Technologien sowie Highlights von Messen und Konferenzen. Das ganze kompakt, in ca. 15 Minuten erfrischend jung verpackt , und sowohl als Download für Ihren Rechner oder im Online-Player per Streaming verfügbar.

msdn tv is a German-speaking new and innovative video news series, and has originally been featured exclusively on the German MSDN Online Platform (http://www.msdn-online.de/msdntv/). Hatted Developer Evangelist Jan Schenk biweekly presents latest news for developers, background-stories and interviews concerning current and upcoming technologies, as well as video-highlights from fairs and conferences. Packed into 15 minutes, these news videos feature a fresh informative style, and are downloadable as well as available as online streaming video.

Link-Sammlung zu Office Development

07.07.2010 15:21:00 | Jens Häupel

Q&A

Basics

Upgrading

Behind the scenes

Performance

Deployment & Security

Native

Samples

Tip: Accessing Content Build files in WP7

07.07.2010 10:06:34 | Peter Nowak

As playing around a bit with the WP7 functionality, I wanted to create a small sample, which loads XAML Elements dynamically into the Page. No magic here.

The XAML fragment to be loaded has been extracted to a file called XamlFragment.xaml. I set in the Properties window of VS 2010  the Build Action to Content and deleted the value for the Custom Tool.

The idea was to package the file withe the XAP file and deploy it, so the SL App could read the file directly.

What I totally forgot about was the fact, that SL Apps have only access  to the Isolated Storage. But the Isolated Storage in fact is a subfolder of the Apps folder, where the XAP files get deployed. So how to access the file?

After searching a bit around I found out, that XNA has the same issue on accessing files like textures etc., which are packed within the XAP.

Therefore the Assembly Microsoft.Xna.Framework contains the static class TitleContainer.

Executing “TitleContainer.OpenStream(‘XamlFragment.xaml’)” returned an object of type stream, which could be accessed by my StreamReader.

(Please keep in mind that this stream is readonly)

 

More info on the TitleContainer class can be found here.



This posting is provided "AS IS" with no warranties, and confers no rights.

Eigene Namensregeln in ReSharper für xUnit.NET basierte Tests

06.07.2010 14:27:15 | Albert Weinert

Ich habe heute ein PlugIn für ReSharper veröffentlicht, mit dem möglich ist spezielle Naming-Styles in ReSharper für xUnit.NET und xUnitBDDExtensions basierte Unit Test festzulegen.

Im readme.txt ist erklärt wie man es installiert. Hier ein paar Screenshots zur Verwendung im ReSharper.

ReSharper-Options-NamingStyle

Dort nun Advanced Settings anklicken.

ReSharper-Options-Advande-Naming-Settings

Nun eine eigene Naming Rule hinzufügen. z.B. BDD Style und folgendes

auswählen.

ReSharper-Options-NamingStyle-BDD


Das war’s dann schon. Viel Spaß.

Hier geht’s zur Projekt Seite auf GitHub

 

HR - Gehaltserhöhung Template

06.07.2010 06:38:00 | Timo Rehl

Mein Chef hat mir gezeigt, wie leicht es doch ist über die Abteilung HR eine Gehaltserhöhung zu bekommen. Ich fand das so gut, das muss ich nun hier Euch zeigen:
using System;
using MYCOMPANY.HelperFromHell;

namespace MYCOMPANY.Management.HR.HellWeDontWantThis
{
    public class IncreaseSalary
    {
        private string m_id;
        private decimal m_salary;

        public IncreaseSalary(string idNumberOfEmployee, decimal currentSalary)
        {
            m_id = idNumberOfEmployee;
            m_salary = currentSalary;
        }

        /// <summary>
        /// This is the increase of salary done by HR from time to time.
        /// </summary>
        /// <returns>New salary.</returns>
        public decimal IncreaseItsHr()
        {
            return m_salary;
        }

        /// <summary>
        /// Employee request a higher salary.
        /// </summary>
        /// <param name="whatEmployeeWants">Increase that results from the fucking brain of our brain dead employee.</param>
        /// <returns>New increased salary.</returns>
        public decimal OhNoEmployeeWantsMoreMoneyHowCouldThatHappen(decimal whatEmployeeWants)
        {
            if (Math.Sign(whatEmployeeWants) == 1)
            {
                m_salary = HrHelperFromHell.DoSomeSalaryMagic(m_salary);
                throw new ArgumentOutOfRangeException("whatEmployeeWants", whatEmployeeWants, "The increase is to high! HR Manager was brought to hospital.");
            }
            else
            {
                m_salary += whatEmployeeWants;
            }

            return m_salary;
        }
    }
}


Big Smile

Wie verhindere ich einen doppelten Submit?

05.07.2010 13:38:00 | Martin Hey

Die Verarbeitung von Postbacks in einem ASP.NET Formular benötigt gelegentlich etwas mehr Zeit. Beispiele dafür sind der Upload von Dateien oder die zeitintensive Verarbeitung der Anfrage in Backend-Systemen. Im Frontend bekommt der Benutzer davon meist nicht viel mit - abgesehen von einem Ladebalken im Browser. Da hier nur wenig Rückmeldung ist, bietet es sich an, dem Benutzer irgendeine Art von Feedback zu geben - sei es mit dem Einblenden einer Nachricht à la "Gedulden Sie sich, Ihre Anfrage wird verarbeitet.", oder dem simplen Deaktivieren des Buttons, der den Postback auslöst, damit mehrfache Submits verhindert werden, die den Server lahmlegen könnten. Den zweiten Ansatz verfolgt dieser Blogpost.
Problem daran: sämtliche Aktionen, die im Codebehind der Seite passieren könnten werden erst aktiv, wenn der Client eine Response bekommt - heißt: ein C# SubmitButton.Enabled = false käme in diesem Fall zu spät. Einzig sinnvolle Lösung ist daher, sich an das JavaScript anzuhängen, dass den Postback ausführt. Ein kurzer Blick in die MSDN bringt die passende Methode zum Vorschein - RegisterOnSubmitStatement in der Klasse ClientScriptManager.
// register JS to disable submitbutton
if (!Page.ClientScript.IsOnSubmitStatementRegistered("disableSubmitScript"))
{
Page.ClientScript.RegisterOnSubmitStatement(Page.GetType(), "disableSubmitScript", "DisableSubmitButtonOnSubmit('" + saveTicketButton.ClientID + "');");
}
Als Parameter wird der Funktionsaufruf übergeben, der den Submit-Button deaktiviert. Handelt es sich um einen Button, so kann man ihn auf disabled setzen, in meinem Fall liegt ein LinkButton vor. Um diesen zu deaktivieren muss das href-Attribut entfernt werden. Meine Methode DisableButtonOnSubmit, die ich der Methode als OnSubmitStatement genannt habe, sieht also wie folgt aus:
// JS function to disable a linkbutton
function DisableSubmitButtonOnSubmit(controlId) {
var control = document.getElementById(controlId)
if (control != null) {
// disable linkbutton
control.attributes.removeNamedItem("href");
// disable button
//control.disabled = true;
}
}
Um das Aktivieren muss man sich nun nicht mehr kümmern, da das Attribut ja automatisch wieder gesetzt ist, wenn der Postback durchgelaufen ist und die Response vom Server verarbeitet wurde. Stimmt soweit, wenn da nicht andere Skripte wären, die auch noch ausgeführt werden. Liegen im Formular nämlich Validatoren (wie RequiredFieldValidator oder RegExValidator), die die Anfrage clientseitig validieren. Dann wird der Klick durchgeführt, das eben erstellte Skript deaktiviert den Button und im Anschluss daran setzen die Validatoren das Formular auf ungültig und der Anwender kann nicht mehr auf den Button klicken. Schön wäre jetzt, wenn das Skript nun noch erkennen würde, ob Validatoren greifen und dann den Button nicht deaktivieren würde. Dazu muss das JavaScript nun noch etwas angepasst werden.
// JS functions to disable submit linkbutton
function DisableSubmitButtonOnSubmit(submitButtonControlId) {
if (typeof (ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) {
return false;
}
else {
DisableControl(submitButtonControlId);
return true;
}
}

function DisableControl(controlId) {
var control = document.getElementById(controlId)
if (control != null) {
// disable linkbutton
control.attributes.removeNamedItem("href");
}
}

13.07.10 Treffen der .NET Developer Group Braunschweig - Zurück in die Zukunft mit Silverlight 4

05.07.2010 12:32:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 13.07.2010 um 19:00 im Restaurant Zucker (Tagungsraum). Gregor Biswanger, frischgebackener MVP Client App Dev, kommt uns mit einem Vortrag über Silverlight 4 besuchen.

Abstract:

Mit Silverlight 4 geht Microsoft den in Version 3 eingeschlagenen Weg weiter und erweitert es mit Verbesserungen die direkt von den Entwicklern gewünscht wurden. Mit Silverlight 3 zeigte sich der RIA-Sprössling mehr als erwachsen und mit Silverlight 4 kommt noch einiges an Reife dazu. Der Vortrag demonstriert die Highlights von Silverlight 4 und geht zudem bereits auf Erwartungen bezüglich Silverlight 5 ein.

Kurz zusammengefasst: Wir können heute schon sehen, was uns mit Silverlight 4 erwarten wird.

Bio:

Gregor Biswanger ist Solution Architect und Silverlight-Fachexperte der Firma impuls Informationsmanagement GmbH aus Nürnberg. Seine Schwerpunkte liegen im Bereich der .NET-Architektur, Silverlight und agilen Prozessen. Biswanger ist auch freier Autor, Speaker und Microsoft CLIPler der INdotNET (Ingolstädter .NET Developers Group). Sie erreichen ihn über sein Blog unter: www.dotnet-blog.net.

 

Wie immer ist dieses Event kostenlos und jeder .NET Interessierte ist herzlich willkommen!

Weitere Informationen zur DNUG Braunschweig findest du hier.

Entwicklerbuch zu Windows Phone 7

05.07.2010 10:53:16 | Peter Nowak

image Es ist ja mittlerweile ein offenes Geheimnis, dass Patrick Getzmann (MVP für Device Application Development), Simon Hackfort und ich an einem Entwicklerbuch (in Deutsch) zu Windows Phone 7 arbeiten.
Wer der Publisher ist und welche Inhalte es in diesem Buch geben soll, werden noch nicht verraten.
Das Veröffentlichungsdatum steht noch nicht 100%-ig fest, da hier mehrere Faktoren einen Einfluss darauf haben. Es soll jedoch noch dieses Jahr sein.

Wir für unseren Teil haben bereits eine Agenda an Themen festgelegt, welche das Buch behandeln soll. Doch wir sind an der Stelle noch ein wenig flexibel. Somit stellt sich die Frage: Was würden Sie sich als Inhalt für so ein Buch wünschen?
Es könnte sein, dass wir noch ein wenig Zeit haben werden auf die Wünsche einzugehen, geben aber keine Garantie, dass wir diese auch berücksichtigen könne.
Hinterlassen Sie somit ein Kommentar in diese Blog und wir werden schauen, was noch möglich ist im Buch unterzubringen…

P.S.: Vielen Dank an Alex Januschewsky (MVP für Windows Mobile) von http://mobilitynews.net/ für das WP7-Metro Logo, welches er uns zur Verfügung gestellt hat.



This posting is provided "AS IS" with no warranties, and confers no rights.

See# Party am 28.8.2010 in Kreuzlingen am Bodensee

04.07.2010 16:17:44 | Roland Weigelt

Der .NET-Stammtisch Konstanz-Kreuzlingen veranstaltet am 28.08.2010 in Kreuzlingen am Bodensee die See# Party, eine Konferenz von und für die .NET Community und Interessierte in der Schweiz und Deutschland.

Die Teilnahmegebühr beträgt lediglich 25 EUR bzw. 35,- CHF. Dafür gibt es einen ganzen Tag voll mit Vorträgen, Verpflegung während der gesamten Konferenz und abschließend eine Grillparty. Also nicht zögern, sondern direkt anmelden.

Ich werde vor Ort sein und dort einen Vortrag mit dem Titel “UI/UX - Grundlagen für Entwickler” halten. Mehr dazu (und den anderen interessanten Themen) auf der Website.

Silverlight: Converter with multiple parameters

03.07.2010 19:24:00 | Patric Schouler

Sometimes it is necessary that you have a converter (interface IValueConverter) with multiple parameters. To reach this goal, you can use a DependencyProperty. That’s normally a very easy step, but I spend some extraordinary time with my converter becuase in my case the second parameter should be bindable

So what was the problem?

I have tried to derive the Converter from UserControl – great mistake: You have to use FrameworkElement instead!

Usage:
   1: <Helpers:StatisticsConverter x:Key="StatisticsConverter" ViewModel="{Binding ElementName=LayoutRoot,Path=DataContext.Statistics}" />
   2:     
   3: <TextBlock Margin="0,0,10,0"
   4:    FontSize="9"  
   5:    x:Name="InfoSummeText" Text="{Binding Converter={StaticResource StatisticsConverter}, ConverterParameter=Summe}" >
   6: </TextBlock>
Converter:
   1: public class StatisticsConverter : FrameworkElement, IValueConverter
   2:    {
   3:  
   4:        #region IValueConverter Members
   5:  
   6:        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   7:        {
   8:            var statisticsViewModel = (StatisticsViewModel)ViewModel;
   9:            var statistics = statisticsViewModel.GetAnzeigeKategorieStatistics(value as AnzeigeKategorie);
  10:            switch (parameter.ToString())
  11:            {
  12:                case "Summe":
  13:                    {
  14:                        return String.Format("{0:N2}", statistics.Summe) + " EUR";
  15:                    }
  16:                default:
  17:                    {
  18:                        throw new NotImplementedException(parameter as string);
  19:                    }
  20:            }
  21:        }
  22:  
  23:        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  24:        {
  25:            return "";
  26:        }
  27:  
  28:        #endregion
  29:  
  30:        #region object ViewModel (DependencyProperty)
  31:  
  32:        public object ViewModel
  33:        {
  34:            get { return (object)GetValue(ViewModelProperty); }
  35:            set { SetValue(ViewModelProperty, value); }
  36:        }
  37:  
  38:        public static readonly DependencyProperty ViewModelProperty =
  39:            DependencyProperty.Register(
  40:                "ViewModel",
  41:                typeof(object),
  42:                typeof(StatisticsConverter),
  43:                new PropertyMetadata(null, null));
  44:  
  45:  
  46:        #endregion ViewModel (DependencyProperty)
  47:    }

Web of Trust, oder welchen Seiten vertraust du?

03.07.2010 16:20:09 | Klaus Bock

Free Internet Security - WOT Web of Trust

Die Idee hinter WOT ist denkbar einfach:
Nutze die Power der Community und bilde die Erkenntnisse in einem Browser Add-on ab.
Das Konzept scheint zumindest zu funktionieren, wenn man sich die Zahlen auf der Statistikseite von WOT ansieht. Bis jetzt wurden über 28,5 Millionen Seiten von der Community bewertet.

Besagtes Add-on ist im Moment für den Internet Explorer sowie für den Firefox erhältlich. Für Googles Chrome der Version 4 ist ebenfalls eine frühe Version als Add-on verfügbar. Auch für Apples Safari ist eine Version in Arbeit.

Für jene welche sich das WOT-Add-on installieren, ändert sich die Wahrnehmung des Internet nachhaltig. Bereits in den SERPs der meisten Suchmaschinen, wird die jeweilige Reputation einer Webseite angezeigt und so bereits frühzeitig vor evtl. gefährlichen Seiten gewarnt.

Google Sucher

Sollte man doch einmal eine als gefährlich eingestufte Seite im Browser aufrufen, erschient ein Warnhinweis mit verschiedenen Möglichkeiten:

  • Die Warnung zu ignorieren und die Seite trotzdem aufzurufen
  • Die Bewertungen der Seite anzuzeigen um zu sehen, warum diese Seite schlecht bewertet wurde.
  • Der Seite eine eigene Bewertung hinzufügen.

WOT Warnhinweis

Natürlich kann der Warnhinweis auch in den Einstellungen des Add-on deaktiviert werden.

Was ist nun eigentlich der große Unterschied zwischen WOT und anderen Web Sicherheitsdiensten wie etwa McAfee’s SiteAdvisor?
In erster Linie die Reaktionszeit der Community bei Änderungen des Status einer Webseite. Wird z.B. eine bisher sichere Webseite gehackt und verbreitet dadurch Schädlinge, reagiert die WOT-Community im allgemeinen sehr schnell darauf. Irgend jemand aus der WOT-Community bemerkt den Schädling auf der Seite und hinterlässt einen Beitrag im WOT-Forum. Jetzt wird die Seite analysiert, neu kategorisiert und bewertet. Binnen kurzer Zeit wird bei einem Besuch der Seite vom Add-on eine Warnung ausgegeben. Dem SiteAdvisor währe diese Veränderung erst beim nächsten Besuch des Bot aufgefallen.
Genau so verhält es sich auch anders herum. Der Seitenbetreiber wird entweder durch die jetzt schlechte Reputation seiner Seite darauf aufmerksam, oder er wird direkt kontaktiert. Nachdem der Seitenbetreiber den Schädling entfernt hat und seine Seite neu “abgedichtet” wurde, kann binnen kurzer Zeit eine Neubewertung der Seite vorgenommen werden. Meist ist dann die Reputation der Seite recht schnell wieder hergestellt. Beim SiteAdvisor und anderen bot-gesteuerten Diensten währe hier wieder viel Zeit vergangen.

Wenn man diese Zeile so liest, könnte der ein oder andere dem Gedanken verfallen:

“Da schwärz ich jetzt einen Mitbewerber an und verpass ihm dadurch eine schlechte Reputation.”

Weit gefehlt. Das Bewertungssystem hinter WOT ist, laut Aussage des Betreibers, ziemlich resistent gegen solche Betrugsversuche. Genaueres kann man in der FAQ der WOT Wicki unter dem Punkt Reputations are easy to manipulate nachlesen.

Obwohl die Basis der Webseitenbewertung die WOT-Community darstellt, vertraut WOT nicht ausschließlich seinen Benutzern. Es werden eine ganze Reihe sogenannter Trusted Sources verwendet. Erst vor relativ kurzer Zeit wurde LegitScript, ein Dienst zur Verifizierung von Onlineshops für pharmazeutische Produkte, als weitere vertrauenswürdige Quelle aufgenommen. Auch bekanntere Dienste wie etwa SpamCop oder PhishTank werden genutzt.

Abgesehen vom eigenen Dienst, bietet die WOT Wicki noch einiges mehr. Für Interessierte in Fragen Sicherheit, Reputation und Informationen über Phishing und Co ist eine ganze Litanei von nützlichen Online Tools vorhanden.
Entwicklern wird mit der WOT API eine einfache Möglichkeit geboten, mit eigenen Anwendung die Reputation von Webseiten anzuzeigen.
Die allgemeinen Geschäftsbedingungen der API-Nutzung sind sehr moderat gehalten. Es wird kein API-Key oder ähnliches verlangt. Lediglich mit den Ressourcen sollte sparsam umgegangen werden. So sind die API-Aufrufe auf 50.000 pro 24 Stunden begrenzt. Auch sollten nicht mehr als 10 Aufrufe pro Sekunde erfolgen. Die empfohlene Verwendung eines Cache, um nicht immer wieder die selben Informationen abzurufen, ist selbstredend.

Fazit:

Mit WOT wird dem gemeinen Internetbenutzer ein wirkungsvolles Werkzeug an die Hand gegeben, dass ihnen auch Gehör verschaffen kann. Viele Webseitenbetreiber sind der Meinung, keinerlei Auskünfte über Datenschutz und die Verwendung der erhobenen Daten erteilen zu müssen. Viele Betreiber sammeln hemmungslos Daten, gerade Google Analytics rückt hier immer wieder in den Fokus, und erwähnen diesen Umstand mit keinem Wort in ihrer Datenschutzerklärung. Auch denken viele Betreiber immer noch, eine Datenschutzerklärung währe nur Nonsens. Mit WOT kann sich hier der Benutzer Gehör verschaffen. Spätestens wenn die Reputation einer Seite im Keller ist und eine Warnung beim Aufruf der Seite erfolgt, zeigen sich besagte Seitenbetreiber diskussionsbereit.

Technorati-Tags: | | |

.NET Day Franken 2010

03.07.2010 16:07:22 | Damir Tomicic

Wie bereits angekündigt [1] fand der erste ".NET Day Franken" in Nürnberg statt. Und es war Klasse!

Mehr als 100 Teilnehmer fanden den Weg in das Konferenzzentrum des brandneuen NH Hotels in Nürnberg. Ein interessiertes und wirklich kompetentes Publikum. Es hat mir sehr viel Spaß bereitet die Keynote des Events zu halten, obwohl ich gesundheitlich angeschlagen war. Es freute mich auch sehr zu sehen, dass die Keynote gut angekommen ist. Ganz lieben Dank für die hervorragenden Bewertungen. :-)

 

Neben mir standen viele bekannte Gesichter der .NET-Szene in Deutschland auf dem Podium und lieferten tolle Vorträge: Christian Weyer, Golo Roden, Constantin Klein, Thomas Haug, Martin Vollmer, Thomas Hemmer, Jürgen Laude, Thorsten Hans, Hannes Mühlenberg und Daniel Meixner. Hohe Qualität in der Metropolregion.

Nicht zuletzt geht ein dickes Lob an Bernd, Tom und Moni für eine fantastische Organisation und die Durchführung des Events. Besten Dank dafür!

  

[1] http://tomicic.de/2010/05/17/KeynoteBeimNETDayFranken.aspx
[2] http://www.dotnet-day-franken.de/

Whitepaper 2010 Winter Olympics in Vancouver

03.07.2010 15:36:48 | Damir Tomicic

Als Folgebeitrag zur "Media Transformation Story" [1] empfehle ich den gerade veröffentlichten Whitepaper zu den Hintergründen der IT-Infrastruktur bei den Olympischen Winterspielen in Vancouver.

[1] http://tomicic.de/2010/05/14/TellingTheMediaTransformationStoryTheOlympicGames.aspx
[2] http://learn.iis.net/page.aspx/900/nbc-online-video-monetization-and-highlights-creation-for-the-2010-winter-olympics/

Eine der interessanten neuen Entwicklungen ist der Silverlight Rough Cut Editor, eine Lösung zur Bearbeitung von IIS Smooth Streaming Video-Dateien, die inzwischen kostenfrei zur Verfügung gestellt wurde.

Silverlight Toolkit: Disable Drag for DragDropTarget

02.07.2010 18:42:00 | Patric Schouler

Each of the new DragDropTarget-Controls in the Silverlight Toolkit have a property AllowDrop which you can use to disable or enable the drop behaviour. But if you want to disable the underlaying controls to be draggable you have to cancel the drag start event at the ItemDragStarting Event:

1. Add Event handler
   1: <toolkit:TreeViewDragDropTarget ExpandNodeDelay="500"
   2:     AllowDrop="True" Drop="OnItemDropped" ItemDragStarting="TreeViewDragDropTarget_ItemDragStarting"
   3:     HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Top" >
2. Define the event handler
   1: private void TreeViewDragDropTarget_ItemDragStarting(object sender, ItemDragEventArgs e)
   2:         {
   3:             e.Cancel = true;
   4:             e.Handled = true;
   5:         }

Abhängige Komponenten mit TFS 2010 Version Control verwalten

02.07.2010 18:18:10 | Christian Binder


Hinweis: Dieser Beitrag ist ein Working Draft, also noch weit entfernt von Fertig. Dennoch möchte ich die Informationen in diesem Status bereitstellen und das Feedback der Community einfließen lassen. Schon jetzt möchte ich vor allem für das Inhaltliche Feedback der AIT und Artiso bedanken. Wir planen, aus diesem Beitrag, wenn der entsprechende Reifegrad erreicht ist, ein Whitepaper zu erstellen.

Download als Dokument

Working Draft 0.1

Viele Teams haben die Notwendigkeit Frameworks oder andere Komponenten, welche von anderen Entwicklungsprojekten verwendet werden, unter Versionsverwaltung zu stellen. Hierbei stellt sich die Frage, wie Updates einer solchen Komponente dann diesen Projekten bereitgestellt werden? Je nach Projekt gibt es die unterschiedlichsten Anforderungen an diesen Prozess. Zum Beispiel: Werden die Komponenten nur als Binaries oder in Form von Source Code referenziert? Soll das Projekt direkt alle Änderungen an der Komponente oder nur stabilisierte Updates erhalten? Kann die Branch- Struktur des Zielprojektes eine Version der Komponente referenzieren oder muss jeder Branch die Möglichkeit haben eine spezifische Version zu referenzieren? Und da sind wir schon mitten im Thema, Branches. Team Foundation Server verwendet Branches, um Code-Versionen zu isolieren, was leider voraussetzt, dass man erst das Konzept der Branches etabliert haben muss, um mit deren Mechanismen Komponenten, die der Versionierung unterliegen, einem Projekt bereitzustellen. Es empfiehlt sich, aufbauend auf dem Visual Studio TFS Branching Guide 2010, das Thema Branches und Merges mit Team Foundation Server 2010 anzugehen.

clip_image002[8]

Bevor es dann losgeht, sei erwähnt, das dieses Dokument nicht den Anspruch auf Vollständigkeit der möglichen Szenarien hat, sondern vielmehr den schrittweisen Einstieg, der verschiedene Ansätze zeigt, um Einsteigern den ersten Schritt zu erleichtern. So fokussiere ich in den Szenarien den Ansatz mit Shared Code, wobei die Mechanismen natürlich für Shared Binaries ähnlich anwendbar und kombinierbar sind. Shared Binaries sind vor allem dann notwendig, wenn Komponenten anderer Hersteller Verwendung finden, für die kein Code vorliegt.

Szenario A) Shared Code mit First Class Branches:

Hierbei handelt es sich um ein sehr einfachen Ansatz, der in der Praxis allerdings nur begrenzt anwendbar ist. Warum wird er dennoch betrachtet? Weil er, wie ich finde, gut in die Thematik Einleitet und Limitationen aufzeigt, die Ihnen helfen sollen Ihr eigenen Anforderungen an das Shared Szenario zu definieren.

Im Team Project CommonLib wird die CommonDataAccessHelper Solution entwickelt, welche später dann von einem oder mehren anderen Projekten konsumiert werden soll, aber separat weiter entwickelt wird.
clip_image004[8]

Im nächsten Schritt konvertiere ich das Verzeichnis Main in einen Branch. Der Einfachheit halber soll Main auch der Branch sein, von der wir später in die entsprechen Consumer branchen. In komplexeren Projekten würde für diesen Zweck ein Release Branch von der Main erstellt werden, der eine stabilisierte Version des Shared Codes enthält.

clip_image006[8]

Jetzt erstelle ich ein Neues Team Project für den Consumer. In Main habe ich die PaymentSystem Solution hinzugefügt, welche den CommonDataAccessHelper verwenden soll:

clip_image008[7]

Ich füge nun ein Verzeichnis Common zu der ConsumerApp hinzu, das alle Branches von Shared Code enthalten soll. Optional könnte hier auch ein zusätzliches Verzeichnis für Shared Binaries angelegt werden.

clip_image010[7]

Im nächsten Schritt wird $CommonLib\Main nach $/ConsumerApp/Common/SharedDataAccessHelper „ge-branched“:

clip_image012[7]

Nun steht mir der Helper in der SharedDataAccessHelper Branch zur Verfügung und ich kann Ihn in der Payment Solution konsumieren. Unter $/ConsumerApp/Common/ würde nun für jeden Shared Code, wenn erforderlich, eine Branch erstellt werden, was letztendlich von den Anforderungen an die Granularität der Updates abhängt.

clip_image014[6]

Nachdem ich das CommonDataAccessHelper Projekt in die PaymentSystem Solution hinzugefügt und referenziert habe:

clip_image016[6]

kann ich die TXLogging Class verwenden:

clip_image018[6]

Das Team führt ein Update des Shared Codes in $CommonLib\Main durch:

clip_image020[6]

In der Historie kann man die Änderung im Chg99 sehen:

clip_image022[6]

Wenn man den Chg99 über die Branches verfolgt , sieht man, dass die $/ConsumerApp/Common/SharedDataAccessHelper Branch die Änderung noch nicht enhält und somit noch mit der vorhergehenden Version arbeitet:

clip_image024[6]

Durch einen Merge des Chg99 und Checkin wird das Update durchgeführt:

clip_image026[6]

Die Änderung ist jetzt in $/ConsumerApp/Common/SharedDataAccessHelper verfügbar und das Update wird von der PaymentSystem Solution verwendet:

clip_image028[6]

Für das häufige geforderte Szenario, dass unterschiedliche Helper Versionen in verschienden Branches z.B. DEV, MAIN, Release usw. referenziert werden sollen, ist dieser Ansatz NICHT geeignet, da unter Common eine Vielzahl von Branches für Shared Code entstehen würden, einzig um verschiede Versionen der Helper bereitzustellen. Daher das Szenario B, welches den Shared Code via Baseless Merge, also nicht als FirstClass Branch dem Konsumenten bereitstellt.

Szenario B) Shared Code mit Baseless Merge

Dieses Szenario greift den Ansatz von Szenario A auf, ohne $CommonLib\Main als eigene FirstClass Branch in die $ConsumerApp zu branchen. Daher kann das Verzeichnis $ConsumerApp\Common in den folgenden Screenshots einfach ignoriert werden. Vielmehr habe ich unter $ConsumerApp\Main das Verzeichnis CommonBin und CommonSrc angelegt. CommonBin würde alle Shared Binaries enhalten. CommonSrc den Shared Code, also die Solutions deren Projekte referenziert werden. Der Unterschied zu Szenario A ist, dass der Shared Code Teil jedes einzelnen Branches des Konsumers ist.

clip_image030[6]

Da eine FirstClass Branch, keine andere FristClass Branch enthalten kann, muss man hier einen anderen Mechanisums nutzen, der es erlaubt $CommonLib\Main nach $ConsumerApp\Main\CommonSrc zu Mergen. Hierzu wird einmalig eine Verknüpfung zwischen Quelle und Ziel mit einem Baseless Merge erstellt. Im Visual Studio Prompt und mit TF.exe kann diese Verknüpfung erstellt werden:

clip_image032[7]

Im Source Control Explorer wird der Baseless Merge wie folgt angezeigt:

clip_image034[6]

Jetzt noch den Check-In durchführen:

clip_image036[6]

Nun ist Grundlage für den Merge von $CommonLib\Main nach $ConsumerApp\Main\CommonSrc gegeben. $ConsumerApp\Main\CommonSrc steht als Target Branch zur Verfügung:

clip_image038[6]

clip_image040[6]

Check-in des Merges:

clip_image042[6]

Fertig. Im letzten Schritt noch analog zu Szenario A das CommonDataAccessHelper Projekt in die PaymentSystem Solution hinzufügen und referenzieren.

clip_image044[6]

Ein Update in $CommonLib\Main kann dann nach Bedarf nach $ConsumerApp\Main\CommonSrc ge-merged werden und steht dann zur Verfügung.

clip_image046[6]

In diesem Beispiel liegen die abhängigen Komponenten direkt im Branch des Konsumenten. Normalerweise gibt es aber mehrere Branches z.B. MAIN, DEV, Release:

clip_image048[6]

Updates würden, wenn möglich, immer über $ConsumerApp\Main laufen. Ein Update, welches von $CommonLib\Main nach $ConsumerApp\Main\CommonSrc durchgeführt wurde, würde dann innerhalb der FirstClass Branches via Forward Integration an die anderen Branches weiter gegeben werden. Dies ist das einfachste Szenario.

In der Praxis möchte man aber vielleicht nicht von $CommonLib\Main direkt nach $ConsumerApp\Main branchen, sondern erst in einer Development Branch den neuen Helper testen, zum Beispiel in $ConsumerApp\DEV . Hierzu müsste man wiederum einen Basless Merge erstellen und im Anschluss eine Reverse Integration nach $ConsumerApp\Main durchführen. Andere Branches unter $ConsumerApp erhalten das Update via Forward Integration.

clip_image050[6]

Das gleiche gilt, wenn man nicht von $CommonLib\Main branched, sondern von einem Release Branch im Helper zum Beispiel $CommonLib\Releases\R1, was durchaus üblich ist.

Hinweis: An dieser Stelle sein noch erwähnt, dass mit dem Tool tf.exe ein Merge und Branch auf Basis eines Labels möglich ist. Da Team Build einen Label bei jedem Build erzeugt, könnte man zum Beispiel von einen Build der $CommonLib\Main einen Branch erzeugen.

Wenn Änderungen am CommonDataAccessHelper innerhalb der ConsumerApp erlaubt sind, könnte man diese dann z.B. von $ConsumerApp\DEV > $ConsumerApp\Main > $CommonLib\Main mittels Reverse Integration überführen. Ich würde diesen Ansatz aber vermeiden, da er die Komplexität erhöht.

Ein Wort zur Visualisierung. Im Falle der Baseless-Merges werden Integrationen aus dem CommonLib-Projekt nicht mehr in der Branch-Hierarchie visualisiert. Hier sollte ein Konzept, z.B. auf Basis von Builds und der Historie helfen, nachvollziehen zu können, welche Bug-Fixes integriert wurden.

Letztendlich muss man sich ein klares Bild über den Fluss der Updates zwischen Helper und Konsumenten auf Basis des gewählten Branch Modells machen und die Mechanismen entsprechend anwenden. Weniger ist hier meistens mehr. Bei entsprechend komplexen Applikationen mit vielen Komponenten, gilt es einige dieser Mechanismen zu automatisieren.

Szenario C) Shared Code mit Workspace Mappings

Dieses Szenario führt den Shared Code nicht auf dem Server zusammen, sondern auf dem Client im Workspace.
ToDo :-)

Ist dieses Dokument fertig? Noch lange nicht. Backlog:

1) Einfaches Beispiel mit Shared Binaries?

2) Dependency Replication aus Build?

3) Workspace Mapping Konzepte

4) Multiple Solutions

5) Branch by Label

6) Rekursiver Build

Visual Studio 2010 Power Tools

02.07.2010 15:23:06 | Jens Häupel

Wer es noch nicht gesehen haben sollte: Die Visual Studio Power Tools sind verfügbar. Sie bringen eine ganze Reihe hilfreicher Helferchen für den Entwickler.

Hier meine Favoriten:

1. Durchsuchbarer Referenzdialog:

image

2. Verankerung für Tabs:

image

3. Tabs erscheinen farbcodiert und zeigen somit die Zugehörigkeit zu einem Projekt. Außerdem ist die Tableiste scrollbar:

image

Alle Tabs kann man über das Menü erreichen, wobei gerade nicht sichtbare kursiv und der aktuelle fett dargestellt werden:

image

Weitere Infos gibt es auf der Dowload-Seite und im Visual Studio Team Blog.

 

Übrigens, alles ist über den Options-Dialog konfigurierbar:

image

Gewinner der 2. Blog-Parade

02.07.2010 13:31:40 | Peter Kirchner

Vielen Dank an alle Teilnehmer der 2. Blog-Parade und für die vielen Ideen zum Einsatz von Windows Azure! Man hat gemerkt, dass wirklich viele Ideen existieren, wie man Windows Azure sinnvoll einsetzen kann. Auch wenn es uns schwer gefallen ist, konnten wir nur drei Glückliche aus allen Teilnehmern ziehen. Die drei Gewinner wurden auch bereits benachrichtigt und sollten demnächst Post von uns bekommen. :-)

Für alle, die sich mit dem Thema Cloud Computing weniger beschäftigt haben, kann ich nur empfehlen, sich einmal die Ideen der Teilnehmer anzusehen. Vielleicht ist ja für den einen oder anderen eine Inspiration zu einer neuen Geschäftsidee dabei! :-)

Die drei Gewinner der Blog-Parade sind:

1. Mandy L. aus Erbach

2. Mario B. aus Potsdam

3. Markus K. aus Ludwigsburg

 

Für alle, die dieses Mal leider nicht gewonnen haben, wünsche ich jetzt schon einfach mal viel Glück für das nächste Mal!

Juli 2010: Microsoft MSDN Forum, TechNet Forum und Answers Forum Update und aktuelle Forenstruktur

02.07.2010 11:41:54 | Kay Giza

Ab Juni 2010 haben wir damit begonnen, Newsgroups zu schließen und Benutzer auf Microsoft-Foren wie Microsoft Answers, TechNet und MSDN zu migrieren. Durch diese Maßnahme werden Inhalte zentralisiert, Redundanzen werden verringert und Inhalte werden leichter auffindbar gemacht. Alles in allem bieten die Microsoft-Foren bessere Möglichkeiten zur Spambekämpfung, wodurch es möglich wird, den Diskussionsort angenehmer zu gestalten und damit die Zufriedenheit zu steigern. Für mich persönlich gesehen ist dies ein Generationswechsel. Wie es bei einem Generationswechsel meistens ist, gibt es viele Fürsprecher aber natürlich auch Kritik. Ich meine, das ist auch vollkommen gut so und ich glaube, dass wir hier in Deutschland sehr offen, sehr ehrlich und sehr transparent mit der "Community" im Dialog sind und auch gemeinsam Entscheidungen treffen sowie auf konstruktive Kritik sehr genau eingehen. Der für mich sicherlich am größten erscheinende Vorteil (von vielen) ist, das Benutzer nun die ganze Vielfalt webbasierter Online-Foren nutzen können, beispielsweise kann man direkt anklickbare Text-Hyperlinks einfügen, Bilder und Screenshots können direkt eingebunden werden und unterstützen die Problemlösung oder -Erklärung. Weiterhin können so genannte CodeSnippets (einfügen von diversem Code) über einen Rich-Text-Editor einfügt und übersichtlich und koloriert dargestellt werden. Mit diesem Posting möchte ich gerne die aktuelle Foren-Struktur hier posten und auf die wichtigsten Themen aufmerksam machen… […mehr in diesem ausführlichen Blogposting auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Visual Studio: default build action for non-default file-types

02.07.2010 11:12:00 | Andre Loker

With a simple file you can tell Visual Studio to use a certain default Build Action for specific file types. This reduces the chance of missing files on the server when using the built-in publishing functionality. 

buildaction

Updated: if you don’t feel like hacking pkgdef files manually, check out my little helper tool at http://tools.andreloker.de/dbag

For each file in the solution you can define a build action by selecting the file and choosing the appropriate “Build Action” in the properties window.

The build action defines how Visual Studio handles the file when building and publishing the solution. For example, the default build action for C# source file is “Compile”. Files that have no special meaning for Visual Studio get the build action “None” by default, telling VS to basically ignore the file and just leave it as is.

In an ASP.NET MVC project that uses a view engine different from the default one (such as Spark or Brail) one will frequently add such “meaningless” files to the solution, namely the view files: .spark, .brail, .brailjs etc.

Publishing in Visual Studio

This section only provides the context of this article. You may skip it if you know about publishing.

deploy Visual Studio offers a nice publishing function that makes publishing applications rather easy (Build -> Publish). The Web Deploy method is pretty cool, because it can deploy the project to a remote web server with one button click.

The publishing functionality can be configured in the project properties, tabs Package/Publish Web (and Package/Publish SQL for that matter).

One essential option is the choice of the “Items to deploy”. There are three choices: “Only files needed to run this application”, “All files in the project” and All files in the project folder. “All files in the project directory” publishes, well, all files in the directory where the project files lives and all subdirectories. “All files in the project” only deploys files that are part of the solution, that is, all files shown in the solution explorer (with “Show All Files” off, of course), plus the build results. publishAs a result, this will copy among other things all source files to the web server. It is not much of a security problem, because by default IIS is configured to not serve those files at all. Still, I don’t see the need to publish unnecessary files. That’s where the first option comes in: “Only files needed to run this application”. It basically deploys all compilation results and all files with the “Content” Build Action defined. For many file types, VS sets the Build Action to Content by default, for example .css, .js and .config files. For “unknown” file types, such as .spark or .brail, the Build Action is “None”. As a result, those files are not deployed to the server on publish with the “Only files needed to run this application” setting on. Of course, you can change the Build Action for each and every file, but it is a tedious task and can easily be forgotten, causing missing files on the server. Luckily, you can tell Visual Studio to use a different default Build Action for any file type.

Changing the default Build Action for a file-type

The default build action of a file type can be configured in the registry. However, instead of hacking the registry manually, we use a much better approach: pkgdef files (a good article about pkgdef files). In essence, pkdef are configuration files similar to .reg files that define registry keys and values that are automatically merged into the correct location in the real registry. If the pkgfile is removed, the changes are automatically undone. Thus, you can safely modify the registry without the danger of breaking anything – or at least, it’s easy to undo the damage.

Finally, here’s an example of how to change the default build action of a file type:

   1: [$RootKey$\Projects\{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\FileExtensions\.spark]
   2: "DefaultBuildAction"="Content"

The Guid in the key refers to project type. In this case, “{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}” means “C# projects”. A rather comprehensive list of project type guids can be found here. Although it does not cover Visual Studio 2010 explicitly, the Guids apply to the current version as well. By the way, we can use C# as the project type here, because C# based MVC projects are in fact C# projects (and web application projects). For Visual Basic, you’d use “{F184B08F-C81C-45F6-A57F-5ABD9991F28F}” instead.

$RootKey$ is in abstraction of the real registry key that Visual Studio stores the configuration under: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0_Config (Note: Do not try to manually edit anything under this key as it can be overwritten at any time by Visual Studio).

The rest should be self explanatory: this option sets the default build action of .spark files to “Content”, so those files are included in the publishing process.

All you need to do now is to put this piece of text into a file with the extension pkgdef, put it somewhere under %PROGRAMFILES(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\Extensions (on 64-bit systems) or %PROGRAMFILES(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\Extensions (on 32-bit systems) and Visual Studio will load and apply the settings automatically the next time it starts. To undo the changes, simply remove the files.

Finally, I’ve attached a bunch of pkgdef files that are use in production that define the “Content” default Build Action for C# and VB projects for .spark, .brail, .brailjs and .less files respectively. Download them, save them somewhere in the Extensions folder and you’re good to go.

brail - Content.pkgdef (528.00 bytes)

brailjs - Content.pkgdef (534.00 bytes)

less - Content.pkgdef (525.00 bytes)

spark - Content.pkgdef (528.00 bytes)

Glückwunsch zum Microsoft MVP 2010!

02.07.2010 10:41:00 | Gregor Biswanger

MVPLogo

Hallo Community,

ganz nach meinem Motto: “Es gibt sicher viele Wege, anderen Menschen zu helfen. Aber es gibt nur einen Weg zu leben: anderen Menschen zu helfen.”.. Überraschte mich gestern eine E-Mail von Microsoft die meine Einstellung zum Leben belohnte:

Sehr geehrte(r) Gregor Biswanger,
herzlichen Glückwunsch! Wir freuen uns, Ihnen den Microsoft® MVP Award 2010 verleihen zu können! Diese Auszeichnung wird an herausragende, führende Mitglieder der technischen Communities verliehen, die ihre wertvollen praktischen Erfahrungen mit anderen Menschen teilen. Wir schätzen Ihren außerordentlich bedeutenden Beitrag in den technischen Communities zum Thema Client App Dev im vergangenen Jahr hoch ein.

 

Deutschlandweit angefangen von Konstanz bis hin zu Hamburg wurde ich immer wieder unter den Communties mit fragenden Blicken angesprochen, weshalb ich kein MVP sei. Nun kann ich mit ganzen stolz berichten: “Ich bin MVP!”.

Erst mal ein großes Danke an Microsoft und an folgende Personen die mir den Einstieg in die Community-Welt brachten:

Danke an Markus Winhard für die Gründung von INdotNET - Ingolstädter .NET Developers Group, das mir dadurch die “Sucht” zur Community gegeben hat…

Danke an Robert Walter, der mir stets beiseite stand mit zahlreichen Community- oder Konferenzbesuchen und mich durch Feedback immer besser machte…

Danke an Peter Nowak (MVP für Device Application Development) - ohne Dich hätte ich nie das Schreiben begonnen...

Danke an meine Firma impuls, die meine Aktivitäten so stark unterstützt und meine Arbeit so hoch schätzt…

Danke an Euch, der Community! Die sich für meine Vorträge, Artikel und Videos interessieren und mich durch Ihr Interesse immer noch mehr pushen… wie MJ auch sagen würde: “Ich Liebe Euch!”

Das .NET Forum gibt Antworten

01.07.2010 20:14:12 | Jan Welker

In vielen neuen Forensystemen und Community-Seiten wie zum Beispiel Stackoverflow oder den MSDN Foren hat sich in den letzten Monaten ein ganz interessantes Feature etabliert.
Wenn eine Frage beantwortet wurde, wird die passende Antwort direkt mit einer grünen Markierung direkt nach der Frage angezeigt.

image
MSDN Foren

Das .Net Forum basiert auf dem CommunityServer 2007, der dieses Feature leider noch nicht hat.
Mit viel Trickserei (DCD) hab ich dieses Funktion jetzt im .NET Forum nachgerüstet. Die Antwort wird jedoch nicht in voller Größe angezeigt, weil ich das bei den MSDN Foren sehr irritierend fand. Es wird nur ein Hinweis eingeblendet, dass diese Frage beantwortet ist. Wenn man sich nicht den ganzen Thread durchlesen möchte, um die entscheidende Antwort zu finden, kann man auf „Antwort anzeigen” klicken. Dann erst wird die Antwort eingeblendet:

image
.NET Forum – Anzeige eingeklappt

image
.NET Forum – Antwort angezeigt

Das neue Feature ist jetzt schon ein paar Wochen online und hat sich bewährt.

Probiert es doch mal aus!

Automatisierung des Windows 7 Phone Emulators

01.07.2010 20:11:00 | Martin Hey

Eine Windows Phone 7 Anwendung erstellen ist so einfach: Man öffnet Visual Studio und erzeugt ein neues Projekt auf Basis des Windows Phone Templates; entwickelt die Anwendung und deployt sie auf den integrierten Phone-Emulator. Alles gut und schön, bis .... ja bis der Kunde sagt, er möchte sich das Look & Feel auch mal ansehen und die Anwendung ausprobieren.
Nun kann man dem Kunden ja schlecht sagen: "Hier sind die Sourcen. Installieren Sie das Windows Phone SDK. Öffnen Sie die Sourcen dann in Visual Studio (Express). Drücken Sie Compile. Und wenn Sie alles richtig gemacht haben, tut Visual Studio und der Emulator öffnet sich mit der Anwendung." Spätestens bei Schritt 4 dieser Anleitung steigt er aus und wird uns was flüstern.
Also muss eine für ihn einfachere Lösung her. Einen sehr guten Post zu diesem Thema hat Justin Angel vor kurzem verfasst, den ich hier aufgreifen möchte. Dabei wird eine Konsolenapplikation erstellt, die beim Kunden Windows Phone 7 emulieren und die Anwendung installieren und starten kann.
Zunächst erstellt man eine Konsolen-Applikation und referenziert die Datei Microsoft.SmartDevice.Connectivity.dll, welche sich im Ordner "C:\Program Files\Common Files\microsoft shared\Phone Tools\CoreCon\10.0\Bin" befindet und schon kann die Implementierung beginnen. Die durchzuführenden Schritte sind:
  • Windows Phone 7 CoreCon SDK Instanz holen
  • Emulator instanziieren
  • zum Emulator verbinden
  • vorherige Versionen deinstallieren
  • XAP-Datei installieren
  • Anwendung starten
In Quellcodezeilen ausgedrückt sieht das in etwa wie folgt aus:

string appGuid = "{8bf5502f-8d01-4b06-abd8-d3195e838cfd}";
string appXAP = "MyApplication.xap";

// Get CoreCon WP7 SDK
DatastoreManager dsmgrObj = new DatastoreManager(1033);
Platform WP7SDK = dsmgrObj.GetPlatforms().Single(p => p.Name == "Windows Phone 7");

// Get Emulator / Device
bool useEmulator = true;
Device WP7Device = null;
if (useEmulator)
WP7Device = WP7SDK.GetDevices().Single(d => d.Name == "Windows Phone 7 Emulator");
else
WP7Device = WP7SDK.GetDevices().Single(d => d.Name == "Windows Phone 7 Device");

// Connect to WP7 Emulator / Device
Console.WriteLine("Connecting to Windows Phone 7 Emulator/Device...");
WP7Device.Connect();
Console.WriteLine("Windows Phone 7 Emulator/Device Connected...");
Guid appID = new Guid(appGuid);
RemoteApplication app;
if (WP7Device.IsApplicationInstalled(appID))
{
Console.WriteLine("Uninstalling sample XAP to Windows Phone 7 Emulator/Device...");

app = WP7Device.GetApplication(appID);
app.Uninstall();

Console.WriteLine("Sample XAP Uninstalled from Windows Phone 7 Emulator/Device...");
}

// Install XAP
Console.WriteLine("Installing sample XAP to Windows Phone 7 Emulator/Device...");

string curdir = ApplicationPath();

app = WP7Device.InstallApplication(
appID,
appID,
"NormalApp",
curdir + @"\ApplicationIcon.png",
curdir + "\\" + appXAP);
Console.WriteLine("Sample XAP installed to Windows Phone 7 Emulator...");

// Launch Application
Console.WriteLine("Launching sample app on Windows Phone 7 Emulator...");
app.Launch();
Console.WriteLine("Launched sample app on Windows Phone 7 Emulator...");

Wichtig ist der Name der XAP-Datei, damit die Anwendung installiert sowie die Guid der Anwendung (zu ermitteln aus der WMApplication.xaml), damit die Anwendung vom Gerät auch wieder deinstalliert werden kann.

MVP für ASP.NET 2010

01.07.2010 17:41:16 | Jan Welker

Wir freuen uns, Ihnen mitzuteilen, dass Herrn Jan Welker die Auszeichnung „Microsoft® Most Valuable
Professional“ für 01.07.2010 - 01.07.2011 verliehen wurde. Der Microsoft MVP Award ist eine jährlich verliehene
Auszeichnung, mit der wir führende Mitglieder der technischen Communities weltweit anerkennen, die ihre
wertvollen Erfahrungen aus der Praxis mit anderen Benutzern und mit Microsoft teilen. Wir alle bei
Microsoftwürdigen und schätzen die außergewöhnlichen Beiträge von Herrn Welker und möchten diese
Gelegenheit wahrnehmen, Ihnen dies mitzuteilen.

Diese Nachricht erreichte mich heute am späten Nachmittag.

Ich freu mich sehr, ein weiteres Jahr MVP sein zu dürfen und bedanke mich ganz herzlich für diese Anerkennung.

Überblick zum IE9 Platform Preview 3

01.07.2010 16:04:00 | Oliver Scheer

Eine deutschsprachige Übersicht zum Internet Explorer 9 Platform Preview 3, dem an Entwickler gerichteten Ausblick auf die kommende Browser-Generation von Microsoft, steht jetzt auf 5 kompakten Seiten zum Abruf bereit. Erfahren Sie, welche Leistungssteigerungen bereits erreicht wurden, wie verstärkte Interoperabilität und konsequente Standardkonformität in diesem frühen Entwicklungsstand implementiert werden, und wie IE9 mit HTML5, CSS3 sowie SVG eine neue Generation von Weberfahrungen ermöglichen wird, auf die Sie sich dank der regelmäßigen Previews als Entwickler schon heute vorbereiten können, bevor der breiten Öffentlichkeit eine Betaversion des Browsers zur Verfügung stehen wird. Das Fact Sheet zur Internet Explorer 9 (IE9) Platform Preview 3 steht als als PDF- oder als XPS-Dokument bereit.

Dritte Internet Explorer 9 Platform Preview verfügbar

01.07.2010 14:03:41 | Oliver Scheer

Gerichtet an Web-Entwickler, stellt Microsoft auf den IE Test Drive-Seiten die nunmehr 3. Vorschauversion zum kommenden Internet Explorer 9 (IE9) vor – die Sie parallel zu einer bestehenden Internet Explorer Version installieren können. Mit den Preview-Versionen, die bis zum Erscheinen einer öffentlichen Beta-Version etwa im 8-Wochen-Rhythmus erscheinen, verschafft Microsoft Entwicklern den Einblick in den Fortschritt der Browsertechnologie, von Verbesserungen an Markup über Leistungsverbesserungen und Nutzung von Hardwarebeschleunigung bis zu neuen Beispielen für Entwickler.
Die Neuerungen der aktuellen Preview umfassen neben der Abarbeitung Ihres Feedbacks über die Connect-Seiten konkret die Verfügbarkeit der HTML5-Tags audio, video und canvas, schnelleres JavaScript, Standardverbesserungen (inkl. ES5 und WOFF) und verbessertes Acid 3-Ergebnis, neue W3C-Tests sowie 15 neue Beispiele für Entwickler zu den Themen Performance, Grafik und HTML5. Weitere Informationen finden Sie auch im MSDN Internet Explorer Developer Center oder im Internet Explorer 9 Testing Center.
Zum herunterladen steht außerdem ein deutschsprachiges Fact Sheet zur Internet Explorer 9 (IE9) Platform Preview 3 als als PDF- oder als XPS-Dokument bereit.

Peter on the road: Themenabend zu Windows Phone 7 Entwicklung bei der netug Niederrhein

01.07.2010 12:30:36 | Peter Nowak

Da nun bereits die TechTalk Reihe von Microsoft zum Thema Windows Phone 7 Entwicklung durch ist, freue ich mich umso mehr selbst einen Vortrag zu dem Thema bei der netug Niederrhein halten zu dürfen. Ich freue mich sehr darauf aus dem Nähkästchen der aktuellen CTP erzählen zu können und ein paar nette Samples zeigen zu dürfen.

Datum: Mittwoch, 14. Juli 2010

Zeit: 18:30 - 21:30

Ort: AUTOonline GmbH Informationssysteme

Straße: Hammfelddamm 6

Stadt/Ort: Neuss, Germany

Veranstalter: http://www.netug-niederrhein.de/

 

Ich würde mich freuen, euch vor Ort begrüssen zu dürfen.



This posting is provided "AS IS" with no warranties, and confers no rights.

Stern Gallerie mit Deep Zoom

01.07.2010 09:29:51 | Oliver Scheer

Unter http://www.stern.de/gallery/ setzt mit Stern.de eine der größten deutschen und innovativsten Websites auf Silverlight. Die Bilder werden automatisiert aus RSS-Feed gelesen und täglich aktualisiert. Die Lösung basiert auf SilverHD.net, welches sich am neuartigen METRO-Design, dem Lock-and-Feel der Windows Phone 7 Geräte, orientiert. Hochauflösende Bilder werden in HD Qualität darstellt, Möglichkeiten zur Integration von Videos, Blogs und Social Media sind über ein einfaches Webinterface ermöglicht. Die SilverHD Gallery generiert bis zu 50% mehr Page-Impression als klassische Gallerien und erhöht dank der neuartigen User Experience für eine Steigerung der Verweildauer der Nutzer.

Deutsche Texte in Infragistics NetAdvantage 10.2

01.07.2010 01:53:59 | Andre Kraemer

Wie Craig Shoemaker bereits in seinem Blog geschrieben hat, werden die Infragistics NetAdvantage Controls für Silverlight und WPF ab der Version 10.2 auch mit Deutschen Oberflächentexten ausgeliefert. In diesem Beitrag möchte ich die Notwendigen Schritte noch einmal im Schnelldurchlauf in deutscher Sprache am Beispiel von Silverlight erläutern.

Initiales Setup

Mein Silverlightprojekt besteht aus einer einzigen Seite, in der ein XamGrid definiert wurde:

<UserControl x:Class="NAGermanLocalization1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:ig="http://schemas.infragistics.com/xaml">

    <Grid x:Name="LayoutRoot" Background="White">
        <ig:XamGrid HorizontalAlignment="Left" Name="xamGrid1" VerticalAlignment="Top"  AutoGenerateColumns="false"  >
            <ig:XamGrid.FilteringSettings>
                <ig:FilteringSettings AllowFiltering="FilterMenu" />
            </ig:XamGrid.FilteringSettings>
            <ig:XamGrid.GroupBySettings>
                <ig:GroupBySettings AllowGroupByArea="Top" />
            </ig:XamGrid.GroupBySettings>
            <ig:XamGrid.Columns>
                <ig:TextColumn Key="Id" />
                <ig:TextColumn Key="Name"/>
                <ig:TextColumn Key="Vorname"/>
                <ig:TextColumn Key="Land" />
            </ig:XamGrid.Columns>
        </ig:XamGrid>
    </Grid>
</UserControl>

Für das Grid habe ich wie der vorherige Codeausschnitt zeigt Filtern und Gruppieren aktiviert.

Meine Codebehind Datei sieht ähnlich schmal aus:

using System.Collections.Generic;
using System.Windows.Controls;

namespace NAGermanLocalization1
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            InitGrid();
        }

        private void InitGrid()
        {
 	        List<Kunde> kunden = new List<Kunde>();
            for (int i = 0; i<10; i++)
            {
                Kunde kunde = new Kunde{Id = i, Name = string.Format("Name {0}", i), Vorname = string.Format("Vorname {0}", i), Land = "DE"};
                kunden.Add(kunde);
            }
            xamGrid1.ItemsSource = kunden;
        }
    }

    public class Kunde
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Vorname { get; set; }
        public string Land { get; set; }
    }
}

An der Oberfläche schaut das ganze nun wie folgt aus:

GridVorher

DialogVorher

Und einmal auf Deutsch bitte ...

Um das ganze nun zu lokalisieren, sind lediglich zwei Schritte erforderlich.

Zunächst muss das Silverlight Projekt entladen und anschließend im Textmodus editiert werden:

unloadproject editproject

Der vorhandene leere Tag SupportedCultures muss mit dem Wert de versehen werden.

supportedcultures

Anschließend muss die Projektdatei gespeichert und erneut geladen werden. Als letzter Schritt muss dann innerhalb der Webseite, die das Silverlight Control hostet noch die Zeile <param name="uiculture" value="de" /> innerhalb des Object Tags eingefügt werden:

uiculture

Wenn nun nichts schief gegangen ist, sollten die Oberflächentexte nun auf Deutsch erscheinen:

GridNachher

DialogNachher

Fazit

Lokalisierte Oberflächen werden mit Infragistics NetAdvantage 10.2 zum Kinderspiel, da das umständliche Setzen der Oberflächentexte über die runtime resource-string customization in Zukunft entfällt.

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum