Neue Projektgenerierung: Einblick in die Hintergründe, Teil 1
Haben Sie schon einmal darüber nachgedacht, wie Sie Ihren eigenen Projekttyp erstellen? Fragen Sie sich, was tatsächlich passiert, wenn Sie ein neues Projekt erstellen? Lassen Sie uns einen Blick unter die Haube werfen und sehen, was wirklich los ist.
Es gibt mehrere Aufgaben, die Visual Studio für Sie koordiniert:
Es zeigt eine Struktur aller verfügbaren Projekttypen an.
Sie zeigt eine Liste der Anwendungsvorlagen für jeden Projekttyp an und ermöglicht ihnen die Auswahl.
Es sammelt Projektinformationen für die Anwendung, z. B. Projektname und Pfad.
Sie übergibt diese Informationen an die Projektfabrik.
Es generiert Projektelemente und Ordner in der aktuellen Lösung.
Das Dialogfeld "Neues Projekt"
Alles beginnt, wenn Sie einen Projekttyp für ein neues Projekt auswählen. Beginnen wir mit dem Klicken auf "Neues Projekt " im Menü "Datei ". Das Dialogfeld "Neues Projekt " wird wie folgt angezeigt:
Das sehen wir uns etwas genauer an. Die Projekttypenstruktur listet die verschiedenen Projekttypen auf, die Sie erstellen können. Wenn Sie einen Projekttyp wie Visual C# Windows auswählen, wird eine Liste der Anwendungsvorlagen angezeigt, die Ihnen den Einstieg erleichtern. Installierte Visual Studio-Vorlagen werden von Visual Studio installiert und stehen jedem Benutzer Ihres Computers zur Verfügung. Neue Vorlagen, die Sie erstellen oder sammeln, können "Meine Vorlagen" hinzugefügt werden und sind nur für Sie verfügbar.
Wenn Sie eine Vorlage wie Windows-Anwendung auswählen, wird eine Beschreibung des Anwendungstyps im Dialogfeld angezeigt. In diesem Fall ein Projekt zum Erstellen einer Anwendung mit einer Windows-Benutzeroberfläche.
Unten im Dialogfeld "Neues Projekt " werden mehrere Steuerelemente angezeigt, die weitere Informationen sammeln. Die angezeigten Steuerelemente hängen vom Projekttyp ab, enthalten jedoch im Allgemeinen ein Textfeld "Projektname", ein Textfeld "Speicherort" und die zugehörige Schaltfläche "Durchsuchen" sowie ein Textfeld "Lösungsname" und ein zugehöriges Kontrollkästchen "Verzeichnis für Lösung erstellen".
Auffüllen des Dialogfelds "Neues Projekt"
Wo erhält das Dialogfeld "Neues Projekt " seine Informationen? Hier gibt es zwei Mechanismen, einer davon ist veraltet. Das Dialogfeld "Neues Projekt " kombiniert und zeigt die aus beiden Mechanismen abgerufenen Informationen an.
Die ältere (veraltete) Methode verwendet Systemregistrierungseinträge und VSDIR-Dateien. Dieser Mechanismus wird ausgeführt, wenn Visual Studio geöffnet wurde. Die neuere Methode verwendet VSTEMPLATE-Dateien. Dieser Mechanismus wird ausgeführt, wenn Visual Studio initialisiert wird, z. B. durch Ausführen
devenv /setup
oder
devenv /installvstemplates
Projekttypen
Die Position und die Namen der Project-Typenstammknoten , z . B. Visual C# und andere Sprachen, werden durch Systemregistrierungseinträge bestimmt. Die Organisation der untergeordneten Knoten, z. B. Datenbank und Smart Device, Spiegel die Hierarchie der Ordner, die die entsprechenden VSTEMPLATE-Dateien enthalten. Sehen wir uns zuerst die Stammknoten an.
Projekttypstammknoten
Wenn Visual Studio initialisiert wird, durchläuft es die Unterschlüssel des Systemregistrierungsschlüssels HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\NewProjectTemplates\TemplateDirs, um die Stammknoten der Project-Typenstruktur zu erstellen und zu benennen. Diese Informationen werden zur späteren Verwendung zwischengespeichert. Sehen Sie sich die TemplateDirs\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\/1-Taste an. Jeder Eintrag ist eine VSPackage-GUID. Der Name des Unterschlüssels (/1) wird ignoriert, aber sein Vorhandensein gibt an, dass es sich um einen Stammknoten vom Typ Project handelt. Ein Stammknoten kann wiederum mehrere Unterschlüssel aufweisen, die die Darstellung in der Projekttypenstruktur steuern. Sehen wir uns einige davon an.
(Standardwert)
Dies ist die Ressourcen-ID der lokalisierten Zeichenfolge, die den Stammknoten benennt. Die Zeichenfolgenressource befindet sich in der Satelliten-DLL, die von der VSPackage-GUID ausgewählt wird.
Im Beispiel ist die VSPackage-GUID
{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}
und die Ressourcen-ID (Standardwert) des Stammknotens (/1) ist #2345
Wenn Sie die GUID im Schlüssel "Pakete in der Nähe" nachschlagen und den SatelliteDll-Unterschlüssel untersuchen, finden Sie den Pfad der Assembly, die die Zeichenfolgenressource enthält:
<Visual Studio-Installationspfad>\VC#\VCSPackages\1033\csprojui.dll
Um dies zu überprüfen, öffnen Sie die Explorer, und ziehen Sie csprojui.dll in das Visual Studio-Verzeichnis.. Die Zeichenfolgentabelle zeigt, dass die Ressource #2345 den Untertitel Visual C# aufweist.
SortPriority
Dadurch wird die Position des Stammknotens in der Projekttypenstruktur bestimmt.
SortPriority REG_DWORD 0x00000014 (20)
Je niedriger die Anzahl der Priorität ist, desto höher ist die Position in der Struktur.
DeveloperActivity
Wenn dieser Unterschlüssel vorhanden ist, wird die Position des Stammknotens vom Dialogfeld "Entwicklertools" Einstellungen gesteuert. Ein auf ein Objekt angewendeter
DeveloperActivity REG_SZ VC#
gibt an, dass Visual C# ein Stammknoten ist, wenn Visual Studio für die Visual C++-Entwicklung festgelegt ist. Andernfalls ist dies ein untergeordneter Knoten mit anderen Sprachen.
Ordner
Wenn dieser Unterschlüssel vorhanden ist, wird der Stammknoten zu einem untergeordneten Knoten des angegebenen Ordners. Unter dem Schlüssel wird eine Liste der möglichen Ordner angezeigt.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\NewProjectTemplates\PseudoFolders
Der Eintrag "Datenbankprojekte" weist beispielsweise einen Ordnerschlüssel auf, der dem Eintrag "Andere Projekttypen" in "PseudoFolders" entspricht. In der Projekttypenstruktur ist "Datenbankprojekte" also ein untergeordneter Knoten von "Andere Projekttypen".
Untergeordnete Knoten des Projekttyps und VSTDIR-Dateien
Die Position der untergeordneten Knoten in der Project-Typenstruktur folgt der Hierarchie der Ordner in den ProjectTemplates-Ordnern. Bei Computervorlagen (visual Studio installierte Vorlagen) lautet der typische Speicherort \Programme\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\ und für Benutzervorlagen (Meine Vorlagen), der typische Speicherort lautet \My Documents\Visual Studio 14.0\Templates\ProjectTemplates\. Die Ordnerhierarchien aus diesen beiden Speicherorten werden zusammengeführt, um die Projekttypenstruktur zu erstellen.
Für Visual Studio mit C#-Entwicklereinstellungen sieht die Project-Typenstruktur ungefähr wie folgt aus:
Der entsprechende ProjectTemplates-Ordner sieht wie folgt aus:
Wenn das Dialogfeld "Neues Projekt " geöffnet wird, durchläuft Visual Studio den Ordner "ProjectTemplates" und erstellt seine Struktur in der Projekttypenstruktur mit einigen Änderungen neu:
Der Stammknoten in der Projekttypenstruktur wird von der Anwendungsvorlage bestimmt.
Der Knotenname kann lokalisiert werden und kann Sonderzeichen enthalten.
Die Sortierreihenfolge kann geändert werden.
Suchen des Stammknotens für einen Projekttyp
Wenn Visual Studio die ProjectTemplates-Ordner durchläuft, öffnet es alle ZIP-Dateien und extrahiert alle VSTEMPLATE-Dateien. Eine VSTEMPLATE-Datei verwendet XML, um eine Anwendungsvorlage zu beschreiben. Weitere Informationen finden Sie unter "Neue Projektgeneration: Unter der Haube, Teil 2".
Das <ProjectType-Tag> bestimmt den Projekttyp für die Anwendung. Beispielsweise enthält die Datei \CSharp\SmartDevice\WindowsCE\1033\WindowsCE-EmptyProject.zip eine EmptyProject.vstemplate-Datei mit diesem Tag:
<ProjectType>CSharp</ProjectType>
Das <ProjectType-Tag> und nicht der Unterordner im ProjectTemplates-Ordner bestimmt den Stammknoten einer Anwendung in der Project-Typenstruktur . Im Beispiel würden Windows CE-Anwendungen unter dem Visual C# -Stammknoten angezeigt, und selbst wenn Sie den WindowsCE-Ordner in den VisualBasic-Ordner verschieben würden, würden Windows CE-Anwendungen weiterhin unter dem Visual C# -Stammknoten angezeigt.
Lokalisieren des Knotennamens
Wenn Visual Studio die ProjectTemplates-Ordner durchläuft, werden alle gefundenen VSTDIR-Dateien untersucht. Eine VSTDIR-Datei ist eine XML-Datei, die die Darstellung des Projekttyps im Dialogfeld "Neues Projekt " steuert. Verwenden Sie in der VSTDIR-Datei das <LocalizedName-Tag> , um den Projekttypenknoten zu benennen.
Die Datei \CSharp\Database\TemplateIndex.vstdir enthält z. B. dieses Tag:
<LocalizedName Package="{462b036f-7349-4835-9e21-bec60e989b9c}" ID="4598"/>
Dadurch wird die Satelliten-DLL und die Ressourcen-ID der lokalisierten Zeichenfolge bestimmt, die den Stammknoten in diesem Fall Datenbank benennt. Der lokalisierte Name kann Sonderzeichen enthalten, die für Ordnernamen, z . B. .NET, nicht verfügbar sind.
Wenn kein <LocalizedName-Tag> vorhanden ist, wird der Projekttyp nach dem Ordner selbst benannt, Smart Telefon 2003.
Suchen der Sortierreihenfolge für einen Projekttyp
Um die Sortierreihenfolge des Projekttyps zu bestimmen, verwenden VSTDIR-Dateien das <SortOrder-Tag> .
Die Datei \CSharp\Windows\Windows.vstdir enthält z. B. dieses Tag:
<SortOrder>5</SortOrder>
Die Datei \CSharp\Database\TemplateIndex.vstdir weist ein Tag mit einem größeren Wert auf:
<SortOrder>5000</SortOrder>
Je niedriger die Zahl im <SortOrder-Tag> , je höher die Position in der Struktur, sodass der Windows-Knoten höher als der Datenbankknoten in der Projekttypenstruktur angezeigt wird.
Wenn kein <SortOrder-Tag> für einen Projekttyp angegeben ist, wird es in alphabetischer Reihenfolge nach allen Projekttypen angezeigt, die SortOrder-Spezifikationen> enthalten<.
Beachten Sie, dass keine VSTDIR-Dateien in den Ordnern "Eigene Dokumente" (Meine Vorlagen) vorhanden sind. Projekttypnamen der Benutzeranwendung werden nicht lokalisiert und in alphabetischer Reihenfolge angezeigt.
Eine Schnellüberprüfung
Lassen Sie uns das Dialogfeld "Neues Projekt " ändern und eine neue Benutzerprojektvorlage erstellen.
Fügen Sie dem Ordner "\Programme\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp" einen Unterordner "MyProjectNode" hinzu.
Erstellen Sie eine MyProject.vstdir-Datei im Ordner "MyProjectNode" mit einem beliebigen Text-Editor.
Fügen Sie die folgenden Zeilen zur VSTDIR-Datei hinzu:
<TemplateDir Version="1.0.0"> <SortOrder>6</SortOrder> </TemplateDir>
Speichern und schließen Sie die VSTDIR-Datei.
Erstellen Sie eine MyProject.vstemplate-Datei im Ordner "MyProjectNode" mit einem beliebigen Text-Editor.
Fügen Sie der VSTEMPLATE-Datei die folgenden Zeilen hinzu:
<VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"> <TemplateData> <ProjectType>CSharp</ProjectType> </TemplateData> </VSTemplate>
Speichern Sie die Vstemplate-Datei, und schließen Sie den Editor.
Senden Sie die VSTEMPLATE-Datei an einen neuen komprimierten Ordner "MyProjectNode\MyProject.zip".
Geben Sie im Visual Studio-Befehlsfenster Folgendes ein:
devenv /installvstemplates
Öffnen Sie Visual Studio.
Öffnen Sie das Dialogfeld "Neues Projekt ", und erweitern Sie den Visual C# -Projektknoten.
MyProjectNode wird direkt unter dem Windows-Knoten als untergeordneter Knoten von Visual C# angezeigt.