次の方法で共有


基本的なプロジェクト システムを作成する(パート 2)

このシリーズの最初のチュートリアル「 基本的なプロジェクト システムの作成(パート 1)」では、基本的なプロジェクト システムを作成する方法を示します。 このチュートリアルは、Visual Studio テンプレート、プロパティ ページ、およびその他の機能を追加することで、基本的なプロジェクト システムに基づいています。 このチュートリアルを開始する前に、最初のチュートリアルを完了する必要があります。

このチュートリアルでは、プロジェクト ファイル名拡張子 が .myproj であるプロジェクトの種類を作成する方法について説明します。 チュートリアルを完了するには、既存の Visual C# プロジェクト システムを借用するため、独自の言語を作成する必要はありません。

このチュートリアルでは、次のタスクを実行する方法について説明します。

  • Visual Studio テンプレートを作成します。

  • Visual Studio テンプレートをデプロイします。

  • [ 新しい プロジェクト] ダイアログ ボックスでプロジェクトの種類の子ノードを作成します。

  • Visual Studio テンプレートでパラメーターの置換を有効にします。

  • プロジェクト のプロパティ ページを作成します。

このチュートリアルの手順は、C# プロジェクトに基づいています。 ただし、ファイル名拡張子やコードなどの詳細を除き、Visual Basic プロジェクトでも同じ手順を使用できます。

Visual Studio テンプレートを作成する

基本的なプロジェクト テンプレートの代わりに Visual Studio テンプレート (.vstemplate ファイル) を使用すると、[ 新しいプロジェクト ] ダイアログ ボックスでのテンプレートの表示方法と、テンプレート パラメーターの置き換え方法を制御できます。 .vstemplate ファイルは、プロジェクト システム テンプレートを使用してプロジェクトを作成するときにソース ファイルを含める方法を記述する XML ファイルです。 プロジェクト システム自体は 、.vstemplate ファイルとソース ファイルを .zip ファイルに収集してビルドし、visual Studio で認識されている場所に .zip ファイルをコピーして配置します。 このプロセスについては、このチュートリアルの後半で詳しく説明します。

  1. Visual Studio で、「 基本的なプロジェクト システムの作成(パート 1)」に従って作成した SimpleProject ソリューションを開きます。

  2. SimpleProjectPackage.cs ファイルで、ProvideProjectFactory 属性を見つけます。 次のように、2 番目のパラメーター (プロジェクト名) を null に、4 番目のパラメーター (プロジェクト テンプレート フォルダーへのパス) を ".\\NullPath" に置き換えます。

    [ProvideProjectFactory(typeof(SimpleProjectFactory), null,
        "Simple Project Files (*.myproj);*.myproj", "myproj", "myproj",
        ".\\NullPath",
    LanguageVsTemplate = "SimpleProject")]
    
  3. SimpleProject.vstemplate という名前の XML ファイルを \Templates\Projects\SimpleProject\ フォルダーに追加します。

  4. SimpleProject.vstemplate の内容を次のコードに置き換えます。

    <VSTemplate Version="2.0.0" Type="Project"
        xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
      <TemplateData>
        <Name>SimpleProject Application</Name>
        <Description>
          A project for creating a SimpleProject application
        </Description>
        <Icon>SimpleProject.ico</Icon>
        <ProjectType>SimpleProject</ProjectType>
      </TemplateData>
      <TemplateContent>
        <Project File="SimpleProject.myproj" ReplaceParameters="true">
          <ProjectItem ReplaceParameters="true" OpenInEditor="true">
            Program.cs
          </ProjectItem>
          <ProjectItem ReplaceParameters="true" OpenInEditor="false">
            AssemblyInfo.cs
          </ProjectItem>
        </Project>
      </TemplateContent>
    </VSTemplate>
    
  5. [ プロパティ ] ウィンドウで、 \Templates\Projects\SimpleProject\ フォルダー内の 5 つのファイルをすべて選択し、 ビルド アクションZipProject に設定します。

    Simple Project Folder

    <TemplateData> セクションでは、次のように、[新しいプロジェクト] ダイアログ ボックスの SimpleProject プロジェクトの種類の場所と外観を決定します。

  • <Name> 要素は、プロジェクト テンプレートに SimpleProject Application という名前を付けます。

  • <Description> 要素には、プロジェクト テンプレートが選択されたときに [新しいプロジェクト] ダイアログ ボックスに表示される説明が含まれています。

  • <Icon> 要素は、SimpleProject プロジェクトの種類と共に表示されるアイコンを指定します。

  • <ProjectType> 要素は、[新しいプロジェクト] ダイアログ ボックスでプロジェクトの種類に名前を付けます。 この名前は、ProvideProjectFactory 属性のプロジェクト名パラメーターに置き換えられます。

    <ProjectType> 要素は、SimpleProjectPackage.cs ファイル内のLanguageVsTemplate属性のProvideProjectFactory引数と一致する必要があります。

    <TemplateContent> セクションでは、新しいプロジェクトの作成時に生成されるこれらのファイルについて説明します。

  • SimpleProject.myproj

  • Program.cs

  • AssemblyInfo.cs

    3 つのファイルはすべて ReplaceParameters true に設定されており、パラメーターの置換を有効にします。 Program.cs ファイルOpenInEditor true に設定されているため、プロジェクトの作成時にコード エディターでファイルが開かれます。

    Visual Studio テンプレート スキーマの要素の詳細については、 Visual Studio テンプレート スキーマ リファレンスを参照してください

プロジェクトに複数の Visual Studio テンプレートがある場合、すべてのテンプレートは別のフォルダーに格納されます。 そのフォルダー内のすべてのファイルには、 ビルド アクションZipProject に設定されている必要があります。

最小限の .vsct ファイルの追加

新しい Visual Studio テンプレートまたは変更された Visual Studio テンプレートを認識するには、Visual Studio をセットアップ モードで実行する必要があります。 セットアップ モードでは、 .vsct ファイルが存在する必要があります。 そのため、最小限の .vsct ファイルをプロジェクトに追加する必要があります。

  1. SimpleProject.vsct という名前の XML ファイルを SimpleProject プロジェクトに追加します。

  2. SimpleProject.vsct ファイルの内容を次のコードに置き換えます。

    <?xml version="1.0" encoding="utf-8" ?>
    <CommandTable
      xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable">
    </CommandTable>
    
  3. このファイルの ビルド アクションVSCTCompile に設定します。 これは、[プロパティ] ウィンドウではなく、.csproj ファイルでのみ実行できます。 この時点で、このファイルの ビルド アクション[なし] に設定されていることを確認します。

    1. SimpleProject ノードを右クリックし、[ SimpleProject.csproj の編集] を選択します。

    2. .csproj ファイルで、SimpleProject.vsct 項目を見つけます。

      <None Include="SimpleProject.vsct" />
      
    3. ビルド アクションを VSCTCompile に変更します。

      <VSCTCompile Include="SimpleProject.vsct" />
      
    4. プロジェクト ファイルを開き、エディターを閉じます。

    5. SimpleProject ノードを保存し、 ソリューション エクスプローラー で [プロジェクトの 再読み込み] を選択します。

Visual Studio テンプレートのビルド手順を確認する

VSPackage プロジェクト ビルド システムは、通常、 .vstemplate ファイルが変更されたとき、または .vstemplate ファイルを含むプロジェクトが再構築されたときに、セットアップ モードで Visual Studio を実行します。 MSBuild の詳細レベルを「通常」(Normal) 以上に設定することで、手順を追って確認することができます。

  1. [ツール>オプション] ウィンドウで、[>プロジェクトとソリューション>Build と実行] セクションを展開します。

  2. MSBuild プロジェクトのビルド出力の詳細オプション[標準] に設定します。

  1. [ ツール>オプション ] ダイアログで、[ プロジェクトとソリューション>Build と実行 ] セクションを展開します。

  2. MSBuild プロジェクトのビルド出力の詳細オプション[標準] に設定し、[OK] を選択します

  1. SimpleProject プロジェクトをリビルドします。

.zip プロジェクト ファイルを作成するビルド 手順は、次の例のようになります。

ZipProjects:
1>  Zipping ProjectTemplates
1>  Zipping <path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip...
1>  Copying file from "<path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip" to "<%LOCALAPPDATA%>\Microsoft\VisualStudio\14.0Exp\ProjectTemplates\\\\SimpleProject.zip".
1>  Copying file from "<path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip" to "bin\Debug\\ProjectTemplates\\\\SimpleProject.zip".
1>  SimpleProject -> <path>\SimpleProject\SimpleProject\bin\Debug\ProjectTemplates\SimpleProject.zip
1>ZipItems:
1>  Zipping ItemTemplates
1>  SimpleProject ->

Visual Studio テンプレートをデプロイする

Visual Studio テンプレートにはパス情報が含まれません。 そのため、テンプレート .zip ファイルは、Visual Studio で認識されている場所に配置する必要があります。 ProjectTemplates フォルダーの場所は通常、<%LOCALAPPDATA%>\Microsoft\VisualStudio\14.0Exp\ProjectTemplates です

プロジェクト ファクトリを配置するには、インストール プログラムに管理者特権が必要です。 Visual Studio インストール ノード ...\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates の下にテンプレートがデプロイされます。

Visual Studio テンプレートをテストする

プロジェクト ファクトリをテストし、Visual Studio テンプレートを使用してプロジェクト階層を作成するかどうかを確認します。

  1. Visual Studio SDK の実験用インスタンスをリセットします。

    Windows 7 の場合: [スタート ] メニューで、 Microsoft Visual Studio/Microsoft Visual Studio SDK/Tools フォルダーを見つけて、[ Microsoft Visual Studio Experimental インスタンスのリセット] を選択します。

    新しいバージョンの Windows の場合: スタート 画面で、「 Microsoft Visual Studio <version> Experimental Instance をリセットする」と入力します。

  2. コマンド プロンプト ウィンドウが表示されます。 [任意のキーを 押して続行する] という単語が表示されたら、 Enter キーを押します。 ウィンドウが閉じた後、Visual Studio を開きます。

  3. SimpleProject プロジェクトをリビルドし、デバッグを開始します。 実験用インスタンスが表示されます。

  4. 実験用インスタンスで、SimpleProject プロジェクトを作成します。 [ 新しいプロジェクト ] ダイアログ ボックスで、[ SimpleProject] を選択します。

  5. SimpleProject の新しいインスタンスが表示されます。

    Simple Project New Instance

    My Project New Instance

プロジェクトの種類の子ノードを作成する

[ 新しい プロジェクト] ダイアログ ボックスで、プロジェクトの種類のノードに子ノードを追加できます。 たとえば、SimpleProject プロジェクトの種類では、コンソール アプリケーション、ウィンドウ アプリケーション、Web アプリケーションなどの子ノードを持つことができます。

子ノードは、プロジェクト ファイルを変更し、 <OutputSubPath> 子を <ZipProject> 要素に追加することによって作成されます。 ビルドまたはデプロイ中にテンプレートがコピーされると、すべての子ノードがプロジェクト テンプレート フォルダーのサブフォルダーになります。

このセクションでは、SimpleProject プロジェクトの種類のコンソール子ノードを作成する方法について説明します。

  1. \Templates\Projects\SimpleProject\ フォルダーの名前を \Templates\Projects\ConsoleApp\ に変更します。

  2. [ プロパティ ] ウィンドウで、 \Templates\Projects\ConsoleApp\ フォルダー内の 5 つのファイルをすべて選択し、 ビルド アクションZipProject に設定されていることを確認します。

  3. SimpleProject.vstemplate ファイルで、終了タグの直前の <TemplateData> セクションの末尾に次の行を追加します。

    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
    

    これにより、コンソール アプリケーション テンプレートは、コンソールの子ノードと、子ノードの 1 つ上のレベルにある SimpleProject 親ノードの両方に表示されます。

  4. SimpleProject.vstemplate ファイルを保存します。

  5. .csproj ファイルで、各 ZipProject 要素に <OutputSubPath> を追加します。 前と同様にプロジェクトをアンロードし、プロジェクト ファイルを編集します。

  6. <ZipProject>要素を見つけます。 各 <ZipProject> 要素に、 <OutputSubPath> 要素を追加し、Console という値を指定します。 The ZipProject

    <ZipProject Include="Templates\Projects\ConsoleApp\AssemblyInfo.cs">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    <ZipProject Include="Templates\Projects\ConsoleApp\Program.cs">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.myproj">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.vstemplate">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.ico">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    
  7. 次の <PropertyGroup> をプロジェクト ファイルに追加します。

    <PropertyGroup>
      <VsTemplateLanguage>SimpleProject</VsTemplateLanguage>
    </PropertyGroup>
    
  8. プロジェクト ファイルを保存し、プロジェクトを再読み込みします。

プロジェクトの種類の子ノードをテストする

変更したプロジェクト ファイルをテストして、[新しいプロジェクト] ダイアログ ボックスにコンソールの子ノードが表示されるかどうかを確認します。

  1. Microsoft Visual Studio Experimental Instance ツールをリセットするを実行します。

  2. SimpleProject プロジェクトをリビルドし、デバッグを開始します。 実験用インスタンスが表示されます

  3. [ 新しいプロジェクト ] ダイアログで、[ SimpleProject ] ノードを選択します。 コンソール アプリケーション テンプレートが [テンプレート] ウィンドウに表示されます。

  4. SimpleProject ノードを展開します。 コンソールの子ノードが表示されます。 SimpleProject アプリケーション テンプレートは、[テンプレート] ウィンドウに引き続き表示されます。

  5. [ キャンセル] を 選択し、デバッグを停止します。

    Simple Project Rollup

    単純プロジェクトコンソールノード

プロジェクト テンプレートのパラメーターを置き換える

  • 基本的なプロジェクト システムを作成するパート 1 では、 基本的な種類のテンプレート パラメーターの置換を行うために ProjectNode.AddFileFromTemplate メソッドを上書きする方法を示しました。 このセクションでは、より高度な Visual Studio テンプレート パラメーターを使用する方法について説明します。

[新しいプロジェクト] ダイアログ ボックスで Visual Studio テンプレートを使用してプロジェクトを作成すると、プロジェクトをカスタマイズするための文字列にテンプレート パラメーターが置き換えられます。 テンプレート パラメーターは、ドル記号 ($time$ など) で始まり、終わる特別なトークンです。 次の 2 つのパラメーターは、テンプレートに基づくプロジェクトでカスタマイズを有効にする場合に特に役立ちます。

  • $GUID[1-10]$ は新しい Guid に置き換えられます。 最大 10 個の一意の GUID ($guid 1$ など) を指定できます。

  • $safeprojectname$ は、[ 新しいプロジェクト ] ダイアログ ボックスでユーザーが指定した名前で、安全でない文字とスペースをすべて削除するように変更されます。

    テンプレート パラメーターの完全な一覧については、「 テンプレート パラメーター」を参照してください。

プロジェクト テンプレートのパラメーターを置き換える

  1. SimpleProjectNode.cs ファイルで、AddFileFromTemplate メソッドを削除します。

  2. \Templates\Projects\ConsoleApp\SimpleProject.myproj ファイルで、<RootNamespace> プロパティを見つけて、その値を $safeprojectname$ に変更します。

    <RootNamespace>$safeprojectname$</RootNamespace>
    
  3. \Templates\Projects\SimpleProject\Program.cs ファイルで、ファイルの内容を次のコードに置き換えます。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;    // Guid
    
    namespace $safeprojectname$
    {
        [Guid("$guid1$")]
        public class $safeprojectname$
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello VSX!!!");
                Console.ReadKey();
            }
        }
    }
    
  4. SimpleProject プロジェクトをリビルドし、デバッグを開始します。 実験用インスタンスが表示されます。

  5. 新しい SimpleProject コンソール アプリケーションを作成します。 ([ プロジェクトの種類 ] ウィンドウで、[ SimpleProject] を選択します。 Visual Studio にインストールされているテンプレートで、[ コンソール アプリケーション] を選択します)。

  6. 新しく作成したプロジェクトで、 Program.csを開きます。 次のようになります (ファイル内の GUID 値が異なります)。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;    // Guid
    
    namespace Console_Application1
    {
        [Guid("00000000-0000-0000-00000000-00000000)"]
        public class Console_Application1
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello VSX!!!");
                Console.ReadKey();
            }
        }
    }
    

プロジェクト のプロパティ ページを作成する

ユーザーがテンプレートに基づくプロジェクトのプロパティを表示および変更できるように、プロジェクトの種類のプロパティ ページを作成できます。 このセクションでは、構成に依存しないプロパティ ページを作成する方法について説明します。 この基本プロパティ ページでは、プロパティ グリッドを使用して、プロパティ ページ クラスで公開するパブリック プロパティを表示します。

SettingsPage基底クラスからプロパティ ページ クラスを派生させます。 SettingsPage クラスによって提供されるプロパティ グリッドは、ほとんどのプリミティブ データ型を認識し、それらを表示する方法を認識します。 さらに、 SettingsPage クラスは、プロパティ値をプロジェクト ファイルに保持する方法を認識します。

このセクションで作成するプロパティ ページでは、次のプロジェクト プロパティを変更して保存できます。

  • アセンブリ名

  • OutputType

  • RootNamespace。

  1. SimpleProjectPackage.cs ファイルで、次のProvideObject属性を SimpleProjectPackage クラスに追加します。

    [ProvideObject(typeof(GeneralPropertyPage))]
    public sealed class SimpleProjectPackage : ProjectPackage
    

    これにより、COM に GeneralPropertyPage プロパティ ページ クラスが登録されます。

  2. SimpleProjectNode.cs ファイルで、次の 2 つのオーバーライドされたメソッドを SimpleProjectNode クラスに追加します。

    protected override Guid[] GetConfigurationIndependentPropertyPages()
    {
        Guid[] result = new Guid[1];
        result[0] = typeof(GeneralPropertyPage).GUID;
        return result;
    }
    protected override Guid[] GetPriorityProjectDesignerPages()
    {
        Guid[] result = new Guid[1];
        result[0] = typeof(GeneralPropertyPage).GUID;
        return result;
    }
    

    どちらのメソッドも、プロパティ ページ GUID の配列を返します。 GeneralPropertyPage GUID は配列内の唯一の要素であるため、[ プロパティ ページ ] ダイアログ ボックスに表示されるページは 1 つだけです。

  3. GeneralPropertyPage.cs という名前 のクラス ファイルを SimpleProject プロジェクトに追加します。

  4. 次のコードを使用して、このファイルの内容を置き換えます。

    using System;
    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Project;
    using System.ComponentModel;
    
    namespace SimpleProject
    {
        [ComVisible(true)]
        [Guid("6BC7046B-B110-40d8-9F23-34263D8D2936")]
        public class GeneralPropertyPage : SettingsPage
        {
            private string assemblyName;
            private OutputType outputType;
            private string defaultNamespace;
    
            public GeneralPropertyPage()
            {
                this.Name = "General";
            }
    
            [Category("AssemblyName")]
            [DisplayName("AssemblyName")]
            [Description("The output file holding assembly metadata.")]
            public string AssemblyName
            {
                get { return this.assemblyName; }
            }
            [Category("Application")]
            [DisplayName("OutputType")]
            [Description("The type of application to build.")]
            public OutputType OutputType
            {
                get { return this.outputType; }
                set { this.outputType = value; this.IsDirty = true; }
            }
            [Category("Application")]
            [DisplayName("DefaultNamespace")]
            [Description("Specifies the default namespace for added items.")]
            public string DefaultNamespace
            {
                get { return this.defaultNamespace; }
                set { this.defaultNamespace = value; this.IsDirty = true; }
            }
    
            protected override void BindProperties()
            {
                this.assemblyName = this.ProjectMgr.GetProjectProperty("AssemblyName", true);
                this.defaultNamespace = this.ProjectMgr.GetProjectProperty("RootNamespace", false);
    
                string outputType = this.ProjectMgr.GetProjectProperty("OutputType", false);
                this.outputType = (OutputType)Enum.Parse(typeof(OutputType), outputType);
            }
    
            protected override int ApplyChanges()
            {
                this.ProjectMgr.SetProjectProperty("AssemblyName", this.assemblyName);
                this.ProjectMgr.SetProjectProperty("OutputType", this.outputType.ToString());
                this.ProjectMgr.SetProjectProperty("RootNamespace", this.defaultNamespace);
                this.IsDirty = false;
    
                return VSConstants.S_OK;
            }
        }
    }
    

    GeneralPropertyPage クラスは、AssemblyName、OutputType、および RootNamespace の 3 つのパブリック プロパティを公開します。 AssemblyName には set メソッドがないため、読み取り専用プロパティとして表示されます。 OutputType は列挙定数であるため、ドロップダウン リストとして表示されます。

    SettingsPage基底クラスは、プロパティを保持するためのProjectMgrを提供します。 BindProperties メソッドは、ProjectMgrを使用して永続化されたプロパティ値を取得し、対応するプロパティを設定します。 ApplyChanges メソッドでは、ProjectMgrを使用してプロパティの値を取得し、プロジェクト ファイルに保持します。 プロパティ セット メソッドは、プロパティを永続化する必要があることを示すために IsDirty を true に設定します。 永続化は、プロジェクトまたはソリューションを保存するときに発生します。

  5. SimpleProject ソリューションをリビルドし、デバッグを開始します。 実験用インスタンスが表示されます。

  6. 実験用インスタンスで、新しい SimpleProject アプリケーションを作成します。

  7. Visual Studio はプロジェクト ファクトリを呼び出し、Visual Studio テンプレートを使用してプロジェクトを作成します。 新しい Program.cs ファイルがコード エディターで開きます。

  8. ソリューション エクスプローラーでプロジェクト ノードを右クリックし、[プロパティ] を選択します。 [ プロパティ ページ] ダイアログ ボックスが表示されます。

    シンプルプロジェクト プロパティ ページ

プロジェクトのプロパティ ページをテストする

これで、プロパティ値を変更および変更できるかどうかをテストできます。

  1. [ MyConsoleApplication プロパティ ページ ] ダイアログ ボックスで、 DefaultNamespaceMyApplication に変更します。

  2. OutputType プロパティを選択し、[クラス ライブラリ] を選択します。

  3. [Apply](適用) を選択し、次に [OK] を選択します。

  4. [プロパティ ページ] ダイアログ ボックスをもう一度開き、変更が保持されていることを確認します。

  5. Visual Studio の実験用インスタンスを閉じます。

  6. 実験用インスタンスをもう一度開きます。

  7. [プロパティ ページ] ダイアログ ボックスをもう一度開き、変更が保持されていることを確認します。

  8. Visual Studio の実験用インスタンスを閉じます。 実験用インスタンス SimpProj2_PropPage2を閉じる