Mit Visual Basic und .NET Core 2.0 zu neuen Ufern aufbrechen – leider nur begrenzt

Mit .NET Core, der Open Source-Implementierung des .NET Framework, ist ab der aktuellen Version 2.0 auch Visual Basic dabei. Damit laufen VB-Programme unter allen Plattformen, auf denen .NET Core 2.0 installiert werden kann. Neben den wichtigsten Linux-Distributionen ist dies Mac OS. Auch ein Raspian Pi-Kleincomputer mit Raspian Linux als Betriebssystem gehört inzwischen dazu: https://blogs.msdn.microsoft.com/david/2017/07/20/setting_up_raspian_and_dotnet_core_2_0_on_a_raspberry_pi/.

Leider wird die theoretisch grenzenlose Freiheit für VB durch die Entwickler bei Microsoft künstlich eingeschränkt, denn es stehen nur Vorlangen für Konsolenprogramme und Klassenbibliotheken zur Verfügung. Die strategische Überlegung dahinter ist, dass damit das Auslagern von VB-Code aus einer WinForms- oder WPF-Anwendung in eine .NET-Standard-Klassenbibliothek ermöglicht wird. Die Klassenbibliotheken können dann z.B. in eine Universal Windows Platform-Appp eingebaut werden, so dass die die „Geschäftslogik“ einer VB-Anwendung ohne sie in C# neu schreiben zu müssen übernommen werden kann.

Theoretisch lassen sich auch ASP.NET-Core-Anwendungen in VB programmieren, doch ohne Vorlagen und „Tooling“ in Visual Studio 2017 wird das Ganze unnötig mühsam.

Schade, ich finde ein Open Source-Projekt wie .NET Core sollte nicht zu stark durch strategische Überlegungen eines Herstellers eingeschränkt werden (auch wenn dieser das Projekt komplett finanziert). Allerdings gibt es offenbar auch sehr wenige Aktivitäten in der VB-Community. Anders als bei F#.

Dennoch gibt es auch für VB-Entwickler einen direkten Draht zu Microsoft in Gestalt des UserVoice-Forums zu Visual Studio:

https://visualstudio.uservoice.com/forums/121579-visual-studio-ide

Hier wird u.a. bereits gefordert, VB.NET in V# umzubenennen oder den Quellcode von VB6 Open Source zu machen. Jeder kann Vorschläge einreichen und über vorhandene Vorschläge abstimmen.

Mein Besuch auf der Basta! 2017 Viele, viele Schlagworte, enorme Themenvielfalt

Vom 25.9 bis zum 29.9.2017 fand die alljährliche Basta!-Konferenz wie üblich im schönen Mainz statt. Nach ein paar Jahren „Abstinenz“ war ich wieder einmal dabei und mit einem Vortrag mit dem Thema „Moderne VB-Programmierung“ vertreten. Es ist klar, dass Visual Basic nicht mehr das ganz große Thema ist (um es nett zu umschreiben), aber da die Basta! einst als „BASIC-Tage“ begann und dieses Jahr bereits das 20-jährige Jubiläum gefeiert wurde, für die Branche eine Ewigkeit, durfte auch ein Vortrag zu Visual Basic nicht fehlen. Fand ich und der Veranstalter sah es zum Glück auch so, so dass ich am Dienstag um 14 Uhr 30 im Watford A Saal auch tatsächlich einige VB-Entwickler begrüßen konnte.

Insgesamt fiel mir auf, dass die Basta! längst keine reine .NET-Konferenz mehr ist. Es wird ein vielseitiger Themenmix angeboten, der auch reine Webthemen umfasst, die nichts mit .NET zu tunhaben. Viele Schlagworte gab es vor 5 Jahren schlicht nicht, einige sagen mir auch heute noch nichts. Von Ionic hatte ich zum ersten Mal gehört als ich den jungen Mann, der auf der Fahrt zur „VIP-Reception“ am Montagabend im Bus neben mir saß fragte, welche Themen er denn vortragen würde.

Hier ist eine „kleine“ Kostprobe aus dem reichhaltigen Repertoire an Schlagworten und Abkürzungen aus der Konferenzagenda: Microservices, TypeScript, Angular, Angular Router, Docker, Universal Windows Apps, Flexbox CSS, Ionic, Iot-Services, npm, Yarn5, Hadoop, DevOps, Hololens, Hateoas, CQRS, Xamarin, Webpack, RxJS, Alexa, Git, Seneca, Electron, Kubernetes, Cognitives Services, Jekyll, Bitcoin usw. usw.

Keine Frage, die IT-Branche ist in den letzten Jahren enorm gewachsen (und für alle diese Themen werden offenbar Spezialisten gesucht was ja grundsätzlich positiv ist). Eine Konferenz wie die Basta! bildet alle diese Themen ab. Schön, dass es noch Vorträge mit für mich auf Anhieb verständlichen Titeln wie „Neues bei C# 7.0“ gab. Stark vertreten sind nach wie vor Vorträge zum Thema Projektmagenment. Ein sehr guter Vortrag, den ich eher zufällig besucht hatte, war „Auf zum Mond! Agilität und DevOps vor fünfzig Jahren – und heute?“ von Thomas Buch, in dem dieser die Lehren, die in Bezug aus dem großen Projekten der Weltraumbehörde NASA in den 70er Jahren gezogen werden können, auf Software-Entwicklungteams übertrag.

Dienstag-Abend wurde die Rheingold-Halle zum Oktoberfest-Festzelt umkonfiguriert – es gab natürlich Bier (allerdings nicht aus Bayern, der Gerstensaft stammte vielmehr aus dem ca. 160 Km entfernten Bitburg), die obligatorischen Haxen, jede Menge Brezeln und andere Zutaten, die in jedes Festzelt passen. Der Höhepunkt des Abends war die Verlosung eines nagelneuen Strandkorbs. Auch das hat Basta!-Tradition, Teilnehmer der Anfangsjahre werden sich erinnern. Die Finalisten auf der Bühne mussten anhand von vorgespielten Modemtonfolgen erkennen, ob es sich um ein 14.4, 33.6 oder 56 K-Modem handelt. Die Älteren werden sich erinnern. Eigentlich eine schwer bis unlösbare Aufgabe, da sich für mich alle Tonfolgen gleich anhörten (dabei war ich bereits 1981 stolzer Besitzer eines 300 Baud-Modems) dennoch gab es einen Gewinner: Ein Entwickler aus Aurich und damit aus einer Gegend, in der Strandkörbe aufgrund der Nähe zu verschiedenen Nordseestränden ein vertrauter Anblick sind, war der glückliche Gewinner. Nach eigener Aussage hatte er sich schon immer ein solches Möbelstück für den Garten gewünscht – von daher hätte es nicht besser passen können.

Das Programm der Basta! 2017 in Mainz findet ihr hier: https://basta.net/programm/

Die nächste Basta! findet vom 19. bis 23.2.2018 in Frankfurt statt (übrigens zeitgleich zum Microsoft Technical Summit, der am 21. und 22.2.2018 ebenfalls in Frankfurt stattfinden wird).

Abschließend noch ein paar von mir geschossene Schnappschüsse von der Basta! 2017.

Moderne VB-Programmierung – Teil 2 (Tuples)

In diesem Teil meiner kleinen Einführungsserie zum Thema „Moderne VB-Programmierung“ geht es um die mit der Version 15.0 (VB 2017) eingeführten Tuples.

Tuples werden im neuen Microsoft-Dokumentationsportal docs.microsoft.com hier ausführlich vorgestellt:

https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/data-types/tuples

Eigentlich könnte ich mir weitere Erläuterungen sparen, da der Hilfetext alles sehr schön beschreibt. Die folgende Erklärungen sind daher eher für jene Entwickler, die aus Prinzip keine Dokumentation lesen;)

Es gibt Doubles, Triples und Quadruples und es gibt Tuples, die eine beliebige Anzahl an Elementen in einer Menge zusammenfassen. In der Programmierung ist ein Tuple eine bequeme Alternative zu einer Liste, die das Zusammenfassen mehrerer Werte sehr einfach macht.

Die Ausgangssituation für das folgende Beispiel ist eine Liste mit Documents-Objekten:

Bislang alles ganz einfach und überschaubar. Jetzt wird eine Function gesucht, die ein Document-Objekt anhand seiner Id zurückgibt:

Auch das ist alles nichts Neues. Übersehen wir außerdem für einen Moment, dass es kein guter Stil ist, aus einer Function auf eine Variable zuzugreifen, die auf Modul- bzw. Klassenebene definiert ist (und natürlich, dass die Function selber komplett überflüssig ist, da es dafür LINQ gibt).

Jetzt kommt der Entwickler auf die Idee, neben dem Document-Objekt einen Boolean-Wert mitzuliefern, der True ist, wenn ein Document-Objekt gefunden wurde, ansonsten False. Früher hätte der Entwickler dazu per Structure-Befehl einen neuen Typ anlegen und diesen zurückgegeben müssen. Etwa so:

Keine Frage, nicht besonders elegant. Dank den neuen Tuples sparen wir uns die Structure:

Ein Tuple wird nicht deklariert, sondern einfach als Klammerausdruck hingeschrieben. Die einzelnen Elemente werden über die Standardnamen Item1, Item2 usw. angesprochen. Da das natürlich nicht ganz optimal ist, gibt es die Möglichkeit, jedem Tuple-Element einen Namen zu geben. Dieser wird bei einer Function beim Rückgabewert angegeben – beim zurückgegebenen Wert ändert sich nichts.

Fazit: Tuples sind eine praktische Erweiterung, die sich in vielen Situationen einsetzen lässt. Sie sind immer dann praktisch, wenn mehrere Werte zusammengefasst und als „namensloses“ Ganzes weitergegeben werden sollen.

Moderne VB-Programmierung – Teil 1 (Überblick)

Mit diesem Blog-Eintrag starte ich eine kleine Serie von Artikeln, in denen ich die Neuerungen vorstelle, die bei der Programmiersprache Visual Basic mit den letzten beiden Versionen 14.0 (VS 2015) und 15.0 (VS 2017) eingeführt wurden. Den Anfang machen die Tuples.

Alle Beispiele könnt ihr mit Visual Studio oder Visual Code sowohl unter Windows als auch Linux, Mac OS usw. umsetzen. Die Umsetzung unter einem anderen Betriebssystem außer Windows geht nur mit Visual Studio Code, da Visual Studio nach wie vor nur Windows läuft. Daran wird sich auch trotz aller Open Source-Euphorie bei Microsoft nichts ändern.

Eine gute Übersicht über alle Neuerungen der Versionen 14.0 und 15.0 geben drei Artikel von Anthony D. Green und Lucian Wischik (beide VB-Team bei Microsoft) und Klaus Löffelmann (MVP zu VB):

New Language Features in Visual Basic 14

https://msdn.microsoft.com/en-us/magazine/dn890368.aspx

What’s New in Visual Basic 2017

Auch die neue Microsoft-Dokumentation docs.microsoft.com stellt die wichtigsten Neuerungen der einzelnen VB.NET-Versionen übersichtlich zusammen:

Da viele Übersichten für meinen Geschmack etwas zu ausführlich sind, habe ich im Folgenden die wichtigsten Neuerungen der Versionen 14.0 und 15.0 in einer kompakten Übersicht zusammengestellt. Im Moment erhebt die Übersicht noch keinen Anspruch auf Vollständigkeit. Auch stimmt die Zuordnung zu den einzelnen Versionen noch nicht.

NeuerungVersionWas steckt dahinter?
Tuples15.0Zusammen mehrerer Werte, z.B. als Rückgabewert einer Function
String-Interpolation14.0Einsetzen eines Ausdrucks in eine Zeichenkette ohne String.Format()
Null-Abfrageoperator .?14.0Ein Operator übernimmt die Abfrage einer Variablen auf Nothing (Null) zur Vermeidung einer NullReferenceException-
Mehrzeilige LINQ-Abfragen mit Kommentaren14.0In einer mehrzeiligen LINQ-Abfrage kann jeder Zeile mit einem Kommentar ausgestattet werden
Datums-Literale15.0Ein Datums-Zeit-Wert kann direkt durch Voranstellen von # angegeben werden.
NameOf-Operator14.0Über NameOf lässt sich der Name eines Bezeichners als String einsetzen.
Binärzahlen angeben14.0Neben Oktal- und Hex-Zahlen können damit auch Binärzahlen direkt im Quellcode angegeben werden.

Mein Vortrag auf der Basta! 2017

Ich bin Sprecher auf der Basta! 2017

Nach einigen Jahren Pause werde ich auf der nächsten Basta!-Konferenz wieder einen Vortrag halten. Es ist keine gewöhnliche Konferenz. Die einstigen „BASIC Tage“ feieren ihr 20 jähriges Jubiläum als Konferenz.

Mein Thema ist (natürlich) Visual Basic. Auch wenn die Sprache für viele ein wenig wie aus der Zeit gefallen erscheinen mag, ist wie immer noch sehr attraktiv. Selbst Schulungsanfragen zu Visual Basic 6.0 treffen von Zeit zu Zeit noch ein. Mit .NET Core 2.0 steht Visual Basic auch beim portablen .NET Framework zur Verfügung und läuft damit auch unter Linux und Mac OS. Da sich mit .NET Core keine Desktop-Anwendungen erstellen lassen, ist dies eher eine hübsche Randnotiz.

In meinem Vortrag wird es in erster Linie um die Spracherweiterungen gehen, die mit den jüngsten Versionen 14.0 (Visual Studio 2015) und 15.0 (Visual Studio 2017) dazu gekommen sind. Wer hätte gedacht, dass Visual Basic es soweit bringen würde. Außerdem wird es um .NET Core 2.0 und einen kurzen Ausblick auf Xamarin und Docker (!) geben.

Weitere Infos zur Basta! gibt es wie immer unter der folgenden Adresse: http://www.basta.net.

Die Anzahl an Themen und vor allem Sprechern ist wirklich erstaunlich. Das bedeutet ein volles Programm an den drei Hauptkonferenztagen. Ich freue mich auf den Vortrag und hoffe, dass es noch ein paar VB-Fans gibt, die kommen werden.

Visual Basic lebt und ist Teil von .NET Core 2.0

Visual Basic ist ein Phänomen als Programmiersprache. Oft geschmäht, oft tot gesagt, selten gelobt, ist sie immer seit nunmehr über 25 Jahren immer noch da und hat, wie könnte es auch anders sein, eine Zukunft.

Bei .NET Core 2.0, der Open Source-Version des .NET Frameworks (vereinfacht umschrieben), die vor kurzem fertig gestellt wurde, wird VB erstmals offiziell dabei sein. Für Visual Studio 2017 muss mindestens Update 3 vorhanden sein. Für Visual Studio 2015 gibt es wie es aussieht leider keine Vorlagen. Falls nach der Auswahl von „Visual Basic“ bei VS 2017 kein „.NET Core“ als Unterkategorie angeboten wird, musst die IDE zuerst aktualisiert werden.

Visual Studio 2017 bietet neuerdings Vorlagen für VB und .NET Core

Damit läuft Visual Basic 2017 ganz offiziell mit dem Segen von Microsoft auch unter Linux, Mac OS und wo immer sich .NET Core 2.0 installieren lässt. Das ist zwar grundsätzlich nichts Neues, da es bereits vor vielen Jahren einen VB-Compiler als Teil des Mono-Projekts gab, doch ist es für mich ein wichtiges Signal dafür, dass die .NET Core-Verantwortlichen VB nicht vergessen haben (bzw. Irgendjemand mit Einfluss Druck gemacht hat).

Ich war bekanntlich immer ein großer Fan von VB, auch wenn ich den letzten Jahren fast nur noch in C# programmiert habe. Von daher waren die paar Zeilen VB-Code, die ich am Wochenende mit .NET Core 2.0 ausprobiert habe, schon etwas ungewohnt (wie hieß noch einmal das Pendant zum using-Befehl und wird eine for-Schleife nicht mit Next beendet?).

In Visual Studio 2017 ist die Umsetzung einfach wie immer. IDE starten, Vorlage auswählen, Code eintippen und auf F5 drücken. Es gibt natürlich auch einen Debugger.

Wichtig: Aktuell (Stand August 2017) muss .NET Core 2.0 noch separat installiert werden. Nach Auskunft von Rich Lander, einem der Verantwortlichen bei Microsoft für .NET Core, soll es erst mit Update 4 oder 5 Teil des Setups von Visual Studio sein:

https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-core-2-0/

VB-Programme können unter .NET Core natürlich auch debuggt werden

Auch mit Visual Studio Code kommt man zum Ziel, wenngleich es keine so schönen Eingabehilfen und vor allem (noch?) keinen Debugger gibt (sollte es so bleiben, was ich nicht hoffe, wäre das natürlich ein absolutes K.O-Kriterium).

Die folgende Schrittfolge (die Installation des .NET Core 2.0 SDK vorausgesetzt) führen mit Visual Studio Code zu einem Erfolgserlebnis:

1) Anlegen eines leeren Verzeichnisses in der Eingabeaufforderung bzw. PowerShell, z.B. mit dem Namen „HalloVB“, und wechseln in das Verzeichznis (cd HalloVB“).

2) Eingabe von „dotnet new console -lang vb“. Dadurch werden eine Projektdatei („HalloVB.vbproj“) und eine Quellcodedatei („Program.vb“) angelegt.

3) Eingabe des Quelltextes:

Das kleine Beispiel ist eine etwas absurde Mischung aus „moderner Programmierung“ (es kommt ein Lambda vor) und jenem Spaghetticode, für den BASIC früher berühmt-berüchtigt war. Also, ernst gemeint ist das Beispiel nicht.

4) Kompilieren und ausführen über „dotnet run“.

Danach sollen ein paar Meldungen in der Konsole erscheinen. Erzeugt wird übrigens keine Exe-, sondern eine Dll-Datei.

Mit Visual Studio 2017 geht natürlich alles sehr viel komfortabler. Ein Punkt, der für Visual Studio Code spricht ist natürlich, dass es auch unter Linux & Co läuft, was bei Visual Studio nicht der Fall ist und auch nie der Fall sein wird.

Auf alle Fälle hat es Spaß gemacht nach so vielen Jahren der „Abstinenz“ wieder ein paar Zeilen VB-Code in einen Editor inzutippen, die sich theoretisch 1:1 auf alle möglichen Plattformen übertragen lassen.

Visual Basic ist natürlich nicht nur bei .NET Core 2.0 dabei, sondern unter dem aktuellen Namen Visual Basic 2017 auch beim großen .NET Framework. Die Sprache hat mit den letzten Versionen ein paar interessante Neuerungen erhalten. Ich erwähne nur Iteratoren, Tupel und, viele es werden es kaum glauben, Zeilenumbrüche innerhalb eines Befehls, ohne dass ein Zeilenumbruchzeichen eingegeben werden muss.

Wie es aussieht werde ich auf der kommenden Basta! in Mainz dabei sein, die vom 23.9 bis 28.9.2017 stattfinden wird, und das neue Visual Basic in einem Vortrag vorstellen. Weitere Infos gibt es wie immer unter http://www.basta.net.

Einen sehr guten Überblick über die Neuerungen von VB 2017 gibt ein Blog-Eintrag des Visual Basic-Teams bei Microsoft geschrieben von VB-Experte Klaus Löffelmann:

https://blogs.msdn.microsoft.com/vbteam/2017/03/30/whats-new-in-visual-basic-2017/

Tipp: Visual Studio das Speichern von Textdateien im UTF-8-Format abgewöhnen

Visual Studio hat auch in der 2015-Version die Angewohnheit Textdateien im UTF-8-Format zu speichern und den aus drei Bytes EF, BB und BF bestehenden BOM (Byte Ordering Mark) voranzustellen. Während sich bei Quelltextdateien über Datei -> Speichern untern auch die Codierung einstellen lässt, habe ich diese Option für Textdateien, die Teil eines Projekts sind, nicht gefunden.

Eine genial einfache Lösung ist ein kleines Add-In, das automatisch vor dem Speichern einer Textdatei aktiv wird und dafür sorgt, dass die BOM-Bytes nicht geschrieben werden. Das Add-In gibt es unter der folgenden Adresse:

https://vlasovstudio.com/fix-file-encoding/

Nach der Installation der Erweiterung muss über Extras -> Optionen -> Fix File Encoding eingestellt werden, für welche Erweiterungen die Anpassung vorgenommen werden soll. Voreingestellt sind die Erweiterung Html und Htm. Sollen z.B. auch CSV-Dateien berücksichtigt werden, muss der kleine Regex lediglich um ein | erweitert werden, wobei für die Erweiterung steht.

Fix File Encofing-Add In kümmert sich darum, dass bei Textdateien kein BOM-Header vorangestellt wird

Pdf-Dateien in Bitmaps zerlegen mit freier Software

In diesem Beitrag geht es um eine grundsätzlich einfache Anforderung: Ein Pdf-Dokument soll als Teil einer WPF-Anwendung seitenweise als Bitmap-Datei gespeichert werden, so dass sich z.B. eine einfache Seitenvorschau umsetzen lässt.

Natürlich gibt es jede Menge kommerzieller Komponenten, die alle sehr gut sind (ich verwende für ein Projekt z.B. Apose.Pdf for .Net, die ich empfehlen kann, auch wenn sie nicht ganz preiswert ist), und mit deren Hilfe sich die Anforderung in ein paar Zeilen Code umsetzen ließe. Für einen MVVM-Lehrgang ging es mir darum, keine kommerzielle Komponente verwenden zu müssen. Die Suche erwies sich als schwieriger als gedacht, denn die Anzahl freier Pdf-Tools ist mehr als überschaubar. Geht es um das Erstellen von Pdf-Dokumenten sind PdfSharp bzw. Migradoc eine sehr gute Wahl, allerdings bieten sie keine Renedering-Funktionalität.

Die offenbar einzige (!) freie Software, die Pdf-Dateien darstellen kann, ist muPdf von den Ghostscript-Entwicklern Artifex (https://mupdf.com). Der Sourcecode liegt in C vor, die Make-Datei erzeugt offenbar eine Exe-Datei, so dass das Einbinden in eine .NET-Assembly und Aufrufe per p/Invoke keine Option sind.

Zum Glück gibt es immer fleißige Entwickler, die solche Herausforderungen annehmen und anderen das Ergebnis ihrer Arbeit zur Verfügung stellen. Auf Codeproject gibt es zwei Projekte, die eine gute Grundlage für eigene Projekte sind:

1) https://www.codeproject.com/articles/498317/rendering-pdf-documents-with-mupdf-and-p-invoke-in

2) https://www.codeproject.com/Articles/579878/MoonPdfPanel-A-WPF-based-PDF-Viewer-Control

Im ersten Artikel beschreibt der Autor ausführlich, wie er in die von den Entwicklern von SumatraPdf, einem kleinen und feinen Open Source-Pdf-Betrachter, zur Verfügung gestellte muPdf-Bibliothek per p/Invoke einbindet.

Der zweite Artikel verwendet ebenfalls muPdf und macht daraus gleich ein Wpf-Control, das die Seiten eines Pdf-Dokuments anzeigen kann. Einfacher geht es fast nicht mehr.

Ich habe für mein Projekt eine andere Alternative verwendet in Gestalt des enorm vielseitigen Tools ImageMagick (z.B. http://imagemagick.sourceforge.net/http/www/windows.html).

Dieses Tool basiert auf Ghostscript, das daher zuvor installiert werden muss, und liegt als Exe-Datei vor. Es wandelt die Seiten einer Pdf-Datei in Bitmaps in einem beliebigen Format um. Auch wenn es grundsätzlich kein Problem mehr, die Exe-Datei als externen Prozess zu starten, etwas eleganter geht es mit Hilfe von Magick.Net, eine Assembly, die ImageMagick kapselt: https://magick.codeplex.com. Die Assembly kann auch per NuGet hinzugefügt werden. Auch hier muss Ghostscript zuvor installiert werden.

Das Abspeichern der Seiten einer Pdf-Datei als Bitmaps wird damit sehr einfach:

Ob sich diese Lösung auch für „echte“ Projekte eignet, bei denen sehr große Pdf-Dokumente geladen werden sollen, kann ich aktuell nicht beurteilen. Auf der seinen Seite wirkte mein Beispielprogramm etwas langsam und brach einem Versuch eine Pdf-Datei mit 420 Seiten zu laden mit einer OutOfMemoryExcception ab (allerdings hatte ich den Dpi-Wert auch auf 300 eingestellt, so dass jede einzelne Bitmap über 1 MB groß war). Kleinere Dateien mit ca. 40 Seiten werden schnell geladen. Auf der anderen Seite dürften die Entwickler von SumatraPdf dafür sorgen, dass die muPdf-Bibliothek performant genug ist, um auch mit großen Pdf-Dateien klarzukommen (das Laden der 420-Seiten-Datei in Sumatra Pdf ist kein Problem, sie wird praktisch verzögerungsfrei geladen).

Das Hauptausschlußkriterium für die Verwendung von muPdf und Ghostscript in einem Kundenprojekt dürfte das Lizenzmodell sein. Artifex beschreibt es ausführlich unter der folgenden Adresse: http://artifex.com/licensing/. Da es auf AGPL basiert (GNU Affero General Public License), müssste der Sourcecode der eigenen Anwendung veröffentlicht werden, was in der Regel nicht in Frage kommt. In den Lizenzbedingungen wird aber auch darauf hingewiesen, dass unter bestimmten Bedingungen auch eine Exe-Datei ausgeliefert werden darf. Wichtig ist, dass der Anwender erkennt, dass er oder sie muPdf und Ghostscript separat installieren.

Da ich alles andere als ein Experte für Lizenzierungsdetails bin und bei meinem Beispielen ohnehin immer der Quellcode dabei ist, ist dieser Aspekt für mich kein Thema. Für die meisten Entwickler dürfte das Lizenzmodell aber zu restriktiv bzw. „undurchsichtig“ sein (man kann natürlich bei Artifex nachfragen), so dass es am Ende wieder auf eine kommerzielle Komponente hinausläuft. Schade, dass Microsoft dieses Thema komplett ignoriert hat. Ein Pdf-Viewer als Teil des .NET Framework wäre eine natürlich sehr praktisch. Doch aller Voraussicht nach wird es dazu nie kommen.

Meine ersten Gehversuche mit AutoFac – Teil 1

In diesem Beitrag beschreibe ich meine ersten Gehversuche mit AutoFac, einem vielversprechenden DI-Container (DI = Dependency Injection).

Ich hatte in den vergangangen Jahren den sehr einfachen SimpleIOC-Contailer von Laurent Bugnion verwendet, der Teil von MVVM Light ist. Doch da ich MVVM Light seit einigen Jahren nicht mehr verwende und stattdessen die aus meiner Erfahrung sehr gute MVVM-Assembly von DevExpress (deren Kern nicht nur kostenlos, sondern auch quelloffen ist), habe ich auch SimpleIOC aus den Augen verloren.

Die wichtigste Frage natürlich vorweg: Wozu braucht man einen DI-Container?

Diese Frage ist gar nicht so einfach zu beantworten und sie ähnhelt der Frage, die Anfang der 90er Jahre of gestellt wurde. Wozu brauche ich diese Vererbung?

Schon damals hatte ich keine guten Antworten parat, außer dem üblichen „Sie führt einfach zu besser strukturiertem Code“. Aha. Bei DI ist es ähnlich. Wer DI konsequent einsetzt, kommt tatsächlich zu deutlich besser strukturiertem Quellcode. Der Weg dahin ist allerdings lang und beschwerlich. Und das nicht, weil DI eine komplizierte Technik ist. Das ist nicht der Fall. Der Grund ist, dass man ein Prinzip verstanden haben, muss, dass sich grundlegend auf den Programmaufbau auswirken kann (aber nicht unbedigt muss). Man muss ein wenig daran glauben.

Zum Glück gibt es auch ein wenig DI, genauso wie es auch ein wenig OOP damals gab. Auch wenn viele Puristen davon nicht viel halten, ich kann diesen Ansatz vertreten,dd aman damit in das Thema hineinwachsen kann.

Warum AutoFac? Gegenfrage: Warum nicht? Es gibt über ein Dutzend DI-Container, AutoFac ist einer der Namen, die immer wieder genannt werden. Die Webseite macht einen guten Eindruck, das Projekt wird laufend weiterentwickelt was sehr wichtig ist, es gibt viele Beispiele (u.a. im Rahmen von WCF), viele Fragen mit Antworten auf StackOverflow usw. für einen DI-Container muss man sich entscheiden (mir sagt Unity vom Pattern&Practices Team bei Microsoft nicht ganz so zu, was aber eher eine Frage der persönlichen Präferenzen ist und die sind bekanntlich breit gestreut). Und da in einem Projekt, mit dem ich beruflich zu tun hatte, AutoFac verwendet wurde, war dies der Anlass mich selber etwas mit AutoFac zu beschäftigen.

Die sehr gut gemachte Projektwebseite ist http://autofac.readthedocs.io/en/latest/index.html

Schritt 1: AutoFac hinzufügen

Das geht dank Package Manager-Konsole sehr einfach:

Install-Package AutoFac

Schritt 2: Typen registrieren

Ausgangspunkt ist ein sehr kleines Konsolenprogramm, das ein Interface und ein paar Klassen verwendet:

>IDocumentService.cs
>DocumentFileService.cs
>DocumentViewModel.cs
>MainViewModel.cs

Das Ziel soll es sein, eine Instanz der MainViewModel-Klasse zu erhalten, deren Documents-Eigenschaft eine Reihe von DocumentViewModel-Instanzen liefert, die zuvor per DocumentFileService, die IDocumentService mit ihrer GetDocuments-Methode implementiert, aus einer Xml-Datei eingelesen wurden.

Der Beitrag ist aktuell nur provisorisch, ich werde ihn in den nächsten Tagen noch einmal überarbeiten. Grundsätzlich hat es aber funktioniert:)

Mein Besuch beim „Microsoft Cloud Summit 2017“

Vom 9. bis 10. Februar 2017 fand in Frankfurt am Main der Microsoft Cloud Summit 2017 statt. Anders als im letzten Jahr allerdings nicht in der schönen Frankfurter Messe mit ihrer großzügigen und weitläufigen Architektur, angeschmiegt an die Festhalle (in der ich in den letzten 35 Jahren zahlreiche Konzerte erlebt habe [1]), sondern in dem Kongresszentrum des Sheraton Airport-Hotels an Flughafen. Gut zu erreichen (vom ICE-Gleis bis zum Konferenzcenter sind es nur ein paar Minuten), aber leider mit einer etwas verwirrenden Topologie, viel zu engen Räumen mit nur einer einzigen (!) Tür und dem konsequenten Weglassen von Beschriftungen. Aber man kann sich ja durchfragen, um irgendwo hinzu gelangen. Frankfurt a.M. war auch nur ein Stopp von vielen auf einer ausgedehnten Welttournee. Der Eintritt war kostenlos.

Die Themen der Konferenz waren Office 365 in allen Variationen, verschiedene Azure-Angebote (u.a. Cloud Backup mit einem „Schutz“ vor Ransomware, die darin besteht, dass ein mutwillig gelöschtes Backup noch 14 Tage lang wiederhergestellt werden kann – bei Amazon Cloud Drive gibt es das natürlich auch) und Entwicklerthemen. Allerdings durchweg auf 100er-Niveau. Wer auf dem Technical Summit in Damrstadt im Dezember letzten Jahres war und/oder die Entwicklung bei den Microsoft-Themen ein wenig verfolgt hat, wird auf dieser Veranstaltung nicht allzu viel Neues erfahren haben. Die „Hallo, Cloud Summit“-Demo, die aus welchen Gründen auch immer, unbedingt in einem Docker-Container ausgeführt werden muss, gehört einfach dazu.

Interessant war der Vortrag zu .NET Core – anders als beim großen .NET Framework, das nicht mehr weiterentwickelt wird, gibt es hier eine Roadmap. Demnach ist die Version 2.0 für die zweite Hälfte 2017 geplant . Passend dazu gibt es die Standard Library. Eine Klassenbibliothek, die das Attribut portabel verdient, denn sie kann sowohl unter .NET Core als auch unter dem .NET Framework verwendet werden.

Das Beste an solchen Vorträgen sind immer die Fragen und die Antworten des Microsoft-Sprechers. Sie sind auch eine kleine Belohnung dafür, es bis zum Ende ausgehalten zu haben. Die erste von beiden Fragen hatte etwas mit dem Umstand zu tun, dass .NET Core für Linux bislang in erster Linie nur für Ubuntu angeboten wird, nicht aber für andere Linux-Distributionen – vor allem Debian. Die Antwort in Kurzform: Wir arbeiten dran, wir sprechen mit dem Maintainer und versuchen nett zu sein, wir sind zwar Microsoft, können aber niemand zwingen .NET Core in eine Distribution aufzunehmen. Irgendjemand im Saal, er unbedingt .NET Core unter Debian ausführen muss? Kann ich mir im Moment nicht vorstellen, aber ich lasse mich gerne eines Besseren belehren.

Nett sind immer jene Momente, in denen der Sprecher solche Fragen ans Publikum richtet und die Anzahl der Handzeichen < 3 ist. Aber wir Deutschen sind bekanntlich etwas zurückhaltender (vermutlich aus Datenschutzgründen;) und ich saß im Saal ganz vorne links und konnte daher den Saal nur eingeschränkt überblicken. Aber es dürften nur sehr wenige Entwickler geben, die sich für ein .NET Core unter Debian interessieren. Die zweite Frage war interessanter, vor allem die Antwort. Frage: Gibt es irgendwelche Pläne für ein GUI-Paket für .NET Core? Antwort: Eine sehr gute Frage, das hören wir öfter, aber nein, es gibt aktuell keine solchen Pläne. Das einzige Projekt von dem ich (der Sprecher) etwas weiß ist Electron (ein JavaScript-Framework für Desktop-Anwendungen). Mit anderen Worten: Dass es einmal so etwas wie WinForms oder WPF für .NET Core geben wird ist im Moment ähnlich unwahrscheinlich wie Warum? Ganz einfach weil es Microsoft nicht interessiert, sie darin keine Notwendigkeit, keinen strategischen Nutzen sehen. Docker für irgendwelche JavaScript-Anwendungen ja, richtige Anwendungen mit einer GUI leider nein. Liebe Desktop-Entwickler: Ihr wart einmal gern gesehene Kunden, aber das war noch das alte Microsoft. Sorry, aber seht es endlich ein. Desktop-Anwendungen interessieren uns nicht mehr, mobile Anwendungen und Web-Anwendungen interessieren vor allem solange sie Azure verwenden.

Die Zukuft der Anwendungsentwicklung unter Windows beschränkt sich für Microsoft zur Zeit offenbar auf die „Universal Windows Platform“ (UWP), bei der die Benutzeroberfläche in XAML definiert wird. Als Programmiersprache kommen neben C# auch VB, C++ und JavaScript in Frage. Richtige Anwendungen entstehen dabei nicht, sondern lediglich Apps mit begrenzten Möglichkeiten. Man kann solche Apps auch gleich für Android oder iOs schreiben und Microsoft sorgt dafür, dass sie auch unter Windows 10 läuft.

Mit Visual Studio, das in Gestalt der Community Edition inzwischen ja kostenlos ist, erhält man zwar sehr viele Optionen. Was die Entwicklung klassischer Desktop-Anwendungen angeht ist die Unterstützung durch Microsoft aber praktisch eingestellt worden.

Ein paar interessante Links:

>https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/
>https://github.com/dotnet/core/blob/master/roadmap.md

[1] falls es jemanden interessieren sollte oder jemand tatsächlich noch bis hier gelesen hat: Die Festhalle ist für mich nach wie vor die schönste Konzerthalle in Deutschland, auch wenn die Akustik nicht ganz so überragend ist und der letzte Konzertbesuch schon wieder ein paar Jahre zurückliegt. Ich habe hier u.a. Hall and Oates, die Stones (1982), Jethro Tull, Neil Young, Eric Clapton, einige Male Peter Gabriel und natürlich den Boss (leider nicht bei seiner ersten Deutschland-Tournee 1981) live erlebt. Alles Besondere Konzerte verbunden mit schönen Erinnerungen.