我正在尝试创建一个多项目模板。我希望子项目名称包含解决方案名称。我尝试了以下但是$ safeprojectName $由于某种原因在根模板中不起作用。它尝试使用名称中的$ safeprojectName $创建文件夹,而不是实际的项目名称。
<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Default Solution</Name>
<Description>An example of a multi-project template</Description>
<Icon>Icon.ico</Icon>
<ProjectType>CSharp</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<SolutionFolder Name="$safeprojectName$.Web">
<ProjectTemplateLink ProjectName="$safeprojectName$.Web">
Src\Web\MyTemplate.vstemplate
</ProjectTemplateLink>
</SolutionFolder>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
我已经对此进行了大量阅读,并且已经使用IWizard接口创建了一个程序集,该接口创建了一个参数$ solutionName $。然后我使用了以下模板。
<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Default Solution</Name>
<Description>An example of a multi-project template</Description>
<Icon>Icon.ico</Icon>
<ProjectType>CSharp</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<SolutionFolder Name="$solutionName$.Web">
<ProjectTemplateLink ProjectName="$solutionName$.Web">
Src\Web\MyTemplate.vstemplate
</ProjectTemplateLink>
</SolutionFolder>
</ProjectCollection>
</TemplateContent>
<WizardExtension>
<Assembly>DefaultSoloutionWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=f753ddb61a28cb36, processorArchitecture=MSIL</Assembly>
<FullClassName>DefaultSoloutionWizard.WizardImplementation</FullClassName>
</WizardExtension>
</VSTemplate>
然而,这也会因同样的问题而失败。我是不是想做不可能的事?对此的任何帮助都是最受欢迎的。
答案 0 :(得分:5)
从Visual Studio 2013 Update 2开始,您现在可以在根.vstemplate文件中使用ProjectTemplateLink元素上的CopyParameters属性。在根模板中定义的任何参数都可以在链接模板中使用&#34; ext _&#34;前缀。
例如,如果根模板定义了一个参数$ Foo $,那么参数$ ext_Foo $将在具有相同值的链接项目中可用。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms171398.aspx。
答案 1 :(得分:2)
您可能需要查看Guidance Automation Toolkit。那里有相当数量的消化,但它可以做的部分工作是在多项目模板上放置基于向导的UI。
如果您想查看相关示例,请查看Service Factory,它可以部分基于向导创建整个解决方案结构。
答案 2 :(得分:1)
是的,您需要在根模板向导中使用静态字典,这将由子模板的向导实现使用:
根模板中的IWizard实现
public void RunStarted(object automationObject,
Dictionary<string, string> replacementsDictionary,
WizardRunKind runKind, object[] customParams)
{
try
{
// Display a form to the user. The form collects
// input for the custom message.
inputForm = new UserInputForm();
inputForm.ShowDialog();
customMessage = inputForm.get_CustomMessage();
// Add custom parameters.
replacementsDictionary.Add("$custommessage$",
customMessage);
globalDictionary = new Dictionary<string, string>();
globalDictionary.Add("$custommessage$",
customMessage);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
public static Dictionary<string, string> globalDictionary;
您可以在此处获得完整示例:Multi-Project Templates with Wizard: Visual Studio 2010 Sample