新しいプロジェクトの生成: 内部、パート 2
「新しいプロジェクトの生成: 内部的な処理、パート 1」では、[新しいプロジェクト] ダイアログボックスの設定方法について考慮しました。 Visual C# Windows アプリケーションを選択し、[名前] および [場所] テキストボックスに入力して、[OK] をクリックしたという前提で話を進めます。
ソリューション ファイルの生成
アプリケーション テンプレートを選択すると、対応する .vstemplate ファイルを解凍して開き、このファイル内の XML コマンドを解釈するためのテンプレートを起動するように Visual Studio に指示が出されます。 これらのコマンドによって、新規または既存のソリューションにプロジェクトとプロジェクト項目が作成されます。
このテンプレートは、.vstemplate ファイルを保持する同じ .zip フォルダーから、項目テンプレートと呼ばれるソース ファイルをアンパックします。 テンプレートは、これらのファイルを新しいプロジェクトにコピーし、適宜カスタマイズします。
テンプレート パラメーターの置換
テンプレートによって項目テンプレートが新しいプロジェクトにコピーされると、テンプレート パラメーターが、ファイルをカスタマイズする文字列に置き換えられます。 テンプレート パラメーターは、ドル記号が前後に挿入された (例: $date $) 特殊なトークンです。
一般的なプロジェクト項目テンプレートを見てみましょう。 Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WindowsApplication.zip フォルダーにある Program.cs を抽出して調べてみます。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace $safeprojectname$
{
static class Program
{
// source code deleted here for brevity
}
}
Simple という名前の新しい Windows アプリケーション プロジェクトを作成した場合、テンプレートは $safeprojectname$
パラメーターをプロジェクトの名前に置き換えます。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Simple
{
static class Program
{
// source code deleted here for brevity
}
}
テンプレート パラメーターの完全な一覧については、「テンプレート パラメーター」をご覧ください。
.Vstemplate ファイルの内容
ベーシックな .vstemplate ファイルの形式は次のようになります。
<VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
</TemplateData>
<TemplateContent>
</TemplateContent>
</VSTemplate>
「新しいプロジェクトの生成: 内部的な処理、パート 1」では <TemplateData> セクションに注目しました。 このセクションのタグは、[新しいプロジェクト] ダイアログ ボックスの外観を制御するために使用されます。
<TemplateContent> セクションのタグは、新しいプロジェクトとプロジェクト項目の生成を制御します。 次に示すのは、\Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WindowsApplication.zip フォルダーにある cswindowsapplication.vstemplate ファイルの <TemplateContent> セクションです。
<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>
<Project> タグはプロジェクトの生成を制御し、<ProjectItem> タグはプロジェクト項目の生成を制御します。 パラメーター ReplaceParameters が true の場合、テンプレートはプロジェクト ファイルまたは項目内のすべてのテンプレート パラメーターをカスタマイズします。 この場合、Settings.settings 以外のすべてのプロジェクト項目がカスタマイズされます。
TargetFileName パラメーターは、結果として得られるプロジェクト ファイルまたは項目の名前と相対パスを指定します。 これにより、プロジェクトのフォルダー構造を作成できます。 この引数を指定しない場合、プロジェクト項目の名前はプロジェクト項目テンプレートと同じになります。
生成される Windows アプリケーションのフォルダー構造は次のようになります。
テンプレートの最初の <Project> タグのみが読み取られます。
<Project File="WindowsApplication.csproj" ReplaceParameters="true">
これにより、新しいプロジェクト テンプレートは、テンプレート項目 windowsapplication.csproj をコピーおよびカスタマイズすることによって、単純な Simple.csproj プロジェクト ファイルを作成するように指示します。
デザイナーと参照
ソリューション エクスプローラーに、Properties フォルダーが存在し、期待されるファイルが含まれていることを確認できます。 しかし、プロジェクト参照とデザイナー ファイルの依存関係 (たとえば、Resources.Designer.cs から Resources.resx や Form1.Designer.cs から Form1.cs) についてはどうでしょうか。 これらは、Simple.csproj ファイルの生成時に設定されます。
プロジェクト参照を作成する Simple.csproj の <ItemGroup> を次に示します。
<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>
ソリューション エクスプローラーに表示される 6 つのプロジェクト参照があることがわかります。 以下に、別の <ItemGroup> のセクションを示します。 わかりやすくするために、多くのコードの行が削除されています。 このセクションでは、Settings.settings に依存する Settings.Designer.cs を作成します。
<ItemGroup>
<Compile Include="Properties\Settings.Designer.cs">
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>