Generazione di un nuovo progetto: dietro le quinte, parte 2

In Nuova generazione di progetti: nella parte 1 è stato illustrato come viene popolata la finestra di dialogo Nuovo progetto . Si supponga di aver selezionato un'applicazione Windows Visual C#, di compilare le caselle di testo Nome e Posizione e fare clic su OK.

Generazione dei file di soluzione

La scelta di un modello di applicazione indirizza Visual Studio a decomprimere e aprire il file con estensione vstemplate corrispondente e avviare un modello per interpretare i comandi XML in questo file. Questi comandi creano progetti ed elementi di progetto nella soluzione nuova o esistente.

Il modello decomprime i file di origine, denominati modelli di elemento, dalla stessa cartella zip che contiene il file con estensione vstemplate. Il modello copia questi file nel nuovo progetto, personalizzandoli di conseguenza.

Sostituzione dei parametri del modello

Quando il modello copia un modello di elemento in un nuovo progetto, sostituisce tutti i parametri del modello con stringhe per personalizzare il file. Un parametro di modello è un token speciale preceduto e seguito da un segno di dollaro, ad esempio $date$.

Si esaminerà ora un modello di elemento di progetto tipico. Estrarre ed esaminare Program.cs nella cartella Programmi\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
    }
}

Se si crea un nuovo progetto di applicazione Windows denominato Simple, il modello sostituisce il $safeprojectname$ parametro con il nome del progetto.

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

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

Per un elenco completo dei parametri dei modelli, vedere Parametri di modelli.

Oggetto Look Inside a . VSTemplate File

Un file con estensione vstemplate di base ha questo formato

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

È stata esaminata la <sezione TemplateData> nella nuova generazione di progetti: Sotto il cofano, parte 1. I tag in questa sezione vengono usati per controllare l'aspetto della finestra di dialogo Nuovo progetto .

I tag nella <sezione TemplateContent> controllano la generazione di nuovi progetti ed elementi di progetto. Ecco la <sezione TemplateContent> del file cswindowsapplication.vstemplate nella cartella \Programmi\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>

Il <tag Project> controlla la generazione di un progetto e il <tag ProjectItem> controlla la generazione di un elemento di progetto. Se il parametro ReplaceParameters è true, il modello personalizza tutti i parametri del modello nel file di progetto o nell'elemento. In questo caso, tutti gli elementi del progetto vengono personalizzati, ad eccezione di Impostazioni.settings.

Il parametro TargetFileName specifica il nome e il percorso relativo del file o dell'elemento di progetto risultante. In questo modo è possibile creare una struttura di cartelle per il progetto. Se non si specifica questo argomento, l'elemento del progetto avrà lo stesso nome del modello di elemento di progetto.

La struttura di cartelle dell'applicazione Windows risultante è simile alla seguente:

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

Il primo e l'unico <tag Project> nel modello leggono:

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

In questo modo viene indicato al modello Nuovo progetto di creare il file di progetto Simple.csproj copiando e personalizzando l'elemento modello windowsapplication.csproj.

Finestre di progettazione e riferimenti

Nella Esplora soluzioni è possibile vedere che la cartella Proprietà è presente e contiene i file previsti. Ma cosa accade sui riferimenti al progetto e sulle dipendenze dei file di progettazione, ad esempio Resources.Designer.cs a Resources.resx e Form1.Designer.cs in Form1.cs? Questi vengono configurati nel file Simple.csproj quando viene generato.

Di seguito è riportato ItemGroup <> da Simple.csproj che crea i riferimenti al progetto:

<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>

È possibile notare che si tratta dei sei riferimenti al progetto visualizzati nella Esplora soluzioni. Ecco una sezione di un altro <ItemGroup>. Molte righe di codice sono state eliminate per maggiore chiarezza. In questa sezione vengono Impostazioni. Designer.cs dipendente da Impostazioni.settings:

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