Archiv für die Kategorie ‘.net’

h1

Neues von der 2010er Welle – TFS2010, SharePoint 2010

Oktober 19, 2009

Heute ist nun nach langem Warten endlich die Beta 2 (mit “Go live” Lizenz) des Microsoft Team Foundation Servers 2010 veröffentlicht worden. Auch das Lizenzmodell und die Bezeichnungen der Visual Studio 2010 Versionen haben sich geändert. Sie heißen jetzt:

  • Express
  • Professional
  • Premium
  • Ultimate

Wir haben uns den Team Foundation Server 2010 Beta 2 und die Visual Studio 2010 Ultimate Beta 2 Edition schon runtergeladen und morgen geht die Evaluation los. Sowohl intern als auch für ein Kundenprojekt haben wir schon auf die Beta 2 gewartet. Da ist in den nächsten Wochen und Monaten sicher noch die ein oder andere News hier zu erwarten.

Bezüglich Sharepoint 2010 gab es heute mit dem Start der Sharepoint-Konferenz 2009 in Las Vegas auch die dazu passenden Neuigkeiten. So ist vor allem auch für die Entwickler mit Visual Studio 2010 + Sharepoint 2010 ein erheblicher Schritt nach vorn unternommen worden.

Weitere englischsprachige Anleitungen zu Visual Studio 2010 (mit Sharepoint 2010, Silverlight, WPF, Parallel Computing, Office Development, Workflow Foundation und vielen mehr) findet ihr hier.

Viel Spaß, ich hoffe und denke den werde ich auch haben;)

h1

Team Foundation Server – Prozess Template anpassen

Juli 27, 2009

Wer sich schon immer gefragt hat wie man das Prozess Template anpassen kann kommt auf keinen Fall am “Process Template Manager” des TFS vorbei.

Zu finden ist dieser im “Team Explorer” (z.B. Visual Studio 2005/2008 öffnen) und das Team Explorer Fenster anzeigen (View > Team Explorer). Wenn man dort den TFS Server eingetragen hat, kann man den “Process Template Manager” unter “Team Foundation Server Settings” finden.

processtemplatemanager 
Process Template Manager starten

Im Manager kann man dann komplette Templates Hoch- und Runterladen sowie löschen.

processtemplatemanager1
Process Template Manager

Ein Prozess-Template besteht aus einer Reihe Ordner und Dateien (viel XML). Zum Anpassen eines Templates kann man z.B. ein vorhandenes (Standard-Template bei TFS Installation oder z.B. von Codeplex) in einen lokalen Ordner herunterladen und an der gewünschten Stelle mit Visual Studio bearbeiten.

processtemplatemanager2
Ordnerstruktur eines TFS Process Templates

Visual Studio unterstützt sowohl bei der Bearbeitung von Feldern, Layouts, Workflows und Workitem Typen. Das ganze kann man beliebig Komplex betreiben und ist sicher Inhalt vieler weiterer Blogeinträge, Artikel, …

processtemplatemanager3 
TFS Process Template im Visaul Studio bearbeiten


Hat man nun seine gewünschten Änderungen vorgenommen lädt man das angepasste Template über den Process Template Manager wieder hoch (Auswahl des Ordners wo die “ProcessTemplate.xml” liegt). Zuvor sollte man die Bezeichnung des Templates anpassen. War der Upload erfolgreich kann man nun ein neues Projekt mit dem gewünschten Template anlegen.

Viel Spaß beim ersten anpassen eines Templates.

h1

UnitTests, automatische Tests mit TFS 2008

Januar 23, 2009

Fast immer benötigt man für das Ausführen von UnitTests eine Umgebung wie im wirklichen Leben. Es sind also auch z.B. Konfigurationsfiles an einem bestimmten Ort (wie z.B. in einem Unterordner “config”) notwendig. Die Visual Studio UnitTests werden aber in einem eigenen Ordner ausgeführt und genau dort braucht man nun auch diesen Unterordner mit seinen Dateien. Hier gibt es im großen und ganzen zwei Ansätze. Entweder man konfiguriert die Testkonfiguration (siehe 2 Abbildungen):

image
–> öffnen der Testkonfiguration mit Wizard

image
–> Definieren von Dateien die für die UnitTests notwendig sind unter “Deployment”

Leider bietet der Wizard keine Möglichkeit einen Unterordner/Zielordner mit anzugeben. Dazu muss man das “.testconfig” File im XML-Editor öffnen und selbst am DeploymentItem-Tag herumeditieren. Dort steht einem nun das Attribut “outputDirectory” zur Verfügung.

<Deployment>
  <DeploymentItem filename="log4net.conf.xml"
    outputDirectory="config" />
  <DeploymentItem filename="myentlib.config" />
</Deployment>

–> .testconfig File im XML-Editor

Der zweite Ansatz ist über ein Attribut im Testcode selbst zu definieren welche Dateien für den Test notwendig sind:

DeploymentItems (DeploymentItemsAttribute bei MSDN)

[TestMethod()]
[DeploymentItem("config\\log4net.conf.xml", "config")]
public void MyTest()
{
    ...
}

–> DeploymentItemAttribut im Code

DeploymentItems und TFS Team Build:

Leider hat man nun das nächste Problem mit den DeploymentItems und UnitTests im Zusammenhang mit Teambuild. Auf dem Teambuild Server können die UnitTests nur ausgeführt werden, wenn Visual Studio installiert ist. Das VS2008 hat hier wohl einen Bug, denn er sucht die für den UnitTest definierten DeploymentItems nicht im Ordner wo die Tests ausgeführt werden, sondern im Ordner wo Visual Studio auf dem Teambuild Server installiert ist (System.Configuration.ConfigurationErrorsException: The configuration folder ‘D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\config\log4net.conf.xml’ doesn’t exist).

Geholfen hat jetzt nur ein Workaround im Testcode:

[ClassInitialize()]
public static void MyClassInitialize(
  TestContext testContext)
{
    AppDomain.CurrentDomain.SetData("APPBASE",
     Environment.CurrentDirectory);
}

–> Bei jedem UnitTest in der Initialisierung einzufügen (Forum post hier)

Team Build – Code Coverage – Partially Succeeded

Manchmal kommt es trotz erfolgreichen Build und auch erfolgreichen durchführen aller UnitTests zu dem Status “Partially Succeeded”.

image

–> “Partially Succeeded” trotz erfolgreichem Build und no failed UnitTests ?!

Ein bisschen Nachforschung bringt einen dann auf den Pfad, dass es ein paar Warnungen gegeben hat, die man auch Abarbeiten kann. Man lädt sich die Testresults auf den lokalen Rechner (Link unter “Test Run” anklicken) und arbeitet die Warnungen ab. Zum Beispiel will Code Coverage zwingend x86 dlls (siehe auch hier). Weiterhin müssen alle dlls die im Code Coverage eingeschlossen sind auch verfügbar sein. Code Coverage wird übrigens auch in der .testconfig Datei definiert und kann mit dem Wizard (siehe oben im Artikel) eingerichtet werden.

h1

C# 4.0, Azure, Application Architecture Guide

Oktober 28, 2008

Ich war ja schon bei C#3.0 dabei die neuesten Features zu beschreiben und zu zeigen. Jetzt steht schon wieder C#4.0 vor der Tür und ich werde wieder hellhörig. Sicher werde ich in den kommenden Monaten meine Augen und Ohren offen halten und nach Beispielen und Beschreibungen suchen um diese dann zu gegebenen Zeitpunkt hier vorzustellen. Ein erster Link von Dariusz soll schon mal Geschmack bereiten. Unter C# Future kann man auch noch ein paar Sachen nachlesen.
Das ganze testen lässt sich unter dem gerade erschienenen Visual Studio 2010 CTP (Rosario) mit dem .NET Framework 4.0.

Dann ist mir noch Azure aufgefallen. Eine Plattform von Microsoft für Microsoft Dienste aus dem Netz. Das ganze passt in die Thematik SaaS (Software as a Service), S+S (Software and Services), Cloud Computing und sicher einige andere Begriffe. Hier gibt es auch eine kleine Beschreibung von Dariusz.

Ich bin auch immer einer der sich gerne auf Codeplex umschaut und da sind mir heute wieder zwei neue interessante Seiten zum Thema Architektur von Anwendungen unter Verwendung von Microsoft Produkten, Plattformen und Frameworks aufgefallen:

  1. patterns & practices Application Architecture Guide – v2.0 (Beta 1 Release) – eine Art Buch
  2. patterns & practices: App Arch Guide project – FAQs, Videos, Cheat Sheets
h1

Sharepoint, Interoperabilität, Integration mit anderen Portalen

August 21, 2008

Ich wollte mich mal umschauen wie eine möglichst portalunabhängige Entwicklung mit Sharepoint durchzuführen geht. Dazu gab es die Schlagworte WSRP und JSR168. Eine schöne Übersicht zu Einbindungsmöglichkeiten mit Links, E-mail, RSS, IFrame, WSRP, Web Services, Search, WebDAV, AJAX findet man auf dem Sharepointblog von MSDN hier.

Hier ein paar weitere Ergebnisse:

1. JSR168: is a Java-based standard for how to code pluggable Portlets (i.e., SharePoint Web Parts) that interact with Java-based portals. Because SharePoint is a .NET-based Portal Framework it does not support JSR-168. SharePoint supports the WSRP (Web Services for Remote Portlets) standard. (http://blogs.technet.com/mdunkel/archive/2008/02/21/sharepoint-jsr-168-and-wsrp.aspx)

  • Das ist also mit Sharepoint eher kein Ansatz, habe ich also auch nicht weiter verfolgt.
  • Unfortunately, some customers still have the impression that because SharePoint isn’t JSR-168 compliant that it lacks some universal standard, which in fact is not correct.

2. WSRP: is an interoperability standard and a language-neutral way to request and transmit web service data. Microsoft supports services orientated architectures (SOA) and web services interoperability, by adhering to a complete set of web service specifications.

3. Resources for Interoperability with Microsoft Office SharePoint Server 2007:
(http://technet.microsoft.com/en-us/interopmigration/bb544954.aspx)

  • Hier sind WSRP Consumer, iView (for SAP), Page Capture (like iFrame), Business Data Catalog, Direct SOAP Call, RSS Viewer, XML Renderer als Beispiel für die Integrationsmöglichkeit in Sharepoint aufgeführt.
  • Die andere Richtung, das Daten und Web Parts des Sharepoint in einem anderen Portal verwendet werden sind nicht betrachten
  • Anbindung von Microsoft Office SharePoint Server (MOSS) an Backend-Systeme  (http://blogs.msdn.com/hsirtl/archive/2008/08/13/anbindung-von-microsoft-office-sharepoint-server-an-backend-systeme.aspx)                                                   

4. Integrate SharePoint into WebSphere Portal:  (http://www.mainsoft.com/products/vmw_wps.aspx)

  • Mainsoft’s SharePoint Federator for WebSphere Portal extends WebSphere Portal to serve as a kind of Über-portal that aggregates all enterprise assets, including SharePoint content, such as Office document libraries; Windows SharePoint Services 2.0 and 3.0; and .NET and Java applications, within a scalable environment.
  • http://www.mainsoft.com/products/websphere_portal.aspx
  • Mainsoft is Optimized for Visual Studio and has been validated by IBM as ServerProven and Ready for WebSphere Software.
  • A study completed in IBM’s Innovation Labs demonstrates that .NET applications cross compiled to Java bytecode using Mainsoft performs just as well as the original .NET application.

5. WSRP 2.0, JSR286: “Lastly, some customers have asked about JSR-268. Both JSR-286 and WSRP 2.0 are in DRAFT. It is unlikely that any enterprise software vendor can commit to supporting these in 2008. Or, that any enterprise architect can require their support for a standard that does not yet exist. (Feb 2008)”

6. Portalgenerationen Übersicht: (http://jopx.blogspot.com/2008/01/6-generations-of-portal-technology-from.html)

  • Das fand ich ganz interessant, vielleicht kann man davon auch etwas wiederverwenden.

Fazit: Mit der Verwendung von Sharepoint ist es trotzdem möglich mit „gewissem“ Aufwand Funktionen und Entwicklungen für andere Portaltechnologien bereitzustellen. Vielleicht sogar viel einfacher als in die andere Richtung?! Ob man auf WSRP Producer (im Idealfall WSRP v2), auf „MainSoft“ oder andere Technologien oder Lösungen setzt ist ggf. in einem Proof of Concept zu testen oder von Fall zu Fall zu entscheiden. Wie es mit einem WSRP Producer + MOSS aussieht ist eine schwierige Frage, wo hier eine interessante Diskussion zu finden ist…

h1

WCF Service für HTTP/HTTPS veröffentlichen

März 5, 2008

 
In der web.config kann über Konfiguration festgelegt werden, wie der WCF-Service erreichbar ist. Wenn man einen Service nun über HTTP und HTTPS verfügbar machen will, bietet sich die Konfiguration zweier Endpunkte an. Es sind beides basicHttpBindings, wobei der eine auf Transportebene SSL-verschlüsselt eingerichtet wird.

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="Service_Behavior">
	<serviceDebug includeExceptionDetailInFaults="false"/>
	<serviceMetadata httpGetEnabled="false"
            httpsGetEnabled="false"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <services>
    <service behaviorConfiguration="Service_Behavior"
        name="ServiceWF_WebService">
      <endpoint binding="basicHttpBinding"
        bindingConfiguration="SSLBinding"
        bindingNamespace=http://ServiceContracts/2008/03
        contract="ServiceImplementation.ServiceWF_WebService"/>
      <endpoint binding="basicHttpBinding"
        bindingNamespace=http://ServiceContracts/2008/03
        contract="ServiceImplementation.ServiceWF_WebService"/>
    </service>
  </services>
  <bindings>
    <basicHttpBinding>
    <!-- Configure basicHttpBinding with Transport security -->
      <binding name="SSLBinding">
	<security mode="Transport">
	  <transport clientCredentialType="None"/>
	</security>
      </binding>
    </basicHttpBinding>
  </bindings>
</system.serviceModel>
h1

Basta 2008 Spring

März 3, 2008

 

Ich durfte mal wieder dabei sein auf der Basta 2008 Spring Edition und habe doch einige interessante Vorträge gesehen. Der wohl beste Vortrag der mir im Gedächtnis bleiben wird hatte gar nichts mit .NET zu tun, sondern mit Zeitmanagement und wurde von Torsten Weber mit dem Thema „(Keine) Zeit für Herzrasen!“ gehalten. Die Folien und einen Blogeintrag dazu gibt es hier.

Ansonsten habe ich mir einige Themen des VSTS angeschaut und Informatio-nen dazu gesammelt, wie wir unseren TFS 2005 auf TFS 2008 upgraden und die vielen Möglichkeiten besser einsetzen können. Dazu hat u.a. Christian Binder einiges erzählt, wobei man wieder mal das Release von „Rosario“ nicht erwarten kann. Zum Thema Hierarchische Workitems kann vorerst nur ein 3rd Party Tool von http://www.artiso.com Abhilfe schaffen. Dazu findet sich auch ein Blogeintrag auf Christian Binders blog.

Weitere Folien einiger Vorträge der Basta findet man:

  • bei Thomas Schissler (Qualitätsmanagement mit VSTS, Programmier-ung mit dem TFS SDK)
  • Daniel Walzenbach (ASP.NET Model View Controller, Visualisierung von Geodaten mit Virtual Earth)
h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 9 von 9

März 1, 2008

Die Überraschung

Bei meinem ursprünglichen ersten Blick auf .NET 3.5 dachte ich ich könnte die neuesten und interessantesten Features in einer 8 teiligen Serie darstellen. Bei der Bearbeitung viel mir allerdings auf, dass es an manchen Stellen sinnvoll war schon Features in anderen Teilen mit zu besprechen. Am Ende hatte ich auf einmal nur noch 7 Teile die zu dem Thema waren. Um die Serie nicht früher abzubrechen habe ich mich noch mal umgeschaut und einige weitere Interessante Themen, die mit der Einführung von .NET 3.5 zu tun haben. Da sind zum Beispiel das neue Visual Studio 2008 – warum soll ich umsteigen, was ist neu, was sind die Killer-Features, wann sollte ich nicht umsteigen. Weiterhin werde ich auch nochmal einen kurzen Schritt zurück gehen und nochmal ein paar grundlegende Worte zu .NET 3.5 im Verhältnis zu .NET 2.0 erzählen – was von den neuen Sprachfeatures geht denn auch mit .NET 2.0? Das Thema VSTO hat mich in Verbindung mit VS 2008 ebenfalls interessiert und wird sicher auch einige andere begeistern.

Fange ich mal mit VSTO an. Zusammen mit Visual Studio 2008 wird auch VSTO3.0 mit ausgeliefert. VSTO3.0 geht ab der Visual Studio 2008 Professional Version vollständig in Visual Studio auf und beendet den wirrwarr der bisher vorhandenen VSTO-Versionen. Mit dem neuen Visual Studio 2008 können alle Projektvorlagen für Office 2003 und Office 2007 verwendet werden. Das macht es den Entwicklern natürlich deutlich einfacher. Auf die einzelnen weiteren Neuerungen gegenüber den anderen Versionen will ich hier trotzdem nicht eingehen. Eine will ich trotzdem erwähnen, die Verwendung der Ribbons ist Dank eines Designers  nun deutlich intuitiver.

Was ist denn nun .NET 3.5 im Verhältnis zu .NET 2.0 und welche der beschriebenen Features kann ich denn nun mit .NET 2.0 auch nutzen? Eines ist gegenüber der Erweiterung von .NET 3.0 bei .NET 3.5 gleich geblieben, es wird weiterhin die BCL des .NET 2.0 verwendet. Streng genommen sind wir also immer noch bei .NET 2.0. Mit den Erweiterungen von .NET 3.0 und .NET 3.5 kam es mittels zusätzlicher Assemblies zu einer Funktionserweiterung (WPF, WCF, WF … um nur die bekanntesten von .NET 3.0 zu nennen). Mit .NET 3.5 ist weiterhin ein SP für .NET 2.0 und .NET 3.0 hinzugekommen. Man sollte also aufpassen, wenn man Klassen aus dem Servicepack verwendet, das dieses auch auf der Wirkumgebung vorhanden ist. Mit .NET 3.5 ist zusätzlich ein neuer Compiler hinzugekommen, der die ganzen Spracherweiterungen ermöglicht. Es ist damit kein Problem alle Spracherweiterungen, die keine mit .NET 3.0 oder .NET 3.5 hinzugekommen-en Funktionen verwenden auch mit .NET 2.0 einzusetzen. Der Compiler „trickst“ und wandelt den Code in BCL 2.0 verständlichen Code um. Es muss lediglich der neue Compiler (am besten Visual Studio 2008 verwenden) eingesetzt und das .NET 2.0 als Zielplattform ausgewählt werden. Bei der Verwendung der Extension-Methoden wird der Compiler allerdings die „System.Core.dll“ vermissen, die erst mit .NET 3.5 dabei ist. Da es nur ein Attribut ist das fehlt, kann das im entsprechenden Namespace einfach selbst angelegt werden und die Compilierung sollte funktionieren. Beispiel hier.

namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute:CustomAttribute
    {
    }
}

Mit der Einführung von Visual Studio 2008 ist das erste Visual Studio verfügbar, dass für mehrere .NET Versionen verwendet werden kann. Ich Denke das ist schnell einleuchtend wenn man bedenkt, dass für .NET 2.0/3.0/3.5 ein und die selbe BCL verwendet wird. Es handelt sich also nicht wie beim Sprung zwischen .NET 1.1 und .NET 2.0 um eine Änderung der BCL. Ich frage mich also, wozu ich noch Visual Studio 2005 verwenden soll, sobald ich Visual Studio 2008 in den Händen habe. Bis heute ist mir noch kein entscheidender Grund eingefallen VS 2005 weiter zu verwenden. Zu bedenken sind nur die Fragen, ob alle Projektvorlagen und VS Erweiterungen die ich nicht entbehren kann vorhanden sind. Als nächstes sollte man bei der Arbeit im Team darauf achten, dass am besten alle gleichzeitig auf die neue VS 2008 Version umsteigen, damit die neuen Solution-Files von allen verwendet werden können. Es ist sogar möglich den TFS 2005 auch mit VS 2008 und dem zugehörigen Team Explorer weiter zu verwenden.

^ Teil 1: Übersicht aller Neuerungen (Einleitung)

< Teil 8: Was geht mit Silverlight

h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 8 von 9

März 1, 2008

Was geht bei Silverlight

In diesem Teil wollte ich mal schauen was denn nun von diesen Sprach-features auch bei Silverlight so geht. Dazu muss man natürlich voranstellen, das ich hier nur über Silverlight 2.0 sprechen werden. Erst bei Silverlight 2.0 kommt nämlich .NET als Entwicklungssystem ins Spiel. Wichtig ist trotzdem zu wissen, das es sich um ein völlig neues und vom eigentlichen .NET Framework losgelöstes System handelt. Diese .NET Laufzeitumgebung ist nur mit dem Silverlight Plugin (z.B. für IE und Firefox) verfügbar. Das Programmiermodell ist trotzdem das gleiche, da natürlich versucht wurde die wichtigsten Klassen und Libaries für Silverlight verfügbar zu machen. Somit wurde natürlich auch versucht die Sprachfeatures von C#3.0 mit in Silverlight hinein zu bringen, auch wenn dies ein anderer Compiler übernimmt. So sind LINQ und die Extension-Methods usw. auch für Silverlight anwendbar.

^ Teil 1: Übersicht aller Neuerungen (Einleitung)

< Teil 7: Linq

> Teil 9: Überraschung

h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 7 von 9

Februar 11, 2008

LINQ

LINQ … Language INtegrated Query stellt eine Syntax für Abfragen zur Verfügung, die ähnlich der Syntax für relationale und hierarchische Datenabfragen wie SQL und XQuery ist. Die Abfrage beginnt dabei immer mit dem from Ausdruck und endet entweder mit einem select oder group by Ausdruck.

from c in customers
group c.Name by c.Country

Mit diesen Zeile wird aus der Liste der Customers eine nach Ländern sortierte Liste der Customer-Namen erzeugt. Das gleiche kann man auch mit Hilfe der bereits bekannten Extension-Methods und Lambda Expressions schreiben:

customers.GroupBy(c => c.Country, c => c.Name)

Es wird bei genauer Betrachtung schnell deutlich, dass bei LINQ die in den anderen Teilen besprochenen Neuerungen in .NET 3.5 ihre Anwendung finden. Es sind zum einen die Anonymen Typen notwendig, denn das Ergebnis der LINQ-Abfrage ergibt in der Regel einen neuen anonymen Typ. Weiterhin die Extension Methods, denn der Compiler macht aus der LINQ-Abfrage einen Funktionsaufruf, bei dem wiederum die Lambda-Ausdrücke wiederzufinden sind.

from c in customers
where c.Name=="Microsoft"
select c

entspricht:

customers.Where(c => c.Name == "Microsoft");

etwas komplexer:

from c in customers 
where c.Name=="Microsoft"
select c.Country

entspricht:

customers.
Where(c => c.Name=="Microsoft").
Select(c => c.Country);

oder noch etwas komplexer:

from c in customers 
orderby c.Name, c.Balance descending
select new {c.Country, c.Name, c.Balance}

entspricht:

customers.
OrderBy(c => c.Name).
ThenByDescending(c => c.Balance).
Select(c => new { c.Name, c.Country, c.Balance })

Weiterhin können auch mehrfache Abfragen kombiniert und verschachtelt werden:

from c in customers
where c.City == "Dresden"
from o in c.Orders
where o.OrderDate.Year == 2008
select new { c.Name, o.OrderID, o.Total }

entspricht:

customers.
Where(c => c.City == "Dresden").
SelectMany(c =>c.Orders.
Where(o => o.OrderDate.Year == 2008).
Select(o => new { c.Name, o.OrderID, o.Total })

Und noch ein Beispiel mit „into“:

from c in customers 
group c by c.Country 
into g
select new { Country = g.Key, CustCount = g.Group.Count() }

kann auch so geschrieben werden:

from g in     
    from c in customers 
    group c by c.Country
select new { Country = g.Key, CustCount = g.Group.Count() }

entspricht:

customers.
GroupBy(c => c.Country).
Select(g => new { Country = g.Key, CustCount = g.Group.Count()})

Alles in allem ist LINQ wohl die komplexeste Erweiterung in .NET 3.5, da diese auch die meisten der besprochenen in sich vereint. Ich konnte hier also nur ganz kurz und grob auf die Syntax eingehen um einen ersten Start zu dem Thema zu finden. Es ist sicher sinnvoll sich mit LINQ to SQL (Thema O/RM) und mit den verfügbaren Beispielen und HoLs. Weiterhin bieten eine Reihe von Blogs eine Menge an Informationen wie z.B. dieser.

^ Teil 1: Übersicht aller Neuerungen (Einleitung)

< Teil 6: Anonymous Types

> Teil 8: Was geht mit Silverlight

h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 6 von 9

Februar 11, 2008

Anonymous Types

Ich denke, dass es sich bei den Anonymous Types um ein recht einfach verständliches Feature handelt. Vielleicht wird es als Einzel-Feature nicht unbedingt häufig Anwendung finden, aber spätestens mit LINQ wird auch dieses Feature im Gesamtkonzept eine Daseinsberechtigung haben. Folgendes Codebeispiel würde ich auch zu diesem Context zählen:

class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Auf den ersten Blick erscheint das wie eine abstrakte Klasse oder ein Interface, aber es handelt sich um ein .NET 3.5 Feature. Der Compiler generiert einfach die notwendigen privaten Variablen und macht aus diesen Zeilen Code jeweils einen Standard „getter“ und „setter“. Es spart dem faulen Programmierer einfach ein paar Zeilen Code. Auch folgende erweiterte Variante ist möglich:

class Customer
{
    public string Name { get; protected set; }
    public int Age { private get; set; }
} 

Der Compiler ist auch hier Klever und generiert den entsprechenden Code, wobei in diesem Beispiel der „getter“ und „setter“ jeweils unterschiedliche Access-Modifier aufweisen.

Das folgende Beispiel zeigt wohl die in Zusammenhang mit LINQ häufigere Anwendung(Schreibweise) der anonymen Typen:

var p1 = new { Name = "Anonym", Price = 666.00 };
p1.Name = "Doch nicht Anonym";

Hier wird vom Compiler ein anonymer Typ mit zwei Properties generiert und auf die Variable p1 zugewiesen. Das schöne daran ist auch die vollständige Intellisense Unterstützung von Visual Studio 2008. Sogar folgende Zeilen werden vom Compiler ohne Fehler compiliert:

var p1 = new { Name = „Test1„, Price = 666.00 };
var p2 = new { Name = „Test2„, Price = 777.00 };
p1 = p2;

Hier wird vom Compiler ein und der selbe anonymer Typ für p1 und p2  generiert und somit ist auch die Zuweisung gültig. Das sind eigentlich die wichtigsten Fakten zu diesem Thema, was im nächsten Teil mit LINQ noch extensiver zum Einsatz kommt.

^ Teil 1: Übersicht aller Neuerungen (Einleitung)

< Teil 5: Object und Collection Initializer

> Teil 7: LINQ

h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 5 von 9

Februar 8, 2008

Object und Collection Initializer

Das Initialisieren von Objekten und Collections ist mit C#3.0 durch eine zusätzliche Möglichkeit bereichert worden. In erster Linie spart man meiner Meinung nach ein paar Zeilen Code und damit natürlich Zeit. Auf dem zweiten Blick erkennt man dann natürlich noch die Notwendigkeit dieser Möglichkeit im Gesamtkonzept von C#3.0. Das wird vielleicht erst ganz am Ende bei Betrachtung aller Neuigkeiten im Gesamtkonzept klar. Ein paar Beispiele erleichtern natürlich die Verständlichkeit. Also hier die neuen Object Initializer:

var c = new Customer {Id = 1, Name = "Microsoft"};

Was der bisherigen Schreibweise entspricht:

Customer c = new Customer();
c.Id = 1;
c.Name = "Microsoft";

Das ganze kann natürlich auch in verschachtelter Form angewendet werden. Im folgenden Beispiel wird eine Linie mit zwei Punkten und deren Koordinaten initialisiert:

var l = new Line{
 P1 = {X = 0, Y = 0},
 P2 = {X = 10, Y = 10}
};

Das entspricht:

Line l = new Line();
l.P1.X = 0;
l.P1.Y = 0;
l.P2.X = 10;
l.P2.Y = 10;

Viel mehr kann man dazu eigentlich nicht erzählen. Also noch was zu den Collection Initializern:

List<int> l = new List<int> {0, 1, 2, 3};

und ein bisschen komplexer:

var c = new List<Customer>{
    new Customer {Name = "Microsoft",
        PhoneNumbers = { "206-555-0101", "425-882-8080" }},
    new Customer {Name = "Basta",
        PhoneNumbers = { "206-666-0101", "425-888-8080" }}
};

was man auch wie folgt schreiben könnte:

var c = new List<Customer>();
var _c1 = new Customer();
_c1.Name = "Microsoft";
_c1.PhoneNumbers.Add("206-555-0101");
_c1.PhoneNumbers.Add("425-882-8080");
c.Add(_c1);
var _c2 = new Customer();
_c2.Name = "Basta";
_c2.PhoneNumbers.Add("206-666-0101");
_c2.PhoneNumbers.Add("425-888-8080");
c.Add(_c2);

Es ist denke ich eines der leichter verständlichen und am schnellsten anwendbaren neuen Features von .NET 3.5
Viel Spaß beim verwenden…

^ Teil 1: Übersicht aller Neuerungen (Einleitung)

< Teil 4: Lambda Expressions

> Teil 6: Anonymous Types

h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 4 von 9

Februar 8, 2008

Expression Trees und Lambda Expressions

Nach langer langer Zeit will ich mal wieder in meiner kleinen Serie fortfahren. Da es jetzt schon etwas komplexer wird habe ich mich so lange gesträubt hier weiter zu schreiben. Jetzt versuche ich mal wieder so einfach wie möglich in das Thema einzuführen.
Eigentlich liegt der Ursprung in den anonymen Methoden, die mit C# 2.0 eingeführt wurden. Zur Erinnerung ein kurzes Beispiel einer anonymen Methode:

IEnummerable<Customer> list = customers.Where(
	delegate(Customer c)
	{
		return c.Name == "Microsoft";
	});

In diesem Beispiel ist das es das Ziel alle „customers“ mit dem Namen „Microsoft“ in einer Enummeration zusammenzufassen. Hier ist auch das erste mal ersichtlich, dass wir mit der Methode „Where“ auf ein bereits erläutertes neues Feature der Extension Methods zurückgreifen.

public static IEnumerable<T> Where<T>(
	this IEnumerable<T>   source, Func<T, bool> predicate)
{
	foreach(T item in source) {
		if (predicate(item)) yield return item;
	}
}

Mit C#3.0 kann man nun die oben gezeigte anonyme Methode auf eine Zeile Code reduzieren:

IEnummerable<Customer> list =
	customers.Where(c=>c.Name=="Microsoft");

In C# wird ein Lambda-Ausdruck syntaktisch als Parameter-Liste gefolgt von einem => Token und dann gefolgt von dem Ausdruck oder einer ausführ-baren Block-Anweisung (wenn der Ausdruck aufgerufen wird) geschrieben:

params => Ausdruck

also in diesem Beispiel:

c => c.Name == „Microsoft“ oder in ausführlicher Schreibweise
(Customer c) => c.Name == „Microsoft“

x => x + 1     // Implicitly typed, expression body 
x => {return x + 1;}// Implicitly typed, statement body 
(int x) => x + 1    // Explicitly typed, expression body 
(int x) => {return x + 1;} // Explicitly typed, stmnt body 
(x, y) => x * y            // Multiple parameters 
() => Console.WriteLine()  // No parameters 

Im Gegensatz zu anonymen Methoden muss bei Lambda Expression der verwendete Typ nicht explizit angegeben werden. Bei der Schreibweise c=>c.Name ist dem Compiler bereits klar, dass c vom Typ Customer sein muss, da die Extension Methode „Where“ mit einer generischen Liste vom Typ „Customer“ gearbeitet hat. Bei Verwendung von Visual Studio 2008 handelt es sich nicht nur um Compilezeit Support, sondern es wird auch bei der Designzeit mit Intellisense unterstützt.

Einige Dinge müssen beachtet werden:

delegate R Func<A,R>(A arg);

–>

Func<int,int> f1 = x => x + 1; // Ok 
Func<int,double> f2 = x => x + 1; // Ok 
Func<double,int> f3 = x => x + 1; // Error 

In der letzten Zeile ist „x+1″ nicht implizit ein double, weswegen diese Zeile schon beim Compilieren zum Fehler führt.

Was sind nun Expression Trees?

Eines der Dinge warum die Lambda-Ausdrücke so ein mächtiges Werkzeug aus der Entwickler-Perspektive sind, ist dass man sie kompiliert kann. Entweder als delegate-Code (in Form einer IL Methode) oder als Expression Tree Objekt, die benutzt während der Laufzeit benutzt werden können um den Ausdruck zum optimieren, zu analysieren oder zu transformieren. Die Extension Methode „Where“ im oberen Beispiel zeigt wie man diese in Form eines delegate Code kompilieren kann.

Kompilierte Lambda-Ausdrücke funktioniert toll, wenn wir diese für Daten innerhalb des Speichers verwenden wollen. Aber bei Fällen, in denen Sie Abfrage von Daten aus einer Datenbank durchführen wollen, ist das nicht immer der geeignete Weg. Stattdessen würde ich gerne das LINQ zu SQL ORM zur Übersetzung meines Lambda-Filters in einen SQL-Ausdruck verwenden und die Filter-Abfrage in der Remote-SQL-Datenbank durchführen lassen. Auf diese Weise würde ich nur die gefilterten Zeilen als Ergebnis erhalten.

Func<int,int> f = x => x + 1; // Code 
Expression<Func<int,int>> e = x => x + 1; // Data 

Framework-Entwickler können dies erreichen, indem sie die Argumente zu Lambda-Ausdruck vom Typ Expression <T> statt Func <T> erklären. Dies führt dazu, dass ein Lambda-Ausdruck Argument als Expression-Tree kompiliert wird. Dieser kann dann zur Laufzeit analysiert werden:

Expression<Func>Customer, bool>> filter;
filter = c => c.Name = "Microsoft";
BinaryExpression body = (BinaryExpression)filter.Body;

Im Fall von LINQ zu SQL, kann dieser Expression und Lambda-Filter verwendet werden, um diesen in SQL-Standard zu übersetzen und gegen eine Datenbank auszuführen (logisch „SELECT * from Customers where Name = ‘Microsoft’“).

^ Teil 1: Übersicht aller Neuerungen (Einleitung)

< Teil 3: Extension-Methods

> Teil 5: Object und Collection Initializer

h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 3 von 9

August 20, 2007

Extension-Methods
Extension Methods erweitern den Kontrakt für bestehende Klassen, ohne dass der Code der bestehenden Klassen verändert wird oder von der Klasse eine Ableitung erzeugt wird. Extension-Methods werden beim compilieren durch den Compiler aufgelöst, wenn der Namespace in dem die Extension-Method definiert wurde an der gewünschten Stelle eingebunden wurde.

Hier das erste einfache Beispiel:

namespace ExtensionMethods {
 public static class Extensions {
   public static string EliminateWhiteSpace(this string param) {
     return param.Replace(' ', string.Empty);
   }
 }
}

--> Verwendung:

using ExtensionMethods;

namespace ConsoleApplication {
  class Program {
    static void Main(string[] args) {
      Console.WriteLine("Hallo Welt!".EliminateWhiteSpace());
      Console.ReadLine();
    }
  }
}

Dank des „using ExtensionMethods;“ wird der Compiler keinen Fehler melden, denn der Compiler macht daraus:

Console.WriteLine(Extensions.EliminateWhiteSpace("Hallo Welt!"));

Dieses erste Beispiel zeigt schon sehr viele Regeln die bei der Verwendung von Extension-Methods beachtet werden müssen:

  1. Die Klasse in der eine Extension-Method erstellt wird, muss static sein. Das gleiche gild für die Extension-Method selber.
  2. Der erste Parameter in einer Extension-Method wird mit dem Modifier this versehen und entspricht dem Typ auf dem die Extension-Method angewendet werden kann.
  3. Instanz-Methoden haben immer vor Extension-Methods Vorrang. Es kann also keine vorhanden Funktion durch eine Extension-Method ersetzt werden.
  4. Extension Method kann nur auf die öffentlichen Member/Methoden eines Typs zugreifen.

Trotz der schönen Anwendungsfälle die man sich da überlegen könnte (z.Bsp.: Implementierung eines Interfaces durch eine Extension-Method…) ist dazu angeraten dieses Feature nur Sparsam einzusetzen um Wildwuchs und schlecht wartbaren Code zu vermeiden.

Zum Schluss noch ein weiteres Beispiel mit Generics:

public static class Extensions
{
  public static T[] Slice<T>(this T[] source,
	int index, int count)
  {
    if (index < 0 || count < 0 ||
	source.Length - index < count)
            throw new ArgumentException();
    T[] result = new T[count];
    Array.Copy(source, index, result, 0, count);
    return result;
  }
}

...

int[] d = {0, 1, 2, 3, 4};
int[] a = d.Slice(4, 3); //entspr. Extensions.Slice(d, 4, 3)

…und noch eins zur Veranschaulichung einer Rahmenbedingung:

public static class E
{
 public static void F(this object obj, int i) { }
 public static void F(this object obj, string s) { }
}
class X { }
class Y
{
   public void F(int i) { }
}
class Z
{
   public void F(object obj) { }
}
class X
{
 static void Test(X x, Y y, Z z) {
   x.F(1);        // E.F(object, int)
   x.F("hello");  // E.F(object, string)
   y.F(1);        // Y.F(int)
   y.F("hello");  // E.F(object, string)
   z.F(1);        // Z.F(object)
   z.F("hello");  // Z.F(object)
 }
}

^ Teil 1: Übersicht aller Neuerungen (Einleitung)

< Teil 2: Implizit typisierte Variablen, Implizit typisierte Arrays

> Teil 4: Lambda Expressions

h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 2 von 9

August 13, 2007

Implizit typisierte Variablen und implizit typisiserte Arrays Der Teil 2 ließ lange auf sich warten, aber nun versuche ich die 9 Teile zügig weiter fortzuführen. Heute gleich mit einem recht einfach verständlichem Thema. Wofür das gut ist und wozu das bei .NET 3.5 eingebaut wurde wird euch sicher bei den nächsten Teilen deutlich bzw. ich werde sicher darauf nocheinmal hinweisen. Variablen und Arrays können implizit mit dem Schlüsselwort var deklariert werden. Dieses kann nur bei Lokalen Variablen, for-Initializern, Resource-Aquisition und bei foreach-Statements verwendet werden. Z. Bsp:

var a = 4711;
var b = "Hallo Welt";
var c = 1.0;
var nums = new int[] {0, 1, 2, 3, 4};
var products = new Dictionary<int,Product>();

Dies entspricht:

int a = 4711;
string b = "Hallo Welt";
double c = 1.0;
int[] nums = new int[] {0, 1, 2, 3, 4};
Dictionary<int,Product> products = new Dictionary<int,Product>();

Implizit typisierte Variablen und Arrays können nur unter folgenden Rahmenbedingungen verwendet werden:

  • Die Variable muss initialisiert werden
  • Der Initializer muss ein Ausdruck (expression) sein.
  • Der Initializer Ausdruck muss zur Compile-Zeit einen Typ besitzen der kein null Typ ist.
  • Die Deklaration der lokalen Variable darf keine mehrfachen Deklaratoren besitzen.
  • Der Initializer darf keine deklarierte Variable referenzieren

Folgende Beispiele zeigen fehlerhafte Verwendung die zu einem Compiler-Error führen:

var a; // Error, kann kein Typ zur Compilezeit ermittelt werden. 
var b = {0, 1, 2, 3}; // Error, collection initializer nicht mgl. 
var c = null; // Error, null ist nicht erlaubt 
var a = b => c + 1; // Error, lambda expr. haben keinen Typ
var i = i++; // Error, Initializer darf nicht sich selbst ref.

Beispiel für foreach:

int[] nums = { 0, 1, 2, 3, 4 };
foreach (var n in numbers) Console.WriteLine(n);

Beipiele für implizit typisierte Arrays:

var a = new[] { 1, 10, 1000 };    // int[]
var b = new[] { 1, 1.5, 2, 2.5 }; // double[]
var c = new[] { "hello", null, "world” }; // string[]
var d = new[] { 1, "one", 2, "two" };     // Error

Verschachtelte Varianten sind auch möglich. Hier wird eine anonyme Datenstruktur innerhalb eines Arrays aufgebaut, die wiederum ein implizit typisiertes Array verwendet:

var c = new []{
    new {Name = “Microsoft“,
        PhoneNumbers = new []{ “206-555-0101“, “425-882-8080” }},
    new {Name = “Basta“,
        PhoneNumbers = new []{ “206-666-0101“, “425-888-8080” }}
};

^ zum Teil 1: Einleitung

> zum Teil 3: Extension Methods

h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 1 von 9 (Einleitung)

Mai 11, 2007

In den nächsten Tagen werde ich nach und nach die Neuerungen im .NET 3.5 Framework (im speziellen in C#3.0) hier vorstellen. Das ganze natürlich mit Codebeispielen hinterlegt.

Folgende Teile werde ich betrachten:

Wer es nicht erwarten kann, schaut sich am besten die C#3.0 Spezifikation und die zugehörigen Hands on Labs an.
Linq Samples findet man hier und hier.

Zur Einleitung gehört natürlich neben der Agenda auch ein paar Worte zu C#3.0 bzw .NET 3.5 die hiermit kommen.
Bei dieser neuen Version von C# handelt es sich vor allem um eine mit Features zur Verbesserung der Produktivität und es geht alles um die Verarbeitung von Daten (suchen, teilen, filtern, verarbeiten,…). Es handelt sich im Unterschied zu neuen Versionen bei Java nicht um eine API-Erweiterung, sondern um Spracherweiterungen. Dabei wurde vor allem auf aktuelle moderne beliebte dynamische Sprachen wie Python oder Ruby geschaut. Ich glaube das wird viel Spaß machen und ich hoffe euch macht die Vorstellung der neuen Features auch Spaß.

Bis bald…
> zum Teil 2: Implizit typisierte Variablen, Implizit typisierte Arrays

h1

Silverlight @ MIX07

Mai 4, 2007

Vor einigen Wochen wurde ja die Änderung des Namens WPF/E in Silverlight bekanntgegeben. Zur MIX07 in Las Vegas kam der nächste Paukenschlag und die erste Variante von Silverlight die mit einer speziellen Variante des .NET Frameworks erstellt werden kann.

Es wurden die zwei Varianten Silverlight 1.0 Beta und Silverlight 1.1 Alpha bekanntgegeben. Silverlight 1.0 Beta ist für die Erstellung von Webanwebndungen oder teilen von Webanwendung unter Verwendung von XAML, JavaScript und DHTML geeignet und wird wohl noch im Sommer diesen Jahres Final herauskommen. Silverlight 1.1 Alpha dagegen besitzt eine Mini-CLR für alle Browser und Plattformen, einschließlich der Unterstützung von WebServices, LINQ und AJAX. Wann diese Version Final zur Verfügung steht ist noch nicht bekannt. Die Feature-Matrix gibt den notwendigen Überblick.

Die notwendigen Browser-Plugins werden beim browsen auf eine Silverlight-Website zum download angeboten und sind auch schnell heruntergeladen (ca. 2MB und ca.4MB) und installiert.

Einen schönen Überblick kann man sich zum Beispiel in den MIX-Sessions holen. Zu empfehlen sind Building Silverlight Applications Using .NET (Part 1 of 2) und Part 2 of 2. Zu empfehlen ist sicher auch die Keynote 1 von Ray Ozzie und Scott Guthrie. Die Airline-Demo von der MIX07 und Informationen findet ihr hier.

Weitere notwendige Informationen auch für die Entwickler findet ihr bei Silverlight und www.microsoft.com/silverlight. Um das ganze aus sicht eines Entwicklers auszuprobieren sind Microsoft Visual Studio codename „Orcas“ Beta 1 und Microsoft Silverlight Tools Alpha for Viual Studio codename „Orcas“ Beta 1 sowie die SDKs Microsoft Silverlight 1.0 Beta Software Development Kit (SDK) oder Microsoft Silverlight 1.1 Alpha Software Development Kit (SDK) notwendig. Für die Entwicklung zusammen mit ASP.NET und ASP.NET AJAX benötigt man die Microsoft ASP.NET Futures (May 2007). Auch für die Designergemeinde gibt es entsprechend neue Tools wie Expression Blend 2 May Preview, Expression Media Encoder May Preview und Expression Design.

Ich denke jetzt wird langsam klar was Microsoft mit Silverlight vor hat, wer es nochmal in Form eines Videos sehen will, kann das hier tun. Das das ganze eine echte Alternative zu Flash und Flex werden wird, sollte damit allen klar sein, oder? Eine schöne neue Möglichkeit um in der Welt von Web2.0 und RIA (Rich Internet Applications) mitzuspielen.

Viel Spaß beim probieren, lesen und entwickeln.

h1

ASP.NET AJAX Showcase

März 14, 2007

MiniShop-Beta (http://minishop.t-systems-mms.eu/) – Ein Showcase der unter Verwendung von ASP.NET 2.0 und ASP.NET 2.0 AJAX Extensions 1.0 sowie dem ASP.NET AJAX Control Toolkit erstellt wurde.

Der Showcase wurde mit freundlicher Genehmigung der Helestra Leuchten GmbH durch T-Systems Multimedia Solutions GmbH in Kooperation mit Microsoft erstellt.

h1

Fehler in SSL Serverzertifikaten bei Webservicezugriffen ignorieren

Februar 13, 2007

Folgenden Ansatz kann man wählen um einen Fehler in einem SSL Zertifikat beim Zugriff
auf einen Webservice zu ignorieren:
- Die eigene Validate-Methode gibt immer „true“ zurück.

Note: This property is new in the .NET Framework version 2.0.
Gets or sets the callback to validate a server certificate.

System.Net.ServicePointManager.ServerCertificateValidationCallback = Validate;
private bool Validate(object sender, X509Certificate certificate,
	X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
	return true;
}

h1

Java Code aus .NET heraus verwenden

Februar 11, 2007

Man nehme ein Tool (IKVM.NET http://www.ikvm.net/index.html) und generiere sich .NET dlls aus jar-Files oder Classes. Die DLL in ein C# Projekt eingebunden und schon kann man ganz einfach und ohne viel Aufwand eine JavaAPI aus .NET heraus nutzen.
IKVM.NET is an implementation of Java for Mono and the Microsoft .NET Framework.
Es existieren noch keine Langzeittest, Perfomanctests oder Lasttests, aber ich habe eine vorhandene JavaAPI erfolgreich aus .NET heraus verwendet.