Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 19 Min.

Templates im Eigenbau

Benutzerdefinierte Projektvorlagen für Visual Studio erstellen, bearbeiten und verteilen.
© dotnetpro
Visual Studio bietet bei der Neuanlage von Projekten vordefinierte Projekttypen an. Diese unterscheiden sich je nach verwendeter Visual-Studio-Edition (Community, Pro, En­terprise) und sind zudem abhängig davon, welche Funk­tionalitäten im Rahmen der Einrichtung der Entwicklungsumgebung selektiert und installiert wurden.Alle nachfolgenden Informationen beziehen sich auf Visual Studio 2017 und/oder 2019, gelten aber auch für ältere Versionen. Die meisten Entwickler nutzen die Projektvorlagen, welche für den Grundaufbau des gewählten Anwendungstyps sorgen, also beispielsweise erforderliche Verweise einrichten sowie anwendungstypspezifische Steuerelemente und Formulare bereitstellen.Wer von Visual Studio beispielsweise zu SharpDevelop wechselt (Bild 1), wird feststellen, dass dieses zwar ähnliche, aber weniger und auch andere Projekttypen anbietet. Der Grund dafür ist, dass die Projektvorlagen nicht Bestandteil von .NET sind, sondern von Visual Studio. Die Anlage von VSIX-Erweiterungspaketen (Visual Studio Integration Extension) wird von SharpDevelop generell nicht unterstützt. SharpDevelop verwaltet eigene Projektvorlagen im IDE-Unterverzeichnis Versionsnummer\data\templates über editierbare XPT- und XFT-Dateien. Diese lassen sich zwar manuell bearbeiten und auch erweitern, eine komfortable Integration und Bearbeitung in SharpDevelop gibt es jedoch nicht. Vi­sual Studio zeigt sich hier weitaus flexibler.
Projektvorlagensind Bestandteil von Visual Studio und werden von SharpDevelop nachgebildet(Bild 1) © Autor
Visual Studio bietet Projektvorlagen für bestimmte Programmiersprachen (etwa C#, Visual Basic .NET, F#) und Systemplattformen wie Windows Desktop, Windows Universal, Web und Office/Sharepoint. Für Desktop-Anwendungen gibt es beispielsweise Projekttypen für WPF-, Windows-Forms- und Konsolenanwendungen. Ferner sind gesonderte Vorlagen für Windows-Dienste, Klassen- und auch Steuerelementbibliotheken vorhanden. Um ein Projekt mit minimalem Projektaufbau zu generieren, nutzen Sie alternativ die Projekttypen Leeres Projekt/Leere Projektmappe (Windows Forms/WPF) oder Leere App (UWP). Bei den leeren Vorlagen sind Sie selbst für die Anlage von Programmelementen (etwa Formulare, Module, Klassen) verantwortlich, wie auch für das Hinzufügen von Verweisen.

Projektvorlagen

Standardvorlagen werden im Programmunterverzeichnis von Visual Studio verwaltet, wobei zwischen Projektvorlagen (ProjectTemplates) und Elementvorlagen (ItemTemplates) unterschieden wird. Vorlagen für Webprojekte liegen im ­Unterordner WebTemplates. Ältere Visual-Studio-Versionen nutzen im folgenden Pfad anstelle von xx.x die interne Ver­sionsnummer (zum Beispiel 14.0 für Visual Studio 2015).

C:<span class="hljs-string">\Program</span> Files (x86)<span class="hljs-string">\Microsoft</span> Visual Studio xx.x<span class="hljs-string">\</span>
  Common7<span class="hljs-string">\IDE</span> 
 
In neueren Visual-Studio-Versionen finden Sie die Vorlagen im folgenden Verzeichnis:

C:<span class="hljs-symbol">\P</span>rogram Files (x86)<span class="hljs-symbol">\M</span>icrosoft Visual Studio<span class="hljs-symbol">\2</span>0xx<span class="hljs-symbol">\</span>
<span class="hljs-symbol"> </span> &lt;Edition&gt;<span class="hljs-symbol">\C</span>ommon7<span class="hljs-symbol">\I</span>DE 
 
Hier wird das xx durch die letzten Ziffern des offiziellen Programmnamens ersetzt – die interne Versionsnummer wird nicht mehr verwendet. Richtig ist also 17 für Visual Studio 2017 und 19 für VS 2019. Die Edition gibt an, ob es sich um die Commu­nity-, Professional- oder Enterprise-Version handelt.Das Verzeichnis für benutzerdefinierte Vorlagen können Sie in Visual Studio direkt abfragen. Rufen Sie dazu den Menübefehl Extras | Optionen auf und wählen Sie im da­raufhin angezeigten Dialogfeld den Hierarchiezweig Projekte und Projektmappen | Speicherorte(Bild 2). Benutzervorlagen werden im Dokumentenverzeichnis des aktu­ellen Benutzers abgelegt. Beim Autor sieht das so aus: C:\Users\Andreas\Documents\Visual Studio 20xx\Templates. Das xx wird wieder durch eine Jahreszahl ersetzt (zum Beispiel 15, 17 oder 19). In untergeordneten Verzeichnissen finden Sie dann wieder die benutzerdefinierten Projektvorlagen (ProjectTemplates) und Elementvorlagen (Item­Templates). Benutzerdefinierte Vorlagen werden im ZIP-­Format eingeordnet. Das ZIP-Archiv beinhaltet Autoren- und Versionsinformationen, Bildsymbol und Vorschaubild, di­verse Projektbestandteile (zum Beispiel Formulare, Benutzersteuerelemente, Klassen und Module) sowie ein Vorlagen­manifest im XML-Format (MyTemplate.vstemplate), das sich später per Editor anpassen lässt.
Speicherortefür Projekte und Projektvorlagen lassen sich über Optionen anpassen(Bild 2) © Autor
Prinzipiell kann man Vorlagen direkt bearbeiten. Bei Standardvorlagen sollten Sie darauf allerdings verzichten und Erweiterungen in jedem Fall über eine angepasste Benutzervorlage vornehmen. Im Wesentlichen entspricht der Aufbau einer Projektvorlage dem Aufbau eines herkömmlichen Projekts. Das Projekt ist allerdings nicht vollständig implementiert und weist lediglich einen Entwicklungsrahmen für spezifische Anwendungen auf. Hauptdialoge und programmspezifische Klassen und/oder Module sind dementsprechend nicht implementiert. Allerdings verfügen die Projektvorlagen mitunter bereits über Helferklassen, Module mit Hilfsfunk­tionen, Benutzersteuerelemente im Quelltextformat oder auch Zusatzsteuerelemente von Drittherstellern. Auch firmenspezifische Erweiterungen lassen sich in die Vorlage einbetten (zum Beispiel Splash-Screens, Symbole, Grafiken). Entsprechend besitzen Projektvorlagen auch spezielle Verweise (zum Beispiel auf .NET-Namensräume oder in DLLs vorliegende Assemblies). Auch das direkte Anbinden von NuGet-Komponenten ist möglich.Der Vorteil: Durch die Verwendung einer spezialisierten Benutzervorlage können Sie sich fortan alle grundlegenden Vorarbeiten an einem bestimmten Projekttyp sparen. Wie Sie eine erweiterte Vorlage für Konsolenanwendungen mit Windows-Forms-Anbindung definieren, wird exemplarisch in [1] gezeigt. Haben Sie den grundlegenden Projektaufbau für ­einen neuen Anwendungstyp vordefiniert und als Vorlage abgelegt, können Sie die Projektvorlage bereits als neue Basis eines neuen Projekts verwenden. Wollen Sie die Vorlage später auf andere Entwicklungsrechner verteilen und dort einrichten, so definieren Sie zusätzlich ein VSIX-Verteilpaket, doch dazu später mehr.

Standard-Projektvorlagen erweitern

Um eine Standardvorlage zu bearbeiten und zu erweitern, starten Sie zuerst Visual Studio. Rufen Sie dann den Menü­befehl Datei | Neues Projekt auf und wählen Sie die Projektvorlage aus, die als Grundlage für die Erweiterung dienen soll (etwa Konsolen-App, ASP.NET-Webanwendung, WPF-App oder Windows-Forms-App). Bestätigen Sie die Projektanlage im Dialog mit OK oder Weiter. Vergeben Sie einen aussagekräftigen Projekt- und Vorlagenamen und bestätigen Sie erneut mit Weiter. Nehmen Sie dann die gewünschten Anpassungen und Erweiterungen vor,Speichern Sie das Projekt anschließend und exportieren Sie es mit Projekt | Vorlage exportieren. Nach dem nächsten Programmstart von Visual Studio steht die Vorlage dann auf dem lokalen Entwicklungsrechner zur Verfügung.Eine Weitergabe an andere Entwicklungsrechner erfolgt später so, wie es im Folgenden anhand von benutzerdefinierten Projektvorlagen gezeigt wird.

WindowsShellApp für Shell-Anwendungen

Neue Projektvorlagen sollten sich bevorzugt bestimmten Aufgaben widmen, wie der Anbindung häufig benötigter Zusatzsteuerelemente und/oder Bibliotheken, dem Aufbereiten von Vorlagen mit firmenspezifischem Erscheinungsbild, der Nutzung alternativer Programmoberflächen (zum Beispiel WinUI, Krypton Toolkit) oder der Anlage spezifischer Anwendungsprogramme (zum Beispiel datengebundene Applikatio­nen, Systemanwendungen und System-Tools).Auch für benutzerdefinierte Vorlagen greifen Sie zunächst auf eine Standardprojektvorlage zurück. Dabei gilt es sich zu entscheiden, ob Sie eine Vorlage für Desktop-Anwendungen wünschen, die auf Windows Forms, WPF oder WinUI auf­setzen soll, oder eine Konsolen- oder Webanwendung. Im ersten Beispiel wird hier ein systemnahes Anwendungsgerüst aufgebaut, das die Entwicklung von Shell- und System­anwendungen erleichtern soll. Es soll Zusatzsteuerelemente und Entwicklungsbibliotheken anbinden, die lokal vorliegen und kostenfrei erhältlich sind.Alle diese Entwicklungsbibliotheken unterstützen Windows Forms, sodass auch für die neue Benutzervorlage zunächst ein Windows-Forms-Projekt, hier mit dem Namen WindowsShellApp, angelegt wird.In einem ersten Schritt holen Sie sich die für das Beispiel erforderlichen Steuerelemente und Klassenbibliotheken auf Ihren Rechner:
  • Gong Shell: Hierbei handelt es sich um Steuerelemente, die Dialogelemente für eigene Dialoge verfügbar machen. Sie können genutzt werden, um eigene Windows-Explorer-Anwendungen zu erstellen. Darüber hinaus greifen Sie über die Komponenten auch direkt auf Shell-Funktionalitäten zu [2]. Der Quelltext wird auf GitHub bereitgestellt [3]. Ein NuGet-Paket für Gong Shell gibt es allerdings nicht. Die Anbindung erfolgt über die heruntergeladenen, binären Assemblies.
  • Windows API Codepack: Das Codepack bietet einen vereinfachten Zugriff auf die Shell-Funktionen von Windows, Hardware-Sensoren und portablen Geräten. Ferner beinhaltet es ein Steuerelement zur Integration der Windows-Explorer-Funktionalität in eigene Dialoge und einen vereinfachten Zugriff auf DirectX. Es wurde von Microsoft mit Windows 7 bereitgestellt und wird als Open-Source-Projekt auf GitHub [4] verwaltet. Dort finden Sie auch sämtliche Quelltexte zum Projekt. Projektarchive im ZIP-Format mit darin enthaltenen binären Dateien gibt es unter [5]. Zudem sind NuGet-Pakete verfügbar (Suchbegriff WindowsAPICodePack). An dieser Stelle sollen die direkt heruntergeladenen binären Assemblies angebunden werden.
Nach dem Laden der Komponenten entpacken Sie die ZIP-Archive und binden dann die DLLs per Verweis an (Visual-Studio-Menübefehl Projekt | Verweis hinzufügen). Wählen Sie im nachfolgend geöffneten Dialog die Schaltfläche Durchsuchen und dann den Ordner mit den entpackten Windows-API-Codepack-DLLs an. Markieren Sie die nachfolgend aufgelisteten DLLs:

Microsoft<span class="hljs-selector-class">.WindowsAPICodePack</span>.
  Shell<span class="hljs-selector-class">.dll</span> 
Microsoft<span class="hljs-selector-class">.WindowsAPICodePack</span><span class="hljs-selector-class">.dll</span> 
Microsoft<span class="hljs-selector-class">.WindowsAPICodePack</span>.
  Sensors<span class="hljs-selector-class">.dll</span> 
Microsoft<span class="hljs-selector-class">.WindowsAPICodePack</span><span class="hljs-selector-class">.ShellExtensions</span><span class="hljs-selector-class">.dll</span> 
 
Bestätigen Sie die Anwahl mit Hinzufügen. Die Bibliothek ExtendedLinguisticServices.dll wird an dieser Stelle nicht benötigt. Öffnen Sie den Durchsuchen-Dialog erneut, wählen Sie dann den Gong-Shell-Ordner und darin die Datei Gong­Shell.dll mit Hinzufügen an. Daraufhin werden alle ­Verweise des Hierarchiezweigs WindowsShellApp\Verweise gelistet. Markieren Sie nacheinander die neuen Verweise und setzen Sie die zugehörige Eigenschaft Lokale Kopie auf True. Damit wird dafür gesorgt, dass die Assemblies in das Programmverzeichnis kopiert werden (Bild 3).
Durch lokale Kopienübernehmen Sie angebundene Assemblies in das Ausgabeverzeichnis der übersetzten Programme(Bild 3) © Autor
Um Shell-Funktionen einzusetzen, nutzen Sie den Windows Scripting Host (WSH). Umfassende Verwaltungsfunktionen für Windows stehen zudem über die Windows Management Instrumentation (WMI) bereit. Beide Funktionalitäten binden Sie ebenfalls über Verweise an das Vorlagenprojekt. Für die WSH-Anbindung wählen Sie im Verweisdialog den Eintrag COM und dann das Element Windows Script Host Object Model an und bestätigen mit OK (Bild 4). Der Verweis wird im Projektmappen-Explorer als IWshRuntimeLibrary aufgeführt. Für WMI wählen Sie im Verweisdialog den Eintrag Assemblies und dann die Elemente System.Management und System.Management.Instrumentation und bestätigen mit OK.
Der Windows Scripting Hostwird über eine COM-Komponente angebunden (Bild 4) © Autor

Ausbau der Projektvorlage

Nun werden einige Erweiterungen in die Projektvorlage aufgenommen: die Grundfunktionen für den Systemzugriff, Standarddialoge und der Zugriff auf die angebundenen DLLs. Dabei kommen Steuerelemente, Quellmodule und Klassen zum Einsatz, deren Funktionen an dieser Stelle nicht im Detail beschrieben werden. Die vollständigen Quelltexte dazu finden Sie im Beispielprojekt:
  • Das Hauptformular Form1 der Anwendung wird in frmMain umbenannt, ansonsten aber nicht erweitert.
  • Dem Projekt selbst wird das vorhandene Benutzersteuerelement frmDrive hinzugefügt. Dabei handelt es sich um ein Benutzersteuerelement zur Laufwerksanwahl.
  • Außerdem wird dem Projekt das Formular frmDriveSelect hinzugefügt. Dabei handelt es sich um ein Formular, das das Steuerelement DriveCtl nutzt und die Laufwerksanwahl im Dialog ermöglicht [1].
  • Hinzugefügt wird auch das Quellmodul TaskDialogs, das das Projekt um diverse Dialogfunktionen erweitert.
  • Außerdem wird die Klasse SystemToolClass angelegt. Sie wird bereitgestellt, um diverse vordefinierte Systemfunk­tionen bereitzustellen und den Zugriff auf Funktionalitäten durch umbenannte Namespaces zu vereinfachen. Das Umbenennen der Namensräume erfolgt über Imports-Anweisungen nach dem Schema Imports [Aliasname] = Namespace, vergleiche Listing 1.
Listing 1: Namensräume importieren und umbenennen
Imports System &lt;br/&gt;Imports System&lt;span class="hljs-selector-class"&gt;.IO&lt;/span&gt; &lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;' Windows Scripting  Host (Namespaces umbenennen) &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;Imports Wsh = IWshRuntimeLibrary &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;Imports WshShell = IWshRuntimeLibrary.WshShell &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;'&lt;/span&gt; Windows Management Instrumentation (Namespaces &lt;br/&gt;&lt;span class="hljs-string"&gt;' umbenennen) &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;Imports sm = System.Management &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;Imports smi = System.Management.Instrumentation &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;'&lt;/span&gt; Win32- und Registrierungsfunktionen &lt;br/&gt;Imports w32 = Microsoft&lt;span class="hljs-selector-class"&gt;.Win32&lt;/span&gt; &lt;br/&gt;Imports w32r = Microsoft&lt;span class="hljs-selector-class"&gt;.Win32&lt;/span&gt;&lt;span class="hljs-selector-class"&gt;.Registry&lt;/span&gt; &lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;' Windows API Codepack &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;Imports WAPI = Microsoft.WindowsAPICodePack &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;'&lt;/span&gt; Shell-Funktionen &lt;br/&gt;Imports WAPIShell = Microsoft&lt;span class="hljs-selector-class"&gt;.WindowsAPICodePack&lt;/span&gt;&lt;span class="hljs-selector-class"&gt;.Shell&lt;/span&gt; &lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;' Shell-Erweiterungen &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;Imports WAPIShellEx = &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;  Microsoft.WindowsAPICodePack.ShellExtensions &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;'&lt;/span&gt; Sensordaten &lt;br/&gt;Imports WAPISensors = &lt;br/&gt;  Microsoft&lt;span class="hljs-selector-class"&gt;.WindowsAPICodePack&lt;/span&gt;&lt;span class="hljs-selector-class"&gt;.Sensors&lt;/span&gt; &lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;' Taskbarzugriffe &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;Imports WAPITaskbar = &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;  Microsoft.WindowsAPICodePack.Taskbar &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;Public Class SystemToolClass &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;  ... &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;End Class &lt;/span&gt; 

Projektvorlagen anlegen

Damit ist das Grundgerüst für Windows-Shell-Anwendungen bereits definiert. Um es als Vorlage zu exportieren, speichern Sie alle Änderungen und rufen dann den Menübefehl Projekt | Vorlage exportieren auf. Im folgenden Dialog geben Sie an, ob Sie eine Projektvorlage oder eine Elementvorlage erzeugen wollen. Im vorliegenden Beispiel wählen Sie die Option Projektvorlage und bestätigen mit Weiter(Bild 5).
Eröffnungsdialog des Assistentenzum Anlegen von Projekt- und Elementvorlagen(Bild 5) © Autor
In einem weiteren Dialog legen Sie die Vorlageoptionen fest: den Namen der Vorlage, eine Beschreibung, ein Bildsymbol und ein Vorschaubild. Das Ausgabeverzeichnis und der Archivname werden automatisch vergeben und ­brauchen nicht geändert zu werden. Markieren Sie noch das Kontrollfeld Vorlage automatisch in Visual Studio importieren. Der automatische Import bezieht sich auf den Rechner, auf dem die Vorlage erzeugt wird, und ist nach einem Neustart von ­Visual Studio gültig. Über das Markieren des Kontrollfelds Explorer-Fenster für die Ausgabedateiordner anzeigen sorgen Sie dafür, dass der Ordner mit dem angelegten Archiv zur Vorlage automatisch im Windows Explorer geöffnet wird. Das Anlegen der Vorlage führen Sie mit Fertig stellen durch (Bild 6).
Dialog zum Festlegender Vorlagenoptionen(Bild 6) © Autor
Erstellen Sie eine neue Vorlage, müssen Sie gegebenenfalls zuerst das Überschreiben der bereits vorhandenen Vorlage bestätigen. Die Vorlage wird im Verzeichnis abgelegt, wobei Benutzername und Jahreszahl der Visual-Studio-Version (20xx) variieren:

C:<span class="hljs-symbol">\U</span>sers<span class="hljs-symbol">\B</span>enutzername<span class="hljs-symbol">\D</span>ocuments<span class="hljs-symbol">\V</span>isual Studio 20xx<span class="hljs-symbol">\</span>
<span class="hljs-symbol"> </span> My Exported Templates 
 
Auf dem Rechner, der zum Anlegen genutzt wurde, steht die Vorlage, sofern das zuvor beschriebene Kontrollfeld markiert wurde, unmittelbar bereit. Eine gesonderte Installation ist nicht erforderlich, aber möglich.

Projektvorlagen verpacken, verteilen und installieren

Um die Projektvorlage auch auf anderen Rechnern zu installieren, ist ein VSIX-Erweiterungspaket zu erstellen (Visual Studio Integration Extension). Das VSIX-Paket benötigen Sie auch, wenn Sie beim Erstellen einer Vorlage nicht dafür gesorgt haben, dass diese auch automatisch übernommen wird.Voraussetzung für die Anlage von VSIX-Paketen ist das Visu­al Studio SDK, das sich gegebenenfalls über den Visual Studio Installer nachinstallieren lässt. Für den VSIX-Projekttyp gibt es eine eigene Projektvorlage. Speichern und schließen Sie zuerst alle aktuell bearbeiteten Projekte und Projektgruppen und rufen Sie dann denn Befehl Datei | Neues Projekt auf. Im Suchfeld des Dialogs Neues Projekt geben Sie dann den Text VSIX ein und wählen den sprachspezifischen Vorlagentyp (C# oder Visual Basic .NET). An dieser Stelle wird der Typ für Visual Basic .NET selektiert und mit OK bestätigt. Das Beispielprojekt soll den Namen VSIXWinShell­App erhalten. Auf der Seite Getting Started erfahren Sie zunächst Grundlegendes zum Erstellen von Extensions. Im Projektmappenfenster wird bereits die Datei source.extension.vsixmanifest aufgelistet. Deren Anwahl per Doppelklick öffnet das Manifest im Entwurfsmodus (Bild 7).
VSIX-Projekt:Der Entwurfsbereich für Erweiterungsmanifeste(Bild 7) © Autor
Im Entwurfsmodus machen Sie Angaben zu Metadaten (Metadata), zu Installationszielen (Install Targets), Erweiterungspaketen (Assets) und erforderlichen Voraussetzungen (Prerequisites):Metadata: Das Designfenster zeigt zunächst den Produktnamen (Product Name) und eine automatisch zugewiesene Produktkennung (Product ID), die sich aus dem Projektnamen und einer GUID zusammensetzt. Im oberen rechten Bereich gibt es Textfelder zur Eingabe von Autor und Ver­sions­nummer. Über Description weisen Sie eine Kurzbeschreibung, über Language die Sprache, über License eine Textdatei mit Li­zenz­informationen (TXT- oder RTF-Format), über Icon ein Bild­symbol und über Preview Image ein Vorschaubild zu. Suchbegriffe geben Sie über Tags an. Optional binden Sie Hinweise zur Veröffentlichung über Release Notes (HTML-, TXT- oder RTF-Format) ein, oder Anweisungen zum Einstieg über Getting Started Guide (HTML-, TXT-, DOC- oder DOCX-Format) oder einen Link zu Online-Informationen (More Info URL).Install Targets: Nach Anwahl dieser Funktionalität legen Sie den Installationstyp (Type of install) auf Visual Studio Extension fest. Anschließend geben Sie mit New die zu unterstützenden IDEs an (zum Beispiel Microsoft.VisualStudio.Community, Microsoft.VisualStudio.Pro und Microsoft.VisualStudio.Enterprise). Für die Eingabe wählen Sie die zu unterstützende Edition über das Kombinationslistenfeld Product Identifier aus, geben dann die zu unterstützende Minimal- und Maximalversion in der Form [x.0,x.) an, zum Beispiel als [15.0,16.0), und bestätigen mit OK. Über gesonderte Kontrollfelder geben Sie an, ob die Erweiterung für alle Benutzer (oberes Kontrollfeld) und durch den Windows Installer eingerichtet werden soll (unteres Kontrollfeld) (Bild 8). Treten bei der späteren Einrichtung des Erweiterungspakets Probleme auf, werden diese gesondert gemeldet.
Zuweisender zu unterstützenden Visual-Studio-Editionen und -Versionen(Bild 8) © Autor
Assets: Nach Anwahl dieses Bereichs weisen Sie das bereits generierte Vorlagenarchiv zu. Für Projektvorlagen wählen Sie über Type zunächst den Typ Microsoft.VisualStudio.ProjectTemplate und als Quelle File on filesystem aus. Da­raufhin wird das Dialogfeld erweitert und Pfad sowie Datei der Vorlage WindowsShellApp können mit Browse angewählt und mit Öffnen übernommen werden. An dieser Stelle werden keine weiteren Assets aufgenommen. Später können Sie aber durch Erweiterungen mehrere Vorlagen in einem einzelnen VSIX-Erweiterungspaket bündeln.Dependencies: In diesem Bereich verweisen Sie gegebenenfalls auf Abhängigkeiten von anderen Quellen, etwa auf Projekte, installierte Erweiterungen oder durch den Benutzer installierte Komponenten. Hier wird vom System bereits das .NET Framework 4.5 oder höher vorgegeben.Prerequisites: Über diesen Bereich weisen Sie, sofern erforderlich, weitere Voraussetzungen zu. Diese wählen Sie nach Anwahl von New über ein Kombinationslistenfeld (Name) namentlich aus (zum Beispiel Entwicklungs-Tools, SDKs oder Emulatoren). Für Projektvorlagen, wie hier, wird auf eine Zuweisung verzichtet.Mit Projekt | Neu übersetzen Sie das Projekt abschließend in ein VSIX-Erweiterungspaket. Das ist wahlweise im Debug- oder Release-Modus möglich. Der gewählte Modus entscheidet darüber, in welchem Verzeichnis die generierte Datei abgelegt wird. Ein Doppelklick auf die angelegte VSIX-Datei im untergeordneten bin-Verzeichnis des VSIX-Projektverzeichnisses startet das Einrichtungsprogramm. Optional können Sie die VSIX-Datei in ein anderes Installationsprogramm einbinden. Auf dem ursprünglichen Entwicklungsrechner lässt sich die VSIX-Vorlage direkt nutzen. Hier ist sichergestellt, dass die angebundenen DLLs in den intern verwalteten Verzeichnissen weiterhin bereitstehen. Auf anderen Entwicklungsrechnern treten mitunter aber Fehler auf. Für die vereinfachte Installation ist es später sinnvoll, das DLL-Verzeichnis der genutzten Assembly-DLLs einheitlich auf den Entwicklungsrechnern einzurichten, welche die benutzerdefinierte Vorlage nutzen sollen. Treten bei der späteren Projektanlage des Typs WindowsShellApp Fehler auf, kontrollieren Sie zuerst die Existenz des Assembly-Verzeichnisses und der darin enthaltenen DLLs. Nicht erkannte Komponenten werden im Projektmappen-Explorer mit einem Warndreieck mit Ausrufezeichen gekennzeichnet. Achten Sie darauf, dass Sie Visual Studio vor der Einrichtung beenden müssen. Ansonsten werden im Rahmen der Einrichtung Hinweise angezeigt. Erst wenn kein Visual Studio und keine untergeordneten Programmteile mehr im Speicher sind, wird die Installation gestartet. Die Installation überwachen Sie über eine Fortschrittsanzeige. Im Rahmen der Installation wird ein Wiederherstellungspunkt angelegt, über den Sie später die Installation wieder aufheben können. Die erfolgreiche Einrichtung wird abschließend bestätigt (Bild 9). Liegt die Ursache für Installationsfehler an den Angaben im VSIX-Manifest, dann werden diese im Rahmen der Installation angezeigt. In diesem Fall müssen Sie das Manifest bearbeiten, gegebenenfalls Abhängigkeiten und Voraussetzungen korrigieren und das VSIX-Projekt neu übersetzen. Wird eine Installation abgebrochen, weil eine gleichnamige Erweiterung bereits installiert ist, müssen Sie diese zuerst deinstallieren.
Das VSIX-Programmpaketübernimmt das Einrichten der Pro­jektvorlagen für unterstützte Visual-Studio-Editionen und-Versionen(Bild 9) © Autor

Projektvorlage nutzen und deinstallieren

Nach der Installation steht die Vorlage zur Verfügung. In Visual Studio rufen Sie den Befehl Datei | Neues Projekt auf, ­geben im Suchfeld des Dialogs den Vorlagenamen ein und bestätigen mit Öffnen. Um eine eingerichtete Vorlage wieder zu deinstallieren, rufen Sie in Visual Studio 2017 den Menü­befehl Extras | Extensions und Updates und in Visual Studio 2019 den Menübefehl Erweiterungen | Erweiterungen ver­walten auf, selektieren die Erweiterung und klicken auf De­installieren. Optional können Sie jede Erweiterung durch die entsprechenden Schaltflächen auch nur temporär aktivieren/deaktivieren. Übrigens wird eine Deinstallation zunächst nur vorgemerkt. Erst nach Beenden von Visual Studio startet der VSIX-Installer und entfernt die dafür vorgemerkte Vorlage, sofern man die dazu gestellte Anfrage des Installers entsprechend beantwortet (Bild 10).
Deaktivieren und Deinstallierenvon VSIX-Projekterweiterungen(Bild 10) © Autor

KryptonUIApp: Projektvorlage mit NuGet-Paketen

Wie Sie NuGet-Pakete in Projektvorlagen einbinden, soll Ihnen ein zweites Beispiel zeigen. Dazu wird ein Anwendungsrahmengerüst für alternative Windows-Forms-Programm­oberflächen aufgebaut, die auf dem Krypton Toolkit aufsetzen. Das Toolkit wird mit einer Vielzahl unterschiedlicher Bib­liotheken über NuGet-Pakete angeboten, war ursprünglich ein kommerzielles Produkt und wird mittlerweile als Open-Source-Projekt bereitgestellt [6]. Legen Sie also zuerst ein neues Windows-Forms-Projekt an und geben Sie dem Projekt den Namen KryptonUILite. Lite-Pakete sind in der Plattform­unterstützung eingeschränkt. Im Beispiel wird als Framework das .NET Framework 4.8 gewählt. Rufen Sie den Menübefehl Extras | NuGet-Paket-Manager | NuGet-Pakete für Projektmappe verwalten auf. Wählen Sie in der eingeblendeten Registerseite NuGet – Projektmappe den Link Durchsuchen an, sorgen Sie dafür, dass die Paketquelle nuget.org angewählt ist, und geben Sie dann im Suchfeld die Begriffe Krypton Toolkit Lite ein. Nach der Anwahl einzelner Pakete erhalten Sie Hinweise dazu, welche Pakete veraltet sind und nicht mehr gewartet werden. Verzichten Sie auf die Übernahme solcher Komponenten. Achten Sie zusätzlich auf die angegebenen Versionsnummern und nutzen Sie immer für alle Komponenten, sofern diese zum Krypton-Programmpaket gehören, gleiche Versionsnummern. Dann ist sichergestellt, dass Abhängigkeiten mit Modulen der gleichen Versionsnummern aufgelöst werden. Insgesamt stehen 175 Krypton-Module bereit. Darunter sind Module mit gleicher Funktionalität, aber unterschiedlichen Versionsnummern.Insgesamt gibt es rund 40 Module mit unterschiedlicher Funktionalität. Die gesamte Liste der Module in eine Projektvorlage aufzunehmen ergibt allerdings keinen Sinn. Wählen Sie hier nur die Hauptmodule aus. Weitere Module ergänzen Sie später nach Bedarf, nachdem Sie eine spezialisierte Krypton-Projektvorlage zum Öffnen angewählt haben.Tabelle 1 zeigt eine Liste sinnvoller Module. Berücksichtigen Sie nach der Paketanwahl, dass Sie im rechten Bereich des NuGet-Registers Informationen zu allen Abhängigkeiten erhalten, inklusive der Versionsnummern. Wählen Sie die ­angegebenen Pakete jeweils im linken Bereich des NuGet-Registers an. Markieren Sie dann im rechten Registerbereich das Krypton-Projekt KryptonUILite und richten Sie dann das jeweilige Paket mit Installieren ein. Standard ist, dass dann ein Dialog mit einer Vorschau der Änderungen an der Projektmappe angezeigt wird, den Sie mit OK bestätigen. Über das markierte Kontrollfeld Diese Meldung nicht mehr anzeigen, können Sie diesen Dialog optional ausblenden.

Tabelle 1: NuGet-Pakete für die KryptonUI-Vorlage

Modul Funktion, Paket Version
Krypton.Toolkit.Canary.Lite Core-Komponente zum Krypton Toolkit, Krypton.Toolkit.Canary.Lite.6.0.2108.1.nupkg 6.0.2108.1
Krypton.Navigator.Canary.Lite Erweitertes Registersteuerelement, Krypton.Navigator.Canary.Lite.6.0.2108.1.nupkg 6.0.2108.1
Krypton.Ribbon.Canary.Lite Multifunktionsleiste, Krypton.Ribbon.Canary.Lite.6.0.2108.1.nupkg 6.0.2108.1
Krypton.Workspace.Canary.Lite Workspace-Steuerelement, Krypton.Workspace.Canary.Lite.6.0.2108.1.nupkg 6.0.2108.1
Krypton.Docking.Canary.Lite Docking-Steuerelemente und Docking Manager, Krypton.Docking.Canary.Lite.6.0.2108.1.nupkg 6.0.2108.1
Nach der Installation wird das Paket durch einen nach unten weisenden Pfeil in grünem Kreis gekennzeichnet, um die Installation auch optisch erkennbar zu machen. Insgesamt werden hier fünf Pakete in der Lite-Variante gewählt. Nach dem Hinzufügen wählen Sie im Projektmappen-Explorer das Element Form1.vb/Form1/InitializeComponent() an und ändern in der partiellen Klasse die Inherits-Anweisung in folgender Weise:

&lt;Global.Microsoft.VisualBasic.CompilerServices.
  DesignerGenerated()&gt; 
Partial Class Form1 
  ' Ursprüngliche Inherits-Anweisung 
  'Inherits System.Windows.Forms.Form 

  ' Neue Inherits-Anweisung 
  Inherits Krypton.Toolkit.KryptonForm 
  ... 
End Class 
 
Dies ändert unmittelbar den Formulartyp, und bei Anwahl des Formulars werden erweiterte Formulareigenschaften bereitgestellt. Außerdem verändert sich das Erscheinungsbild der Form selbst (Ecken, Rahmen, Farbgebung und Titelleiste). Nun sichern Sie das Projekt mit Projekt | Alle speichern.

Paketreferenzen hinzufügen

An dieser Stelle existieren die Verweise zwar im aktuellen Projekt, sie werden jedoch nicht in eine Anwendung übernommen, die von der Vorlage abgeleitet wird. Um dies zu ­erreichen, bearbeiten Sie die Projektvorlage, hier KryptonUI­Lite.vbproj, in einem Editor (zum Beispiel Visual Studio Code). Beenden Sie dazu zuerst Visual Studio und laden Sie dann die Projektdatei. Ergänzen Sie am Ende der Datei über eine neue Elementgruppe (ItemGroup) die gewünschten Pa­ket­referenzen (PackageReference). Achten Sie darauf, dass die geladenen Paketnamen und die Versionsnummern mit den angebundenen Paketen (Tabelle 1) übereinstimmen müssen (Listing 2). Speichern Sie die Projektdatei im ursprünglichen Verzeichnis unter dem Namen KryptonUILite.vbproj und beenden Sie den verwendeten Editor wieder.Laden Sie das Projekt KryptonUILite nun wieder in Visual Studio, exportieren Sie es mit Projekt | Vorlage exportieren in eine neue Projektvorlage und setzen Sie die Optionen entsprechend Bild 11, bevor sie den Export mit Fertig stellen bestätigen.
Im Dialog zugewiesene Optionenzum exportierten Vorlagen­projekt KryptonUILite(Bild 11) © Autor
Listing 2: Erweitern der Projektdatei KryptonUILite.vbproj
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &lt;br/&gt;&amp;lt;Project ToolsVersion="15.0" xmlns=&lt;br/&gt;    "http://schemas.microsoft.com/developer/&lt;br/&gt;    msbuild/2003"&amp;gt; &lt;br/&gt;  &amp;lt;Import Project="$(MSBuildExtensionsPath)\&lt;br/&gt;    $(MSBuildToolsVersion)\Microsoft.Common.props" &lt;br/&gt;    Condition="Exists('$(MSBuildExtensionsPath)\&lt;br/&gt;    $(MSBuildToolsVersion)\Microsoft.Common.props')" &lt;br/&gt;  /&amp;gt; &lt;br/&gt; ...  &lt;br/&gt; &amp;lt;ItemGroup&amp;gt; &lt;br/&gt;  &amp;lt;PackageReference Include=&lt;br/&gt;    "Krypton.Docking.Canary.Lite"&amp;gt; &lt;br/&gt;      &amp;lt;Version&amp;gt;6.0.2108.1&amp;lt;/Version&amp;gt; &lt;br/&gt;    &amp;lt;/PackageReference&amp;gt; &lt;br/&gt;    &amp;lt;PackageReference Include=&lt;br/&gt;      "Krypton.Navigator.Canary.Lite"&amp;gt; &lt;br/&gt;      &amp;lt;Version&amp;gt;6.0.2108.1&amp;lt;/Version&amp;gt; &lt;br/&gt;    &amp;lt;/PackageReference&amp;gt; &lt;br/&gt;    &amp;lt;PackageReference Include=&lt;br/&gt;      "Krypton.Ribbon.Canary.Lite"&amp;gt; &lt;br/&gt;      &amp;lt;Version&amp;gt;6.0.2108.1&amp;lt;/Version&amp;gt; &lt;br/&gt;    &amp;lt;/PackageReference&amp;gt; &lt;br/&gt;    &amp;lt;PackageReference Include=&lt;br/&gt;      "Krypton.Toolkit.Canary.Lite"&amp;gt; &lt;br/&gt;      &amp;lt;Version&amp;gt;6.0.2108.1&amp;lt;/Version&amp;gt; &lt;br/&gt;    &amp;lt;/PackageReference&amp;gt; &lt;br/&gt;    &amp;lt;PackageReference Include=&lt;br/&gt;      "Krypton.Workspace.Canary.Lite"&amp;gt; &lt;br/&gt;      &amp;lt;Version&amp;gt;6.0.2108.1&amp;lt;/Version&amp;gt; &lt;br/&gt;    &amp;lt;/PackageReference&amp;gt; &lt;br/&gt;  &amp;lt;/ItemGroup&amp;gt; &lt;br/&gt;&lt;br/&gt;  &amp;lt;Import Project="$(MSBuildToolsPath)\&lt;br/&gt;    Microsoft.VisualBasic.targets" /&amp;gt; &lt;br/&gt;&amp;lt;/Project&amp;gt;  
Die Vorlage wird beim Autor im Verzeichnis C:\Users\Andreas\Documents\Visual Studio 2019\My Exported Templates unter dem Namen KryptonUILite.zip angelegt. Entpacken Sie die Datei in diesem Verzeichnis, um die im Archiv enthaltene Manifestdatei MyTemplate.vstemplate in einem Editor zu bearbeiten. Zuerst legen Sie ein neues VSIX-Projekt in Visual Studio an, über das die Vorlage KryptonUILite eingerichtet werden soll (Bild 12). Bestätigen Sie das Anlegen mit Erstellen.
VSIX-Projektfür KryptonUILite(Bild 12) © Autor
Wählen Sie im VSIX-Projekt das Vorlagemanifest mit einem Doppelklick an und setzen Sie die Metadaten entsprechend Bild 13. Kopieren Sie dann die angezeigte Product ID in die Zwischenablage. Sie benötigen die Kennung später, um das VSIX-Paket mit dem Vorlagenprojekt zu verbinden und um die NuGet-Paketeinrichtung vom VSIX-Paket durchführen zu lassen.
Metadatenzum Vorlageprojekt KryptonUILite(Bild 13) © Autor
Rufen Sie zum Manifest den Kontextmenübefehl Code anzeigen auf und geben Sie dann im Editormodus im Bereich Assets den Quelltext aus Listing 3 ein. Damit sind die NuGet-Pakete auch über das VSIX-Projekt zugeordnet. Beim Pakettyp verketten Sie den Paketnamen mit einem Punkt und der genutzten Versionsnummer.
Listing 3: source.extension.manifest (Auszug)
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &lt;br/&gt;&amp;lt;PackageManifest Version="2.0.0" xmlns=&lt;br/&gt;  "http://schemas.microsoft.com/developer/&lt;br/&gt;  vsx-schema/2011" xmlns:d=&lt;br/&gt;  "http://schemas.microsoft.com/developer/&lt;br/&gt;  vsx-schema-design/2011"&amp;gt; &lt;br/&gt;... &lt;br/&gt;&amp;lt;Assets&amp;gt; &lt;br/&gt;  &amp;lt;Asset Type="Microsoft.VisualStudio.VsPackage" &lt;br/&gt;    d:Source="Project" d:ProjectName=&lt;br/&gt;    "%CurrentProject%" Path="|%CurrentProject%;&lt;br/&gt;    PkgdefProjectOutputGroup|" /&amp;gt; &lt;br/&gt;  &amp;lt;Asset Type="Krypton.Toolkit.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:Source="File"  Path=&lt;br/&gt;    "Packages\Krypton.Toolkit.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:VsixSubPath="Packages" /&amp;gt; &lt;br/&gt;  &amp;lt;Asset Type="Krypton.Navigator.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:Source="File" Path=&lt;br/&gt;    "Packages\Krypton.Navigator.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:VsixSubPath="Packages" /&amp;gt; &lt;br/&gt;  &amp;lt;Asset Type="Krypton.Ribbon.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:Source="File" Path=&lt;br/&gt;    "Packages\Krypton.Ribbon.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:VsixSubPath="Packages" /&amp;gt; &lt;br/&gt;  &amp;lt;Asset Type="Krypton.Workspace.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:Source="File" Path=&lt;br/&gt;    "Packages\Krypton.Workspace.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:VsixSubPath="Packages" /&amp;gt; &lt;br/&gt;  &amp;lt;Asset Type="Krypton.Docking.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:Source="File" Path=&lt;br/&gt;    "Packages\Krypton.Docking.Canary.Lite.&lt;br/&gt;    6.0.2108.1.nupkg" d:VsixSubPath="Packages" /&amp;gt; &lt;br/&gt;  &amp;lt;/Assets&amp;gt; &lt;br/&gt;&amp;lt;/PackageManifest&amp;gt;  
Kehren Sie nun in den Bearbeitungsmodus der Vorlagendatei MyTemplate.vstemplate zurück, die sich im entpackten Archiv KryptonUILite befindet (Listing 4). An diese Datei hängen Sie die Erweiterung an, wie sie in Listing 5 wiedergegeben ist. Der Block WizardExtension sorgt für das Anbinden der NuGet-Assistentenerweiterung, die das Laden der NuGet-Pakete automatisiert. Im Block WizardData werden die Paketinformationen für den Assistenten abgelegt, wobei jedes einzelne Paket über einen Package-Eintrag mit eindeutiger Kennung und Versionsnummer angeführt werden kann. An dieser Stelle wird für die Pakete auf das Erweiterungspaket (repository=“extension“) unter Angabe der zuvor kopierten Product ID verwiesen (repositoryId=“VSIXKryptonUILite
.f1619636-0934-401f-9acd-0e9e0b466e3d“
). Die Daten entsprechen denen, die bei der Anbindung genutzt wurden. Speichern Sie die bearbeitete Vorlage im entpackten Ordner KryptonUILite ab und verpacken Sie dann das entpackte Archiv wieder am gleichen Speicherort in das Archiv mit dem Namen KryptonUILite.zip.
Listing 4: Manifestdatei MyTemplate.vstemplate
&amp;lt;VSTemplate Version="3.0.0" xmlns=&lt;br/&gt;    "http://schemas.microsoft.com/developer/&lt;br/&gt;    vstemplate/2005" Type="Project"&amp;gt; &lt;br/&gt;  &amp;lt;TemplateData&amp;gt; &amp;lt;Name&amp;gt;KryptonUILite&amp;lt;/Name&amp;gt; &lt;br/&gt;    &amp;lt;Description&amp;gt;Krypton-Lite-Anwendungsvorlage &lt;br/&gt;      erstellen.&amp;lt;/Description&amp;gt; &lt;br/&gt;    &amp;lt;ProjectType&amp;gt;VisualBasic&amp;lt;/ProjectType&amp;gt; &lt;br/&gt;    &amp;lt;ProjectSubType&amp;gt; &amp;lt;/ProjectSubType&amp;gt; &lt;br/&gt;    &amp;lt;SortOrder&amp;gt;1000&amp;lt;/SortOrder&amp;gt; &lt;br/&gt;    &amp;lt;CreateNewFolder&amp;gt;true&amp;lt;/CreateNewFolder&amp;gt; &lt;br/&gt;    &amp;lt;DefaultName&amp;gt;KryptonUILite&amp;lt;/DefaultName&amp;gt; &lt;br/&gt;    &amp;lt;ProvideDefaultName&amp;gt;true&amp;lt;/ProvideDefaultName&amp;gt; &lt;br/&gt;    &amp;lt;LocationField&amp;gt;Enabled&amp;lt;/LocationField&amp;gt; &lt;br/&gt;    &amp;lt;EnableLocationBrowseButton&amp;gt;true&lt;br/&gt;    &amp;lt;/EnableLocationBrowseButton&amp;gt; &lt;br/&gt;    &amp;lt;Icon&amp;gt;__TemplateIcon.png&amp;lt;/Icon&amp;gt; &lt;br/&gt;    &amp;lt;PreviewImage&amp;gt;__PreviewImage.jpg&amp;lt;/PreviewImage&amp;gt; &lt;br/&gt;  &amp;lt;/TemplateData&amp;gt; &lt;br/&gt;  &amp;lt;TemplateContent&amp;gt; &lt;br/&gt;    &amp;lt;Project TargetFileName="KryptonUILite.vbproj" &lt;br/&gt;        File="KryptonUILite.vbproj" &lt;br/&gt;        ReplaceParameters="true"&amp;gt; &lt;br/&gt;      &amp;lt;ProjectItem ReplaceParameters="true" &lt;br/&gt;        TargetFileName="App.config"&amp;gt;App.config&lt;br/&gt;      &amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;      &amp;lt;ProjectItem ReplaceParameters="true" &lt;br/&gt;        TargetFileName="Form1.vb"&amp;gt;Form1.vb&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;      &amp;lt;ProjectItem ReplaceParameters="true" &lt;br/&gt;        TargetFileName="Form1.Designer.vb"&amp;gt;&lt;br/&gt;        Form1.Designer.vb&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;      &amp;lt;ProjectItem ReplaceParameters="true" TargetFile&lt;br/&gt;        Name="Form1.resx"&amp;gt;Form1.resx&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;      &amp;lt;Folder Name="My Project" TargetFolderName=&lt;br/&gt;          "My Project"&amp;gt; &lt;br/&gt;        &amp;lt;ProjectItem ReplaceParameters=&lt;br/&gt;          "true" TargetFileName="Application.myapp"&amp;gt;&lt;br/&gt;          Application.myapp&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;        &amp;lt;ProjectItem ReplaceParameters="true" &lt;br/&gt;          TargetFileName="Application.Designer.vb"&amp;gt;&lt;br/&gt;          Application.Designer.vb&amp;lt;/ProjectItem&amp;gt;&lt;br/&gt;        &amp;lt;ProjectItem ReplaceParameters="true" &lt;br/&gt;          TargetFileName="AssemblyInfo.vb"&amp;gt;&lt;br/&gt;          AssemblyInfo.vb&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;        &amp;lt;ProjectItem ReplaceParameters="true" &lt;br/&gt;          TargetFileName="Resources.resx"&amp;gt;&lt;br/&gt;          Resources.resx&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;        &amp;lt;ProjectItem ReplaceParameters="true"&lt;br/&gt;          TargetFileName="Resources.Designer.vb"&amp;gt;&lt;br/&gt;          Resources.Designer.vb&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;        &amp;lt;ProjectItem ReplaceParameters="true" &lt;br/&gt;          TargetFileName="Settings.settings"&amp;gt;&lt;br/&gt;          Settings.settings&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;        &amp;lt;ProjectItem ReplaceParameters="true" &lt;br/&gt;          TargetFileName="Settings.Designer.vb"&amp;gt;&lt;br/&gt;          Settings.Designer.vb&amp;lt;/ProjectItem&amp;gt; &lt;br/&gt;      &amp;lt;/Folder&amp;gt; &lt;br/&gt;    &amp;lt;/Project&amp;gt; &lt;br/&gt;&amp;lt;/TemplateContent&amp;gt; &amp;lt;/VSTemplate&amp;gt;  
Listing 5: NuGet-Erweiterungen zu MyTemplate.vstemplate
&amp;lt;VSTemplate Version="3.0.0" xmlns=&lt;br/&gt;    "http://schemas.microsoft.com/developer/&lt;br/&gt;    vstemplate/2005" Type="Project"&amp;gt; &lt;br/&gt;  &amp;lt;TemplateData&amp;gt; &lt;br/&gt;  ... &lt;br/&gt;  &amp;lt;/TemplateData&amp;gt; &lt;br/&gt;  &amp;lt;TemplateContent&amp;gt; &lt;br/&gt;  ... &lt;br/&gt;  &amp;lt;/TemplateContent&amp;gt; &lt;br/&gt;  &amp;lt;WizardExtension&amp;gt; &lt;br/&gt;    &amp;lt;Assembly&amp;gt;NuGet.VisualStudio.Interop, &lt;br/&gt;      Version=1.0.0.0, Culture=neutral, &lt;br/&gt;      PublicKeyToken=b03f5f7f11d50a3a&amp;lt;/Assembly&amp;gt; &lt;br/&gt;    &amp;lt;FullClassName&amp;gt;NuGet.VisualStudio.TemplateWizard&lt;br/&gt;    &amp;lt;/FullClassName&amp;gt; &lt;br/&gt;  &amp;lt;/WizardExtension&amp;gt; &lt;br/&gt;  &amp;lt;WizardData&amp;gt; &lt;br/&gt;    &amp;lt;packages&amp;gt; &lt;br/&gt;      &amp;lt;packages repository="extension" repositoryId=&lt;br/&gt;          "VSIXKryptonUILite.f1619636-0934-401f-9acd-&lt;br/&gt;          0e9e0b466e3d"&amp;gt; &lt;br/&gt;        &amp;lt;!-- ... --&amp;gt; &lt;br/&gt;      &amp;lt;/packages&amp;gt; &lt;br/&gt;    &amp;lt;/packages&amp;gt; &lt;br/&gt;  &amp;lt;/WizardData&amp;gt; &lt;br/&gt;&amp;lt;/VSTemplate&amp;gt;  
Das bearbeitete Vorlagenarchiv steht nun in der erweiterten Fassung im Ordner C:\Users\Benutzername\Documents\Visual Studio 2019\My Exported Templates zur Anwahl bereit.Wechseln Sie nun erneut zur Bearbeitung des Projekts VSIXKryptonUILite. Doppelklicken Sie im Projektmappen-Explorer erneut auf das VSIX-Manifest source.extension.vsixmanifest, um in den Bearbeitungsmodus zu wechseln. Wählen Sie dann den Bereich Assets und dort die Schaltfläche New an. Selektieren Sie im folgenden Dialog den Typ Microsoft.VisualStudio.ProjectTemplate und dann die Quelle File on filesystem. Klicken Sie auf die Schaltfläche Browse, wählen Sie das bearbeitete ZIP-Vorlagenarchiv an und bestätigen Sie mit Öffnen. Daraufhin werden alle manuell und per Dia­log ausgewählte Assets zusammengestellt (Bild 14). Speichern Sie das Projekt mit Datei | Alles speichern und übersetzen Sie es mit Erstellen | Projektmappe neu erstellen. Wechseln Sie in das bin-Verzeichnis des Projekts, suchen Sie die generierte VSIX-Installationsdatei und installieren Sie diese mit einem Doppelklick, nachdem Sie die Visual-Studio-Entwicklungsumgebung beendet haben. Danach können Sie die Projektvorlage in Visual Studio einsetzen. Nach dem Laden der Vorlage wechseln Sie mit Extras | NuGet-Paket-Manager | NuGet-Pakete für Projektmappe verwalten zur Liste der Pakete. Wie Sie sehen, werden nun alle Pakete wie gewünscht automatisch geladen (Bild 15). Rufen Sie den Befehl Erstellen | Projektmappe neu erstellen auf, um die Verweise im Rahmen der Übersetzung (Build) herzustellen (Bild 16). An dieser Stelle können Sie das spezialisierte Krypton-Formular laden und bearbeiten.
Assetszum Erweiterungspaket VSIXKryptonUILite(Bild 14) © Autor
Nach der ersten Projektübersetzungwerden die NuGet-­Verweise automatisch ergänzt(Bild 16) © Autor
Die NuGet-Paketewerden nach den durchgeführten Arbeiten automatisch geladen(Bild 15) © Autor
Sollte das Laden nicht mit der automatischen Verweiserstellung einhergehen, prüfen Sie die NuGet-Einstellungen. Wählen Sie dazu den Menübefehl Extras| Optionen und dann in der Strukturansicht den Eintrag NuGet-Paket-Manager| Allgemein. Markieren Sie die Optionen NuGet das Herunterladen fehlender Pakete erlauben und Automatisch auf fehlende Pakete während des Builds in Visual Studio überprüfen. Wählen Sie als Standardformat für die Paketverwaltung den Eintrag PackageReference an und bestätigen Sie mit OK (Bild 17).
NuGet-Paketmanager:Optionen setzen(Bild 17) © Autor

Fazit

Vorlagen vereinfachen das Erstellen von Projekten. Einfache Steuerelemente und Namespaces von .NET lassen sich ebenso leicht anbinden wie benutzerdefinierte Steuerelemente oder Formulare. Problematischer wird die Anbindung bei Steuerelementen von Drittherstellern, insbesondere dann, wenn Sie Vorlagen auf mehreren Entwicklungsrechnern einsetzen und über VSIX-Installationspakete einrichten wollen. Dann sollten Sie auf gleiche Systemkonfigurationen achten und Fremd-DLLs über einheitliche Laufwerke und Ordner bereitstellen. Wenn Sie lediglich eine Vorlage für einen Entwicklungsrechner erstellen, sind keine Anpassungen an der Systemkonfiguration nötig.Die Anbindung von NuGet-Paketen, das automatische Laden und auch die automatische Verweisherstellung sind mit erheblichen Hürden versehen. Viele Arbeiten sind manuell durchzuführen, und ohne das Bearbeiten der Manifestdateien kommen Sie nicht zum Erfolg. Sie werden weder sinnvoll über einen Assistenten durch die Arbeitsschritte geleitet, noch gibt es integrierte Funktionen, die die Anbindung automatisieren. Zwar kommen Sie nach der erfolgreichen Vorlagenaufbereitung mit anschließender VSIX-Erweiterungspaketherstellung in den komfortablen Genuss neuer Anwendungstypen, der Weg dahin ist aber steinig und mit erheblichen Hindernissen versehen. Eine umfassende und verständliche Dokumenta­tion suchen Sie zudem vergeblich. Wünschenswert wäre, dass sich Microsoft dem Thema benutzerdefinierte Vorlagen intensiver widmet und einen verbesserten Assistenten für die universelle Vorlagenentwicklung bereitstellt.
Projektdateien herunterladen

Fussnoten

  1. Andreas Maslo, Auswählen statt tippen, dotnetpro 1/2022, Seite 8 ff., http://www.dotnetpro.de/A2201Konsole
  2. Gong Shell – Binärdateien und Quelltexte, http://www.dotnetpro.de/SL2201VSVorlagen1
  3. Gong Shell – Quelltexte, http://www.dotnetpro.de/SL2201VSVorlagen2
  4. Windows API Codepack 1.1 auf GitHub, http://www.dotnetpro.de/SL2201VSVorlagen3
  5. Windows API Codepack 1.1 – Binaries und Quelltexte, http://www.dotnetpro.de/SL2201VSVorlagen4
  6. Krypton-Toolkit auf GitHub, http://www.dotnetpro.de/SL2201VSVorlagen5

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

MAUI-Tools - Steuerelemente der Community
Nützliche Hilfen für besondere Aufgaben.
12 Minuten
14. Okt 2024
WPF/VB: Fenster auf dem richtigen Monitor starten - Tipp der Woche
Das Notebook steht links, der große Monitor rechts daneben. Die Anwendung soll auf dem großen Monitor starten – außer wenn der Anwender unterwegs arbeitet und kein zweiter Monitor angeschlossen ist.
2 Minuten
24. Mär 2022
Von .NET Core 3.0 zu .NET 5 - Microsoft Build
Aus .NET, .NET Core und Mono soll mit .NET 5 wieder eine gemeinsame Plattform für alle Anwendungen entstehen.
2 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige