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

roa*_*ter 3 xml templates visual-studio

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

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

<!-- Created by ModBuddy on $time$ -->
Run Code Online (Sandbox Code Playgroud)

上面是在实际的VS Item模板中,因此当我创建要添加到项目中的Item时,它实际上会在其中包含以下行的情况下创建我的xml文件。

<!-- Created by ModBuddy on 10/26/2014 1:16:16 AM -->
Run Code Online (Sandbox Code Playgroud)

本质上,它在创建xml文件时将当前DateTime从项目模板传递到我的xml文件。我的问题是如何定义和/或传递$ time $之类的参数,在哪里可以找到更多有关此的信息。我希望能够将文件的文件名从Visual Studio项目模板(我将自己创建)传递到工作的xml文件中,例如$ filename $,但我不知道如何执行此操作或在哪里可以了解更多信息。

roa*_*ter 5

经过大量研究,我发现您可以使用以下格式创建并传递自己的自定义参数

$whatevernameyoulike$ 
Run Code Online (Sandbox Code Playgroud)

通过使用Visual Studio自定义向导。基本上,您将创建一个新的VS项目,类库,并从Assembly中实现IWizard接口:

Microsoft.VisualStudio.TemplateWizardInterface 
Run Code Online (Sandbox Code Playgroud)

您还必须在程序集中为您稍后将要创建的项目或项目模板创建一个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);
}
Run Code Online (Sandbox Code Playgroud)

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

一旦创建了VS Project或Item模板,就可以从创建的zip文件中提取文件并修改.vstemplate文件,以将对引用的引用添加到自定义向​​导程序集中,如下所示:

<WizardExtension>
    <Assembly>rhodesMBWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=56e9113a0fdbb124</Assembly>
    <FullClassName>rhodesMBWizard.InfoManager</FullClassName>
</WizardExtension>
Run Code Online (Sandbox Code Playgroud)

确保您的程序集具有正确的公共令牌密钥是很重要的,并且如果您像我一样,并且您在不断更改类名,则需要确保在我的rhodesMBWizard.InfoManager中应该是:

yourAssemblyNamespace.classnameThatImplementsIWizard
Run Code Online (Sandbox Code Playgroud)

如果查看您的vstemplate文件,您将看到:

<TemplateContent>
    <References />
    <ProjectItem TargetFileName="$fileinputname$.xml" ReplaceParameters="true">BuildingTemplate.xml</ProjectItem>
</TemplateContent>
Run Code Online (Sandbox Code Playgroud)

以ProjectItem开头的行是提取命名参数并将其传递到该行末尾的Project或Item Template文件名的行,在本例中为BuildingTemplate.xml。

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

$buildingName$ 
Run Code Online (Sandbox Code Playgroud)

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

$buildingName$ 
Run Code Online (Sandbox Code Playgroud)

在我创建的CustomWizard中的替换字典中,然后为我在Project中创建一个工作xml文件,并更改了所有参数。

现在,完成所有这些操作的主要要点是在创建项目或项目模板时,您可以以前面提到的用户界面或WindowsForm的形式接收用户输入,从而允许用户事先进行选择和命名,这将减少工作xml文件中所需的工作量。

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