从向导访问Visual Studio项目模板zip存档的内容

时间:2014-03-18 20:21:42

标签: visual-studio templates

我正在尝试为Visual Studio构建一个自定义的多项目模板,并且我有一些文件资产不属于多项目模板中的任何项目。我想将这些静态资产从模板的.zip存档中提取到新项目的目标目录中。

我已将模板设置为使用.vstemplate文件中的向导:

<子>实施例
<WizardExtension>
    <Assembly>TestWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...</Assembly>
    <FullClassName>TestWizard.Wizard</FullClassName>
</WizardExtension>

我还可以确认向导正在RunStarted界面中执行IWizard方法:

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
    MessageBox.Show("This works just fine");
}

如何访问包含所有模板资产的.zip文件并将这些资产提取到目标目录?我没有看到任何可以访问文件系统中任何一个位置的属性。

1 个答案:

答案 0 :(得分:1)

TemplateWizard上找不到MSDN doco中的任何内容来帮助我。我想我们想要实现的更多的是与VS自动化而不是向导。

无论如何,单步执行代码并查看您在IWizard.RunStarted中获得的上下文,我发现项目模板中的customParams[0]的第一项指向正在创建。 doco中没有任何东西可以为您提供线索。 (选项1)

获得上述相同路径的另一种方法是通过VS解决方案获取它。在MSDN forum上找到此选项的代码。 (选项2)

这可以让您找到已打包到项目模板中的额外项目。现在由您自己决定将它们添加到解决方案中并将它们添加为项目或其他任何内容。您可以通过上下文(DTE)automationObject.Solution传入解决方案。

下面的代码没有错误检查这是我的POC。此外,因为您正在获取它上面的项目,以替换/扩展可能在这些项目内的令牌。代码是使用VS2013开发和测试的,不明白为什么它在早期版本中不起作用。

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
    // Pick one of the options below, error checking skipped for brevity.
    // Option 1
    var tempaltePath = customParams[0] as string;

    // Option 2
    var templatePath = ((DTE)automationObject.Solution as Solution2).GetProjectTemplate("Sc.Accelerator.zip", "CSharp");

    // Get the source and destination folders, error checking skipped for brevity.
    var packagePath = Path.GetDirectoryName(templatePath as string);

    // Found this by looking at the dictionary, undocumented token.
    var solutionPath = replacementsDictionary["$solutiondirectory$"]; 

    // Alternative, did not work for me, may be it should to be called from IWizard.RunFinished
    // var solutionPath = Path.GetDirectoryName((DTE)automationObject.Solution.FullName);

    // Copy a file from project package into solution folder, error checking skipped for brevity.
    File.Copy(Path.Combine(packagePath, ".gitignore"), Path.Combine(solutionPath, ".gitignore"));

    // ... 
}