我正在编写一个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 $,但我不知道如何做到这一点或我可以在哪里了解更多信息。
答案 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文件中所需的工作量。