Neue Projektgenerierung: Einblick in die Hintergründe, Teil 2

In der neuen Projektgeneration: Teil 1 haben wir gesehen, wie das Dialogfeld "Neues Projekt " aufgefüllt wird. Angenommen, Sie haben eine Visual C#-Windows-Anwendung ausgewählt, die Textfelder "Name " und "Speicherort " ausgefüllt und auf "OK" geklickt.

Generieren der Lösungsdateien

Wenn Sie eine Anwendungsvorlage auswählen, wird Visual Studio aufgefordert, die entsprechende VSTEMPLATE-Datei zu entzippen und zu öffnen und eine Vorlage zu starten, um die XML-Befehle in dieser Datei zu interpretieren. Mit diesen Befehlen werden Projekte und Projektelemente in der neuen oder vorhandenen Projektmappe erstellt.

Die Vorlage entpackt Quelldateien, die als Elementvorlagen bezeichnet werden, aus demselben ZIP-Ordner, der die VSTEMPLATE-Datei enthält. Die Vorlage kopiert diese Dateien in das neue Projekt und passen sie entsprechend an.

Vorlagenparameterersetzung

Wenn die Vorlage eine Elementvorlage in ein neues Projekt kopiert, ersetzt sie alle Vorlagenparameter durch Zeichenfolgen, um die Datei anzupassen. Ein Vorlagenparameter ist ein spezielles Token, dem ein Dollarzeichen vorangestellt und gefolgt wird, z. B. $date$.

Sehen wir uns eine typische Projektelementvorlage an. Extrahieren und untersuchen Sie "Program.cs" im Ordner "Programme\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WindowsApplication.zip".

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace $safeprojectname$
{
    static class Program
    {
        // source code deleted here for brevity
    }
}

Wenn Sie ein neues Windows-Anwendungsprojekt namens "Simple" erstellen, ersetzt die Vorlage den $safeprojectname$ Parameter durch den Namen des Projekts.

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Simple
{
    static class Program
    {
        // source code deleted here for brevity
    }
}

Eine vollständige Liste der Vorlagenparameter finden Sie unter Vorlagenparameter.

Ein Blick in ein . VSTemplate-Datei

Eine einfache VSTEMPLATE-Datei weist dieses Format auf

<VSTemplate Version="2.0.0"     xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"     Type="Project">
    <TemplateData>
    </TemplateData>
    <TemplateContent>
    </TemplateContent>
</VSTemplate>

Wir haben uns den <TemplateData-Abschnitt> in der neuen Projektgeneration angesehen: Under the Hood, Teil 1. Die Tags in diesem Abschnitt werden verwendet, um die Darstellung des Dialogfelds "Neues Projekt " zu steuern.

Die Tags im <TemplateContent-Abschnitt> steuern die Generierung neuer Projekte und Projektelemente. Dies ist der <Abschnitt "TemplateContent> " aus der Datei "cswindowsapplication.vstemplate" im Ordner "\Programme\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WindowsApplication.zip".

<TemplateContent>
  <Project File="WindowsApplication.csproj" ReplaceParameters="true">
    <ProjectItem ReplaceParameters="true"
      TargetFileName="Properties\AssemblyInfo.cs">
      AssemblyInfo.cs
    </ProjectItem>
    <ProjectItem TargetFileName="Properties\Resources.resx">
      Resources.resx
    </ProjectItem>
    <ProjectItem ReplaceParameters="true"       TargetFileName="Properties\Resources.Designer.cs">
      Resources.Designer.cs
    </ProjectItem>
    <ProjectItem TargetFileName="Properties\Settings.settings">
      Settings.settings
    </ProjectItem>
    <ProjectItem ReplaceParameters="true"       TargetFileName="Properties\Settings.Designer.cs">
      Settings.Designer.cs
    </ProjectItem>
    <ProjectItem ReplaceParameters="true" OpenInEditor="true">
      Form1.cs
    </ProjectItem>
    <ProjectItem ReplaceParameters="true">
      Form1.Designer.cs
    </ProjectItem>
    <ProjectItem ReplaceParameters="true">
      Program.cs
    </ProjectItem>
  </Project>
</TemplateContent>

Das <Project-Tag> steuert die Generierung eines Projekts, und das <ProjectItem-Tag> steuert die Generierung eines Projektelements. Wenn der Parameter ReplaceParameters true ist, passt die Vorlage alle Vorlagenparameter in der Projektdatei oder dem Projektelement an. In diesem Fall werden alle Projektelemente angepasst, mit Ausnahme von Einstellungen.settings.

Der Parameter TargetFileName gibt den Namen und den relativen Pfad der resultierenden Projektdatei oder des resultierenden Elements an. Auf diese Weise können Sie eine Ordnerstruktur für Ihr Projekt erstellen. Wenn Sie dieses Argument nicht angeben, hat das Projektelement denselben Namen wie die Projektelementvorlage.

Die resultierende Struktur des Windows-Anwendungsordners sieht wie folgt aus:

Screenshot of the Windows application folder structure for the 'Simple' Solution in the Visual Studio Solution Explorer.

Das erste und einzige <Project-Tag> in der Vorlage liest Folgendes:

<Project File="WindowsApplication.csproj" ReplaceParameters="true">

Dadurch wird die Vorlage "Neues Projekt" angewiesen, die Projektdatei "Simple.csproj" zu erstellen, indem das Vorlagenelement "windowsapplication.csproj" kopiert und angepasst wird.

Designer und Referenzen

Sie können in der Projektmappen-Explorer sehen, dass der Ordner "Eigenschaften" vorhanden ist und die erwarteten Dateien enthält. Aber was ist mit Projektverweise und Designerdateiabhängigkeiten, z. B. "Resources.Designer.cs" zu "Resources.resx" und "Form1.Designer.cs" zu "Form1.cs"? Diese sind in der Datei "Simple.csproj" eingerichtet, wenn sie generiert wird.

Dies ist die <ItemGroup> von Simple.csproj, die die Projektverweise erstellt:

<ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Deployment" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
</ItemGroup>

Sie können sehen, dass es sich hierbei um die sechs Projektverweise handelt, die im Projektmappen-Explorer angezeigt werden. Hier ist ein Abschnitt aus einer anderen <ItemGroup>. Viele Codezeilen wurden aus Gründen der Übersichtlichkeit gelöscht. In diesem Abschnitt wird Einstellungen. Designer.cs abhängig von Einstellungen.settings:

<ItemGroup>
    <Compile Include="Properties\Settings.Designer.cs">
        <DependentUpon>Settings.settings</DependentUpon>
    </Compile>
</ItemGroup>