Montag, 10. Dezember 2007

Basta! 2008 Spring Edition

Schon zum 2. Mal werde ich auf der BASTA! sprechen.

Meine Session(s)

Reflection in Action


Reflection gehört zu den coolesten und nützlichsten Features von .NET. In dieser Session schauen wir uns die bekannten und unbekannten Möglichkeiten von Reflection an. U.a. Wie performant ist Reflection und wie kann man die Performance optimieren? Wie generiert man dynamisch IL Code und kann ihn wieder auslesen!? Und vieles vieles mehr.

Allein dafür lohnt es sich auf die BASTA! zukommen.

Benny





Freitag, 7. Dezember 2007

PDC2008 announced!

Nachdem die PDC2007 ausgefallen ist, weil "zu wenig Neues" und die TechEd2007 Europe tatsächlich wenig Neues zu bieten hatte, findet sie nun statt:

die PDC2008 in Los Angeles!


Link

Vermutliche Themen:
- .NET Framework 4.0
- Volta (MSIL Recompiler)
- Software + Services
- WPF Composite Smart Clients
- (hoffentlich neue (WPF Controls bzw. Features))
- Silverlight 2.0 und DLR

Urlaub ist schon geplant!

Benny

Dienstag, 30. Oktober 2007

WPF Composite Clients formally known as Acropolis

Das war es also mit "Acropolis". Dem Produkt das eigentlich CAB (Composite UI Application Block) ersetzen sollte...

Hier die offizielle Bekanntmachung:
Acropolis Team Blog

Die Erkenntnisse aus dem Acropolis Projekt werden zerstückelt und fließen in die .NET Klassenbibliothek ein (Version 4.0?). Dies Vermutung habe ich bereits auf der BASTA! 2007 in Mainz geäußert, wo ich einen Vortrag über CAB gehalten habe und einen Ausblick auf Acropolis gezeigt habe. Ein Artikel für das dotnet Magazin war bereits in Arbeit. Aber eine innere Stimme hat mich zurückgehalten weiter zu machen. Jetzt weiß ich warum!

Von Seiten der CAB-Community hagelte es eine Menge Kritik an Acropolis. Der Ärger bestand darin dass CAB und die Smart Client Software Factory nicht mehr weiterentwickelt werden. Stattdessen wurde das ehrgeizige Projekt Acropolis hochgezogen, dass viel wollte aber nichts konnte. Das größte Problem war eine nicht existierende Roadmap für das Produkt.

Hier ein Kommentar dazu aus der CAB Comunity.

Requiem for Acropolis; Fanfare for CAB +


Aber es gibt schon wieder ein Neues Projekt: WPF Composite Clients

Diesmal wieder unter der Leitung der Patterns & Practices Group. Hier fließt die ganze Erfahrung aus CAB mit ein. Acropolis ist (war) nähmlich ein Projekt der UIFX Teams, das für ASP.NET und WPF zuständig ist.

Glen Block bescheibt in seinem Blog das neue Projekt.
Glenn Block

WPF Composite Client ist keine neue Version von CAB. Es wird eine neue Library und Guidance geben. Zielplattform ist WPF. Der Grund für den Aufbau einer neuen Klassenbibliothek besteht darin, dass CAB nicht für WPF designt wurde. WPF bringt eigene Konzepte wie Commands und RoutedEvents mit sich, die es in WinForms nicht gibt und somit auch nicht in CAB unterstützt werden.

WPF bietet außerdem eine komplette andere "experience". Es wird daher keinen Migrationspfad von WinForms geben. (So wie dies noch in Acropolis vorgesehen war).

Wie herausklang wird es weiter Verbesserungen an WinForms geben! WinForms geht also noch nicht in Rente.

Ich lass erstmal die Korken knallen, dass wir das Thema Acropolis hinter uns lassen können! Ich habe schon befürchtet, dass wir uns ernsthaft mit dem Produkt auseinandersetzen müssen!

Mittwoch, 10. Oktober 2007

CSV Dateien verarbeiten mit LINQ

Mein erster (langer) Artikel in der dotnetpro (http://www.dotnetpro.de/) ist erschienen!

Ich zeige, dass man mit LINQ nicht nur Datenbanken ansprechen kann, sondern ganz simple auch CSV Dateien einlesen, filtern und ausgeben kann. Mit LINQ und C# 3.0 ist das eine Sache von 3 Zeilen Code.

Auf die Idee bin ich durch den Contest der dotnetpro gekommen. Die Aufgabenstellung war CSV Daten zu verarbeiten. Es war abzusehen, dass die jeder mit einer Datenbank angehen würde. Der eine verwendet SQLServer, der andere MySQL. Besonders beliebt bei dem Contest war aber SQLLight.

Und der der Gewinner ist....

Gewonnen habe ich dann, mit meiner Lösung nicht. Und das obwohl ich 25% schneller war als die Siegerlösung!!!
(Ja Mama! Es waren wieder einmal die Flüchtigkeitsfehler)

Samstag, 22. September 2007

Neulich auf der BASTA

Hallo,

da bin ich also Zurück vom Abenteuer BASTA. Ich kann nur sagen ich hab's überlebt!

Die Keynote sollte eigentlich Dirk Primps halten. Das hat er aber irgendwie verpennt!
Er wurde natürlich von den anden Speakern ständig daran aufgezogen.

Das Essen beim Speakerdinner war nicht nach dem Geschmack der Meisten. So gab es z.B. Schafskäse an Raffaello. Das Essen auf der Konferenz war tiefkühlfraß und schlimmer als bei McDonalds. Kein Wunder, dass einige Teilnehmer und auch Speaker so ihre Probleme hatten. Holger S. hat seine Session mit Durchfall gehalten, Neno stand aber bereit um für Ihn einzuspringen.

Christian Groß hat sich bei seinem Workshop, das Handy eines Teilnehmers geschnappt und sich damit auf den Boden geworfen! Er wollte das Thema Security etwas verdeutlichen.

Der Oberhammer war Oliver Sturm. Hat er doch die 10 coolsten Features in C# 3.0 gezeigt. Er hat sich extra einen Timer programmiert und die Features auf die Sekunde vorgeführt. Man hat er die Leute weggeblasen. Er von Dingen geredet die die Leute noch in C# 5.0 kappieren werden.

Feucht fröhlich ging es beim Abschlussessen weiter:
Jörg N.: "Jetzt geht schon wieder die Diskussion los, was besser ist C# oder VB
Jörg N.: "Ich bin einfach nur müde"
Benny G.: "VB ist eine Lebenseinstellung"
Daniel F.: "VB ist eine Krankheit"
Oliver S.: "VB ist eine Lebenseinstellung -
so wie Arbeitslosigkeit!"

In diesem Sinne, bis zur nächsten BASTA!

Benjamin

Samstag, 8. September 2007

Der Name "InitializeComponent" wurde nicht deklariert

Hallo WPF Freunde!

In letzter Zeit verwende ich immer mehr WPF in meinen Anwendungen. Ganz auf WinForms möchte ich aber nicht versichten. Aus Gewohnheit nehme ich für einen neues VisualStudio Projekt die Projektvorlage "WinForms Anwendung". Wenn ich nun versuche ein WPF-UserControl zu meinem Projekt hinzufüge erscheint beim Kompilieren diese Fehlermeldung:

Der Name "InitializeComponent" wurde nicht deklariert

Mir kamen sofort einige Fragen in den Sinn:
-Habe ich .NET 3.0 richtig installiert?
- Habe ich die .NET 3.0 Extensions für VisualStuido richtig installiert?
- Ist meine XAML Datei in Ordnung?
- Macht ExpressionBlend die Probleme (damit designe ich die UserControls)?

Die Lösung ist dann doch relativ einfach.
Man muss die Projektdatei *.proj öffnen und dem BuildSystem von VisualStuido MSBuild mitteilen wie es XAML und Code-Behind Dateien zu kompilieren hat.

Diese Zeile muss man einfügen:

<import project="$(MSBuildBinPath)\Microsoft.WinFX.targets">


Klar, dass die normale .NET 2.0 WinForms Anwendung Projektvorlage noch nichts von XAML und WPF gehört hat und dementsprechend die Dateien nicht richtig kompilieren kann.

Benjamin Gopp

Sonntag, 5. August 2007

LINQ wird missverstanden!

In der Ausgabe 9 des dotnet magazins ( http://www.dotnet-magazin.de ) sind in der OpenStage Kolumne meine Gedanken zu LINQ abgedruckt. Nachdem der Artikel nun erschienen wird er auch hier "abgeblogged".

Mittlerweile habe ich schon dutzende Artikel und Vorträge zu LINQ gehört. Und immer wieder sehe am Inhalt der Vorträge und den Reaktionen, dass LINQ missverstanden wird. Auch die Innovatoren von LINQ tragen nicht gerade zur Klarheit bei. Ein typisches (schlechtes) LINQ-Beispiel ist:
From c in Customer Where c.City == “London“ Select c
Dieses Beispiel suggeriert, dass man es hier mit SQL zu tun hat. Zugegeben etwas verdrehtes SQL, das From steht vorne und das Select hinten, aber es sieht nach SQL aus. Die Assoziation die dabei unweigerlich beim Programmierer entsteht ist Folgende: Linq … SQL … Datenbank; Ah! Linq ist für Datenbanken bestimmt. Die ganze Power von LINQ verpufft in diesem Moment, wo LINQ mit SQL gleich gesetzt wird und auf die Verwendung von Datenbanken reduziert wird.
Liege ich mit meiner Einschätzung so falsch? Ein Blick in das LINQ MSDN-Forum zeigt, dass über 90% der Fragen auf die Verwendung von LINQ in Verbindung mit Datenbanken abzielen. Da wird von LINQ sogar als O/R Mapper gesprochen.
Auch die LINQ Queryoperatoren tragen nicht gerade dazu bei, dass man sich von SQL unterscheiden will. From, Select, Where - diese kennen wir alle von SQL. Was LINQ gerade auszeichnet, ist aber dass man alle Datenquellen befragen kann, also auch Objekte und XML etc.. Was vorher nur auf Datenbanken beschränkt gewesen ist, ist nun für andere Datenquellen möglich. Das ist das Revolutionäre an LINQ! Ein einheitliches Konzept um Daten abzufragen!
Natürlich muss auch ein einheitliches API für LINQ gefunden werden. Es kann schlecht sein, dass man um Datenbanken abzufragen eine andere Syntax verwenden muss, als für XML oder Objekte. Das hatten wir nämlich bisher: SQL für Datenbanken, XPath für XML und diverse Methoden für Arrays. Damit soll nun Schluss sein. Warum gerade aber LINQ so nah an SQL angelehnt ist, kann ich nicht verstehen. Vielleicht will man damit LINQ schneller etablieren. Langfristig gesehen wird man sich damit aber Probleme einhandeln. Wir können erwarten, dass mit der Zeit LINQ Implementationen für exotischere Datenquellen, auftauchen werden. Dann mag eine SQLnahe Syntax nicht mehr passend sein! Und dann sind wir bei dem Punkt angelangt, was LINQ eigentlich vermeiden wollte, nämlich fester Bestandteil einer Programmiersprache zu werden. Denn Programmiersprachen leben länger als APIs.

Samstag, 28. Juli 2007

My Extensions in VS2008

Nach einem Tag downloaden und Installation, habe ich nun endlich die Beta2 von Visual Studio 2008 "Orcas" auf meinem Rechner.





Aufgefallen ist mir der neue Projekttab "My Extensions"




Sollte es damit einfacher möglich sein neue Erweiterungen für den My Namespace zu erstellen?

Der Link "Learn more about customizung the My Namespace" war leider tot. Auch nachdem ich die 2Gig große VS2008MSDN runtergeladen und installiert hatte.

Gefunden habe ich dann doch noch, wonach ich gesucht hatte. Und zwar die Quelldatei für die WPF My Extensions, die bereits in Orcas auszuwählen sind. Diese befindet sich unter dem Ordner "My Project" in dem Ordner "MyExtensions". Dort wird man dann auch in Zukunft eigene Extensions für den My Namespace ablegen können.

Bleibt nach wie vor die Frage: Woher weiß VisualStudio, dass eine "My Extension" vorhanden ist? Ich habe weder eine Assembly noch ein Item-Template gefunden, dass die Vorlage für die "WPF My Extension" liefert. (Eine entsprechende Frage wie man denn diese My Extensions verwendet habe ich gleich nach der Entdeckung in das MSDN Forum gestellt. Mal gucken ob in nächster Zeit eine Anwort darauf zu finden ist.)

Demnächst erscheint ein Artikel von mir im dotnet.magazin über das Erstellen eines eigenen My Namespaces. Der My.Data Namespace bietet einfachen Zugriff auf eine im Vorhandene Datenbank. Der Artikel ist deswegen nur noch nicht fertig, weil das Deployment von My Extensions Probleme macht. Die Erweiterungen bestehen nämlich aus generiertem Code, der von den Projekteinstellungen abhängt, und kann deswegen nicht als Assembly verteilt werden. Es bleibt also nur noch ein Item-Template übrig für ein simples Deployment. Wenn man eine Vollintegration haben will, muss man wohl oder übel ein eigenes Add-In für Visual Studio schreiben. Das finde ich aber zu Aufwendig.

Auf der Basta 2007 Spring hatt ich mit Jay Schmelzer (Principal Program Manager Visual Basic) meine My.Data Erweiterung vorgestellt und mit ihm darüber gesprochen, wie man eigene My Erweiterungen in Visual Studio integrieren kann. Er versprach dies für Orcas mit einzuplanen.

Schade Jay, das war eigentlich nicht das, was ich mir vorgestellt hatte!



#If _MyType <> "Empty" Then
Namespace My
'''
''' Module used to define the properties that are available in the My Namespace for WPF
'''

'''
_
Module MyWpfExtension
Private m_Computer As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Devices.Computer)
Private m_User As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.ApplicationServices.User)
Private m_Windows As New ThreadSafeObjectProvider(Of MyWindows)
Private m_Log As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Logging.Log)
'''
''' Returns the application object for the running application
'''

Friend ReadOnly Property Application() As Global.System.Windows.Application
Get
Return Global.System.Windows.Application.Current
End Get
End Property
'''
''' Returns information about the host computer.
'''

Friend ReadOnly Property Computer() As Global.Microsoft.VisualBasic.Devices.Computer
Get
Return m_Computer.GetInstance()
End Get
End Property
'''
''' Returns information for the current user. If you wish to run the application with the current
''' Windows user credentials, call My.User.InitializeWithWindowsUser().
'''

Friend ReadOnly Property User() As Global.Microsoft.VisualBasic.ApplicationServices.User
Get
Return m_User.GetInstance()
End Get
End Property
'''
''' Returns the application log. The listeners can be configured by the application's configuration file.
'''

Friend ReadOnly Property Log() As Global.Microsoft.VisualBasic.Logging.Log
Get
Return m_Log.GetInstance()
End Get
End Property
'''
''' Returns the collection of Windows defined in the project.
'''

Friend ReadOnly Property Windows() As MyWindows
_
Get
Return m_Windows.GetInstance()
End Get
End Property
_
_
Friend NotInheritable Class MyWindows
_
Private Shared Function Create__Instance__(Of T As {New, Global.System.Windows.Window})(ByVal Instance As T) As T
If Instance Is Nothing Then
If m_WindowBeingCreated IsNot Nothing Then
If m_WindowBeingCreated.ContainsKey(GetType(T)) = True Then
Throw New Global.System.InvalidOperationException("The window cannot be accessed via My.Windows from the Window constructor.")
End If
Else
m_WindowBeingCreated = New Global.System.Collections.Hashtable()
End If
m_WindowBeingCreated.Add(GetType(T), Nothing)
Return New T()
m_WindowBeingCreated.Remove(GetType(T))
Else
Return Instance
End If
End Function
_
Private Sub Dispose__Instance__(Of T As Global.System.Windows.Window)(ByRef instance As T)
instance = Nothing
End Sub
_
_
Public Sub New()
MyBase.New()
End Sub
Private Shared m_WindowBeingCreated As Global.System.Collections.Hashtable
Public Overrides Function Equals(ByVal o As Object) As Boolean
Return MyBase.Equals(o)
End Function
Public Overrides Function GetHashCode() As Integer
Return MyBase.GetHashCode
End Function
_
Friend Overloads Function [GetType]() As Global.System.Type
Return GetType(MyWindows)
End Function
Public Overrides Function ToString() As String
Return MyBase.ToString
End Function
End Class
End Module
End Namespace
#End If

Montag, 16. Juli 2007

Wie kann ich Controls in einer Form zentrieren?

Ich habe eine sehr einfache Methode herausgefunden um ein beliebiges Steuerelement in einer Form zu zentrieren; also genau mittig anzuzeigen. Wenn die Form verschoben wird, soll natürlich auch die Position des Controls wieder an die neue Mitte verschoben werden.

Meine Lösung erfordert keinen Code!

Man nehme ein TableLayoutPanel und stellt seine Dock Eigenschaft auf Dock.Fill. Nun füllt das Panel die ganze Form aus. Dann reduziert man das Panel auf genau 1 Zelle, d.h. RowCount und ColumnCount = 1. Auchtung eine Zelle kann immer nur 1 Control beinhalten. Wer daher mehere Elemente mittig anzeigen lassen will muss ein weiteres Panel verwenden in das er diese Elemente einfügt. Das Control wird nun auf Anchor = Anchor.None gesetzt. Siehe da das Control befindet sich nun immer in der Mitte!


Freitag, 13. Juli 2007

Achtung! .NET 3.5 Beta1 und .NET 3.5 June CTP inkompatibel!

Achtung bei dem Ausprobieren von Programmen, die unter Orcas erstellt worden sind. Orcas installiert standardmäßig das .NET Framework 3.5 Beta1 vom April 2007. Wer sich bereits die neue Juni CTP runtergeladen hat, wird Programme die LINQ verwenden nicht ausführen können. Es erscheint folgende Fehlermeldung:

Der Typ System.Linq.Func`2 in der Assembly System.Core, Version 2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561924e089 konnte nicht geladen werden.

LINQ macht excessiven Gebrauch vom generischen Delegate Func<>. Dieser wurde nun in einen anderen Namespace verfrachtet. Statt bisher im Namespace System.Linq ist Func<> im Namespace System zu finden. Er ist somit überall verfügbar, ohne dass man einen bestimmten Namespace einbinden muss. Denn im Namespace System befinden sich alle Grundlegenden Datentypen.

Hinzugekommen sind nun auch diverse Überladungen des Action-Delegate. Es ist nämlich bisher nicht möglich einen Delegate Func zu erstellen. Jedoch kann man einen normalen Delegate delegate void Action(T obj) erstellen.

Hier nochmal die vorgefertigten Delegates in der Übersicht:

TReturn Func
TReturn Func
TReturn Func
TReturn Func
TReturn Func

void Action
void Action
void Action
void Action

Montag, 9. Juli 2007

WPF: Wie erstelle ich einen autoskalierenden Text?

Es hat lange gebraucht bis ich mich an WPF (Windows Presentation Foundation) rangewagt habe. Ich erkenne aber immer mehr die Vorzüge von WPF. Z.B. erstelle ich gerade für eine Anwendung einen animierten Splash-Screen bzw. Intro. Das gibt natürlich wesentlich mehr her als ein statisches Bitmap auf dem das Anwendungslogo zu sehen ist. Ich brauche nicht zu erwähnen, dass dies mit GDI+ echt aufwändig wäre und lange nicht so gut aussehen würde wie mit WPF.

Der Splash-Screen soll natürlich voll Vektrobasiert sein, d.h. alle Grafiken, Text und Animationen, sollen sich der Größe des Fensters anpassen. Doch wie schaffe ich es, dass die Schriftgröße eines Textes in einer TextBox automatisch skaliert wird? Ich habe lange gesucht, und keine passende "einfache" Einstellung gefunden, wie z.B. TextBox.Strech = Fill; Hieran sieht man, dass WPF noch nicht ganz ausgereift ist. Es sind zwar viele Grundelemente vorhanden, die man zu anderen komplexen Elementen zusammenstellen kann, aber das muss man halt selber machen. Zudem braucht man eine Menge Wissen über WPF, was man am Anfang natürlich nicht hat. Wenn man also eine DataGridView in WPF braucht, wird man nicht direkt rangehen können, um sich eine eigene DataGridView zu bauchen; auch wenn die dafür erforderlichen Grundelemente vorhanden sind. 1. Braucht man viel Efahrung mit WPF und 2. kostet es enorm viel Zeit.

Aber zurück zu unserem skalierbaren Text.

Wir benötigen zunächst das Tool ExpressionBlend. Meine Lösung kann nicht programmiert werden, sondern benötigt ein Feature von ExpressionBlen

1. Wir nehmen einen TextBlock. (Achtung keine normale TextBox!)
2. Wir schreiben einen Text in unseren TextBlock. Es können auch andere Elemente wie Elipsen, Controls etc. zwischen dem Text stehen. Das ist mit einem TextBlock möglich. Dann die Schriftart und andere Einstellungen setzen.
3. Wir konvertiere nun den TextBlock in einen Path. Menü->Objekt->Pfad->in Pfad konvertieren. Alle Elemente des TextBlock auch der Text wird in einen Pfad konvertiert. Dieser Pfad besteht aus relativen Punkten die Vektororientiert sind und somit voll skalierbar.
4. Wir umgeben den Pfad mit einer ViewBox. Diese ViewBox kann automatisch ihre Childelemente skalieren.
5. Tada! Fertig ist unser automatisch skalierender Text

Nachteil: wenn man den Text ändern will muss man die Schritte erneut durchführen ;-(

Es wäre natürlich auch denkbar eine Skalierung in Abhängigkeit der Fenstergröße per Databinding zu ermöglichen. Hierzu müsste man aber entsprechende Berechnungen anstellen.

Mittwoch, 27. Juni 2007

Was gibt's Neues in VisualBasic 2008?

Ich probiere seit einiger Zeit die neue VisualStudio Version Orcas bzw. VS2008 in der Beta1 aus. Was mich natürlich besonders daran interessiert, sind die neuen VB Features. Nach langem Suchen musste ich feststellen, dass bestimmte Funktionen noch nicht in Orcas Beta 1 zu finden sind. Das betrifft z.B. Lambda Funktionen - also inline Funktionen. Während ich in C# eine lambda-funktion so schreiben kann x => x+1 (Eine Funktion mit dem Parameter x der x + 1 zurückgibt) sollte man in VB dies schreiben können Function(x) x+1. Anscheinend kann dies der Beta Compiler noch nicht. Was blieb mir anderes übrig als mit LINQ in C# weiter zu experimentieren. (Ich muss sagen, langsam gefällt mir C#.)

Werden solche kleinen Probleme in der endgültigen Version von VB 2008 behoben sein?

Ja, die gröbsten Sachen werden wohl in VB laufen, aber man wird keine großen Sprünge machen können. Es sieht so aus als würde C# 3.0 einen Produktivitätsgewinn gegenüber VB 9.0 haben. Was besonders ironisch ist C# wird dynamischer sein als VB. (Das wird aber mit VBx sicherlich wieder aufgeholt werden) Warum?

Keine Collection Initializer in VB!
Während C# so ziemlich jeden Typ ableiten kann, kann dies VB anscheinend nicht.
Im C# kann ich einenen anonymen Typen definieren:
var obj = new { Property1 = "Hallo", Property2 = 12345};
VB
Dim obj = New With { Property1 = "Hallo", Property2 = 12345}

Was ist wenn ich ein Array erstellen will?
C#
var list = new[] {1,2,3};
VB
Dim list = New Integer() {1,2,3}

Ärgerlich ist hier, dass ich bei VB den Datentyp des Arrays angeben muss. Warum kann dieser nicht abgeleitet werden wie bei C#?

Mit C# kann man auch Auflistungen erstellen, die vom Compiler abgeleitet werden können.
var list = new[]
{
new {Property1 = "hallo"};
new {Property1 = "test"};
};

Sowohl der Anonyme Typ als auch die Anonyme Collection können abgeleitet werden. Man kann also einen ObjektInitializier (also {Property=Value}) auch verschachteln und damit Collections bauen.

http://oakleafblog.blogspot.com/2007/06/will-visual-basic-90-have-collection.html sagt, dass auf mysteriöse Weise in den neusten HandsOnLabs zu VB 9 alle Verweise auf Collection Initializer verschwunden sind. Noch schlimmer: Keins der angeführten Beispiele soll funktionieren. Wie man also in Zukunft dieses C# Beispiel in VB umsetzten wird, ist also noch unklar.

Was gibt es sonst Neues? http://www.panopticoncentral.net/archive/2007/06/27/21113.aspx
  • Das InternalsVisibleToAttribute wird endlich vom VB Compiler erkannt. Damit ist es möglich, dass man die mit Friend gekennzeichneten Klassen und Member aus einer anderen Assembly aufrufen kann. Dies ist für UnitTests wichtig! Zwar konnte man bisher schon dieses Attribut in VB verwenden, aber die entsprechenden Friend Klassen wurden nicht angezeigt.
  • Relaxed Delegates. Hat man z.B. einen Click EventHandler für einen Button und man möchte dieses Ereignis verarbeiten, musste man immer die entsprechende Signatur des EventHandler Delegates als Verarbeitungsmethode schreiben. In der Regel also Button1_click(sender as Object, e as EventArgs). Das war lästig, da weder sender noch e benutzt wurden (Es sei den EventArgs hatte wirklich wichtige Argumente). Es wird aber nicht das sog. Currying unterstützt, d.h. dass man auch nur einen Parameter verwenden kann, statt alle Parameter wegzulassen.
  • VB Programme können auch ohne Microsoft.VisualBasic.dll kompiliert werden. Der VB Compiler hat bisher für bestimmte late-binding Funktionen von VB dieses Dll benötigt.
  • Es können Objektmember auf Interfaces aufgerufen werden. Es gibt zwar keine Beispiele hierzu, aber ich stell mir das als Extrem LateBinding vor. Beispiel:

Interface ITest

Sub CallFunktion

End Interface

Class Person Implements ITest

Property Name

End Class

Dim p as ITest = New Person

p.Name

Ich könnte ein Objekt zu einem Interface casten und dann auf diesem Interface ein Member des Objekts aufrufen, obwohl die Variable ja jetzt ein Interface ist. (Wofür soll das gut sein???)

  • Es wird einen ? Operator wie in C# geben, um If Else Condition in Kurzform schreiben zu können. (Was für ein Blödsinn!)

Was wird nicht umgesetzt?
Erlaubt es C#, dass in Labdas auch Statements wie - Console.WriteLine(x) - möglich sind, werden in VB nur Expressions erlaubt sein - also x+1. Dadurch wird VB um echte Funktionalität für LINQ beschnitten. Auch einen yield Operator wird es in VB nicht geben. Dadurch wird VB Programmierern die Möglichkeit genommen, wirklich produktiv und kreativ mit LINQ zu arbeiten. (Shame on you Microsoft!)

Insgesamt bin ich schon sehr enttäusch von den neuen VB Features! Echt schwache Leistung Microsoft. Ich werde wohl für den Einsatz von LINQ C# einsetzten MÜSSEN, obwohl ich lieber VB verwenden würde!





Freitag, 22. Juni 2007

Meine erste BASTA! als Speaker

Ich war etwas spät dran mit der Einreichung meiner Vorträge. Es hat aber doch noch geklappt:

Ich bin bei der BASTA! als Speaker dabei!!!

Ursprünglich waren 3 Sessions vorgesehen. Das Programm war jedoch schon sehr vollgepackt, so dass ich nur 2 Sessions halten kann. Beide wahrscheinlich am Donnerstag 21.07.2007.


Meine Sessions:

SmartClients mit CAB, SCSF und "Acropolis"
Der Composite UI Application Block (CAB) der patterns & practice Group von Mirosoft ermöglicht den Bau von komplexen, lose gekoppelten und modularen Smart Clients. CAB stellt eine Infrastruktur für Architekturmuster wie MVP/MVC, Commands und Dependency Injection zur Verfügung. UseCases, Views und Services werden in Module verpackt, die je nach Anwendungsfall oder Berechtigung in eine Shell geladen werden. Bei der Entwicklung von Applikationen mit CAB werden Sie von der Smart Client Software Factory (SCSF) unterstützt. Erfahren Sie außerdem, wie in Zukunft Smart Clients für die WPF mit dem Framework "Acropolis" aussehen werden.

Visual Studio 2005 erweitern: Ohne Add-ins!
Auch ohne ein kompliziertes Add-in schreiben zu müssen, lässt sich VS 2005 erweitern. Wie? Kommen Sie in meine Session und erfahren Sie, wie Code Snippets für Visual Studio funktionieren und wie einfach diese erstellt werden können. Lernen Sie, wie sich lästiges Tippen von immer wiederkehrendem Code durch eigene Projekt- und Item-Templates ersparen lässt. Schließlich gebe ich eine Einführung in das Guidance Automation Toolkit (GAT). Mit GAT haben Sie ein mächtiges Werkzeug durch das Sie eigene Software Factories erstellen können.


Dank dem Rhetoriktraining vom Professional Developer College mit Ralf Westphal und Renate Klein, sehe ich mich der Aufgabe 100% gewachsen.

Wir sehen uns auf der BASTA! in Mainz

Aller Anfang ist schwer!

Hello World!

Jetzt habe ich es endlich geschafft meinen ersten Blogeintrag zu schreiben.
Lange habe ich überlegt, was ich eigentlich in einen Blog schreiben sollte!
Ich habe nun beschlossen einfach drauf los zu schreiben.

Warum Blogs?
Man könnte meinen Blogs haben keinerlei Nutzen. Nur wieder ein Haufen von Wichtigtuern, die das mit dem "Online-Tagebuch" missverstanden haben und tatsächlich ihr Tagebuch online stellen. 'Liebes Tagebuch, ich glaub ich bin verliebt...' oder Ähnliches.

Blogs sind mir bei meiner Arbeit sehr nützlich! Früher habe ich alle 30 Minuten meinen InternetExplorer gestartet und alle meine News Seiten geöffnent, um zu sehen ob es was Neues gibt. Heute werden meine abonierten Feeds automatisch aktuallisiert. Ich kann mehr Informationen in weniger Zeit aufnehmen. Ich muss nämlich nicht erst groß auf einer Seite danach suchen was mich interessiert. Blogs verhelfen einem, "up to date" zu sein, ohne dass man mit Newslettern überschwämt wird.

Warum Bloggen?
Konsumieren ist zwar schön, aber es ist auch schön was zurückzugeben. Ich merke wie ich durch Blogeinträge inspieriert werde. Es müssen nicht unbedingt ausformulierte Artikel sein. Nur einfache Gedanken die jemand in seinem Blog veröffentlicht hat. Sich gegenseitig intellektuell zu befruchten, finde ich sehr befriedigend.

Benjamin Gopp
HiQ-Software