Generación de nuevos proyectos: Aspectos técnicos (parte 2)

En Nueva generación de proyectos: bajo el capó, parte Uno vimos cómo se rellena el cuadro de diálogo Nuevo proyecto . Supongamos que ha seleccionado una aplicación windows de Visual C#, ha rellenado los cuadros de texto Nombre y ubicación y ha hecho clic en Aceptar.

Generación de los archivos de solución

Al elegir una plantilla de aplicación se dirige Visual Studio para descomprimir y abrir el archivo .vstemplate correspondiente y para iniciar una plantilla para interpretar los comandos XML de este archivo. Estos comandos crean proyectos y elementos de proyecto en la solución nueva o existente.

La plantilla desempaqueta los archivos de origen, denominados plantillas de elemento, de la misma carpeta .zip que contiene el archivo .vstemplate. La plantilla copia estos archivos en el nuevo proyecto, personalizándolos en consecuencia.

Reemplazo de parámetros de plantilla

Cuando la plantilla copia una plantilla de elemento en un nuevo proyecto, reemplaza los parámetros de plantilla por cadenas para personalizar el archivo. Un parámetro de plantilla es un token especial precedido y seguido de un signo de dólar, por ejemplo, $date$.

Echemos un vistazo a una plantilla de elemento de proyecto típica. Extraiga y examine Program.cs en la carpeta Archivos de programa\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
    }
}

Si crea un nuevo proyecto de aplicación de Windows denominado Simple, la plantilla reemplaza el $safeprojectname$ parámetro por el nombre del proyecto.

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

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

Para obtener una lista completa de parámetros de plantilla, vea Parámetros de plantilla.

Un elemento Look Inside a . Archivo VSTemplate

Un archivo .vstemplate básico tiene este formato

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

Hemos examinado la <sección TemplateData> en la nueva generación de proyectos: Under the Hood, Part One. Las etiquetas de esta sección se usan para controlar la apariencia del cuadro de diálogo Nuevo proyecto .

Las etiquetas de la <sección TemplateContent> controlan la generación de nuevos proyectos y elementos de proyecto. Esta es la <sección TemplateContent> del archivo cswindowsapplication.vstemplate en la carpeta \Archivos de programa\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>

La <etiqueta Project> controla la generación de un proyecto y la <etiqueta ProjectItem> controla la generación de un elemento de proyecto. Si el parámetro ReplaceParameters es true, la plantilla personalizará todos los parámetros de plantilla en el archivo o elemento del proyecto. En este caso, todos los elementos del proyecto se personalizan, excepto Configuración.settings.

El parámetro TargetFileName especifica el nombre y la ruta de acceso relativa del archivo o elemento del proyecto resultante. Esto le permite crear una estructura de carpetas para el proyecto. Si no especifica este argumento, el elemento de proyecto tendrá el mismo nombre que la plantilla de elemento de proyecto.

La estructura de carpetas de aplicaciones de Windows resultante tiene el siguiente aspecto:

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

La primera y única <etiqueta project> de la plantilla lee:

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

Esto indica a la plantilla Nuevo proyecto que cree el archivo de proyecto Simple.csproj copiando y personalizando el elemento de plantilla windowsapplication.csproj.

Diseñadores y referencias

Puede ver en la Explorador de soluciones que la carpeta Properties está presente y contiene los archivos esperados. Pero, ¿qué ocurre con las referencias de proyecto y las dependencias de archivos del diseñador, como Resources.Designer.cs a Resources.resx y Form1.Designer.cs a Form1.cs? Se configuran en el archivo Simple.csproj cuando se genera.

Este es el <ItemGroup> de Simple.csproj que crea las referencias del proyecto:

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

Puede ver que se trata de las seis referencias de proyecto que aparecen en el Explorador de soluciones. Esta es una sección de otro <ItemGroup>. Se han eliminado muchas líneas de código para mayor claridad. En esta sección se hace Configuración. Designer.cs depende de Configuración.settings:

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