将参数从Visual Studio项模板传递到生成的项

时间:2015-05-04 17:06:40

标签: xml visual-studio templates

我正在编写一个Visual Studio项目项模板,在这种情况下,我将只使用一个xml文件。我今天的问题是我想将文件的名称传递给已完成的xml文件。 ie ...当我为模板命名文件名时,它会创建项目文件并将其作为xml文件添加到我的项目中。但我想要发生的是,当它创建xml文件时,它会将文件名值传递给xml文件。

为了更好地解释它,我现在有一个项目模板,其中模板xml有这样一行:

<!-- Created by ModBuddy on $time$ -->

以上是在实际的VS项目模板中,所以当我创建一个要添加到我的项目的项目时,它实际上创建了我的xml文件,其中包含以下行。

<!-- Created by ModBuddy on 10/26/2014 1:16:16 AM -->

本质上它在创建xml文件时从Item Template传递到我的xml文件当前DateTime。我的问题是你如何定义和/或传递$ time $等参数,我在哪里可以找到更多关于这样做的信息。我希望能够将文件的文件名从Visual Studio项目模板(我将自己创建)传递到工作的xml文件,类似于$ filename $,但我不知道如何做到这一点或我可以在哪里了解更多信息。

1 个答案:

答案 0 :(得分:4)

经过大量研究后,我发现您可以使用格式

创建并传递自己的自定义参数
$whatevernameyoulike$ 

通过使用Visual Studio Custom Wizards。基本上,您可以从程序集中创建一个新的VS项目,类库和实现IWizard接口:

Microsoft.VisualStudio.TemplateWizardInterface 

您还必须在程序集中为您稍后将创建的项目或项目模板创建一个Interface / WindowsForm。然后,在类中修改实现IWizard的RunStarted方法,以传递您的参数,如下所示:

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
    GeneralInfoPage generalInfoPage = new GeneralInfoPage();
    ExtendedInfoPage extendedInfoPage = new ExtendedInfoPage();
    ModWizardMenu modHost = new ModWizardMenu();

    modHost.Pages.Add(generalInfoPage);
    modHost.Pages.Add(extendedInfoPage);

    if (modHost.ShowDialog() != DialogResult.OK)
    {
        throw new WizardCancelledException("The wizard has been canceled by the user.");
    }

    string modDescription = generalInfoPage.ModDescription;
    string toParse = modDescription;
    if (toParse.Length > 127)
        toParse = toParse.Substring(0, 127);

    createUnit = extendedInfoPage.createUnit.Checked;
    createBuilding = extendedInfoPage.createBuilding.Checked;
    createSponsor = extendedInfoPage.createSponsor.Checked;

    replacementsDictionary.Add("$unitName$", extendedInfoPage.unitName);
    replacementsDictionary.Add("$buildingName$", extendedInfoPage.buildingName);
    replacementsDictionary.Add("$sponsorName$", extendedInfoPage.sponsorName);
}

这里的主要部分是replacementmentsDictionary,这当然只是解决方案的一部分。接下来,您必须创建自定义,项目或项模板以访问新创建的向导程序集。

创建VS项目或项目模板后,从已创建的zip文件中提取文件并修改.vstemplate文件,将引用添加到自定义向​​导程序集中,如下所示:

<WizardExtension>
    <Assembly>rhodesMBWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=56e9113a0fdbb124</Assembly>
    <FullClassName>rhodesMBWizard.InfoManager</FullClassName>
</WizardExtension>

确保你的程序集具有正确的公共令牌密钥非常重要,如果你喜欢我并且不断更改类名,那么你需要确保我所拥有的rhodesMBWizard.InfoManager应该是:

yourAssemblyNamespace.classnameThatImplementsIWizard

如果你查看你的vstemplate文件,你会看到:

<TemplateContent>
    <References />
    <ProjectItem TargetFileName="$fileinputname$.xml" ReplaceParameters="true">BuildingTemplate.xml</ProjectItem>
</TemplateContent>

以ProjectItem开头的行是拉取命名参数的行,并将它们传递给该行末尾的Project或Item Template文件名,在我的例子中是BuildingTemplate.xml。

因此,在我的BuildingTemplate.xml文件中,我将有一堆

$buildingName$ 

条目,项目或项目模板提取

的值
$buildingName$ 

在我创建的CustomWizard中的替换词典中,它然后在我的项目中为我创建了一个工作的xml文件,其中所有参数都已更改。

现在要做到这一切的要点是,当您创建项目或项目模板时,您可以以前面提到的用户界面或WindowsForm的形式接收用户输入,允许用户事先做出选择并命名一些事情。这将减少工作xml文件中所需的工作量。

额外信息: http://www.windowsdevcenter.com/pub/a/windows/2007/06/06/developing-visual-studio-project-wizards.html?page=1