3

我正在尝试创建自定义 ASP.NET MVC4 模板。我从 Basic MVC4 模板开始,进行修改,然后使用“导出模板”向导创建模板 zip 文件。现在(几乎)一切都在顺利进行。当我使用模板创建一个新的 MVC 应用程序时,它会按照我想要的方式重新创建我的所有设置,除了一个。出于某种原因,它将我的 Web 应用程序的项目属性更改为具有“当前页面”而不是“特定页面”的开始操作(就像它在原始模板中一样,就像它在我的模板中一样)。此设置位于 Web 选项卡下的项目属性中。这是在我的模板应用程序中设置的内容(在我生成实际的模板 zip 文件之前):

正确设置

当我使用该模板创建一个新项目时,情况如下:

不正确的设置

如何修改我的模板以正确设置此设置(或更准确地说,我如何强制它记住我最初设置的内容)?

4

2 回答 2

4

编辑:由于对先前提出的解决方案的原始请求和行为的误解而修改了答案。

要设置自定义 MVC 项目模板的启动操作,您需要创建一个带有实现Microsoft.VisualStudio.TemplateWizard.IWizard接口的类的 dll。要使用向导 dll,您需要将其复制到 Visual Studio 的探测路径,即 (VS2010 Install Dir)\Common7\IDE、(VS2010 Install Dir)\Common7\IDE\PrivateAssemblies,或 (VS2010 Install Dir) \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

不幸的是,或幸运的是,这取决于你在硬币的一面......

与“启动项目”设置一样,该设置不是项目文件或生成的模板文件的一部分。它存储在“SUO”或解决方案用户选项文件中。模板生成器不包含 SUO。

SUO 文件的一些背景:http: //msdn.microsoft.com/en-us/library/bb165909 (v=vs.80).aspx

于 2013-01-30T04:20:50.600 回答