3

カスタム ASP.NET MVC4 テンプレートを作成しようとしています。基本的な MVC4 テンプレートから開始し、変更を加えてから、[テンプレートのエクスポート] ウィザードを使用してテンプレートの zip ファイルを作成します。現在(ほぼ)すべてが順調に機能しています。テンプレートを使用して新しい MVC アプリケーションを作成すると、1 つを除いてすべての設定が希望どおりに再作成されます。何らかの理由で、Web アプリケーションのプロジェクト プロパティが変更され、開始アクションが「特定のページ」ではなく「現在のページ」になります (元のテンプレートと私のテンプレートのように)。この設定は、[Web] タブのプロジェクト プロパティにあります。テンプレート アプリケーションでの設定は次のとおりです (実際のテンプレート zip ファイルを生成する前)。

正しい設定

そして、そのテンプレートを使用して新しいプロジェクトを作成すると、次のようになります。

不適切な設定

テンプレートを変更してこの設定を適切に設定するにはどうすればよいですか (より正確には、最初に設定した内容を強制的に記憶させるにはどうすればよいですか)?

4

2 に答える 2

4

編集:元のリクエストと以前に提案されたソリューションの動作の両方の誤解により、回答が改訂されました。

カスタム MVC プロジェクト テンプレートの開始アクションを設定するには、インターフェイスを実装するクラスを含む dll を作成する必要がありMicrosoft.VisualStudio.TemplateWizard.IWizardます。ウィザード dll を使用するには、Visual Studio のプローブ パス ((VS2010 インストール ディレクトリ)\Common7\IDE、(VS2010 インストール ディレクトリ)\Common7\IDE\PrivateAssemblies、または (VS2010 インストール ディレクトリ) にコピーする必要があります)。 \Common7\IDE\PublicAssemblies. コンパイルされた dll をこれらのディレクトリのいずれかに配置しない場合は、dll に厳密な名前を付けて署名し、それを GAC に追加して、dll の publickeytoken を取得し、それを vstemplate ファイルの Assembly 要素に追加する必要があります。 .

次のコードのテストでは、dll を (VS2010 Install Dir)\Common7\IDE\PrivateAssemblies にコピーしたため、dll は署名されていません。

ウィザード コード

using System.Collections.Generic;
using System.Linq;
using System.Xml;
using EnvDTE;
using Microsoft.VisualStudio.TemplateWizard;

namespace WarrenG.StartAction {
    public class Wizard : IWizard {
        private readonly Dictionary<string, object> data = new Dictionary<string, object>();


        public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary,
                               WizardRunKind runKind, object[] customParams) {
            if (replacementsDictionary.ContainsKey("$wizarddata$")) {
                string xml = replacementsDictionary["$wizarddata$"];
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
                foreach (XmlNode node in doc.ChildNodes) {
                    data.Add(node.Name, node.InnerText);
                }
            }
        }

        public bool ShouldAddProjectItem(string filePath) {
            return true;
        }

        public void RunFinished() {
        }

        public void BeforeOpeningFile(ProjectItem projectItem) {
        }

        public void ProjectItemFinishedGenerating(ProjectItem projectItem) {
        }

        public void ProjectFinishedGenerating(Project project) {
            if (data.ContainsKey("WebApplication.DebugStartAction")) {
                project.Properties.Item("WebApplication.DebugStartAction").Value =
                    data["WebApplication.DebugStartAction"];
            } else {
                project.Properties.Item("WebApplication.DebugStartAction").Value = 1;
            }
        }
    }
}

カスタム MVC プロジェクト テンプレートの vstemplate ファイルにウィザード固有の要素を追加する

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateContent>
    <!-- various template content -->
  </TemplateContent>
  <!-- add the following -->
  <WizardExtension>
    <Assembly>WarrenG.StartAction, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=null</Assembly>
    <FullClassName>WarrenG.StartAction.Wizard</FullClassName>
  </WizardExtension>
  <WizardData>
    <WebApplication.DebugStartAction>1</WebApplication.DebugStartAction>
  </WizardData>
</VSTemplate>

プロジェクト ページの開始アクションは、表示順序に従って 0 ~ 4 の番号で表示されます。値 1 は特定のページに対応します。

于 2013-02-02T21:19:15.833 に答える
0

残念ながら、または幸いなことに、あなたがいるコインの側面に応じて...

"Startup Project" 設定と同様に、その設定は生成されるプロジェクト ファイルまたはテンプレート ファイルの一部ではありません。これは、「SUO」またはソリューション ユーザー オプション ファイルに保存されます。SUO は、テンプレート ジェネレーターには含まれていません。

SUO ファイルの背景: http://msdn.microsoft.com/en-us/library/bb165909(v=vs.80).aspx

于 2013-01-30T04:20:50.600 に答える