我正在将扩展程序从VS 2015升级到VS 2017。 根据{{3}},他们改变了VS 2017中自定义项目模板的处理方式。
目前我很困惑。 让我解释一下我们的扩展如何在VS 2015中运行,然后我将解释我在升级中尝试做的事情。
我们的扩展由我们公司的技术顾问内部使用。它从数据库加载一些计算并将源文件放在一起。这些源文件被加载到C#解决方案中,然后由技术顾问进行编译和调试,并根据需要进行调整/重写并保存回数据库。
扩展程序有一个工具窗口,工具窗口允许您连接到数据库,当建立数据库连接时,会创建一个解决方案并加载源文件(由零碎组成)。
所以我们的模板是一个空白的类库项目,它接收这些源文件。我们称之为CalcTemplate.zip。 CalcTemplate.zip包含在Extension项目中,只是作为一个添加的文件。
csTemplatePath = soln.GetProjectTemplate("CalcTemplate.zip", "CSharp");
// Create a new C# Class Library project using the template obtained above.
soln.AddFromTemplate(templatePath, prjPath, "CalcProject", false);
但是,它并没有由vsix安装,而是安装了程序所需的其余软件的msi。 所以我们的用户(技术顾问)从不挑选模板 档案 - >新 - >项目选项。
正如本文所述:Upgrading Custom Project Templates 我已将模板作为新项目添加到包含Extension的解决方案中,并将其作为资产添加到Extension项目中。我可以在VS的实验实例中选择它作为新项目,但在我们的场景中没有用。
那么扩展应该如何工作,就是在安装软件的目录文件夹中找到CalcTemplate.zip文件,假设
C:\ Program Files \ SoftwareName \ Custom Templates \
然后在构建解决方案时使用模板。请注意,在没有先安装其余软件的情况下,扩展名无用,因此在使用单独的msi安装后,zip文件将位于上述路径中。
当我在实验实例中调试扩展时(或者如果我安装了vsix并测试了功能),它找不到位于
中的模板“C:\ Program Files \ SoftwareName \ Custom Templates \”
出现运行时错误
csTemplatePath = soln.GetProjectTemplate("CalcTemplate.zip", "CSharp");
我更改了工具中的文件夹 - >选项 - >项目和解决方案 - >一般 - >用户项目模板位置指向上述路径。
根据上面的第一个链接,我还需要更改.vstemplate文件并创建一个.vstman文件。
这是我的.vstemplate文件:
<?xml version="1.0" encoding="utf-8"?>
<VSTemplate Version="3.0.0" Type="Project"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"
xmlns:sdk="http://schemas.microsoft.com/developer/vstemplate-
sdkextension/2010">
<TemplateData>
<Name>CalcTemplate</Name>
<Description>CalcTemplate</Description>
<Icon>CalcTemplate.ico</Icon>
<ProjectType>CSharp</ProjectType>
<RequiredFrameworkVersion>2.0</RequiredFrameworkVersion>
<SortOrder>1000</SortOrder>
<TemplateID>6f47c81e-6f6d-433f-8203-0bd0857765bd</TemplateID>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>CalcTemplate</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
</TemplateData>
<TemplateContent>
<Project File="ProjectTemplate.csproj" ReplaceParameters="true">
<ProjectItem ReplaceParameters="true"
TargetFileName="Properties\AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
</Project>
</TemplateContent>
</VSTemplate>
这是我的.vstman文件:
<VSTemplateManifest Version="1.0" Locale="1033"
xmlns="http://schemas.microsoft.com/developer/vstemplatemanifest/2015">
<VSTemplateContainer TemplateType="Project">
<RelativePathOnDisk>C:\Program Files\SoftwareName\Custom User Project Templates\CalcTemplate</RelativePathOnDisk>
<TemplateFileName>CalcTemplate.vstemplate</TemplateFileName>
<VSTemplateHeader>
<TemplateData xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<Name>CalcTemplate</Name>
<Description>CalcTemplate</Description>
<Icon>CalcTemplate.ico</Icon>
<ProjectType>CSharp</ProjectType>
<RequiredFrameworkVersion>2.0</RequiredFrameworkVersion>
<SortOrder>1000</SortOrder>
<TemplateID>6f47c81e-6f6d-433f-8203-0bd0857765bd</TemplateID>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>CalcTemplate</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
</TemplateData>
</VSTemplateHeader>
</VSTemplateContainer>
</VSTemplateManifest>
所以我的问题是,如何让VS 2017拿起文件夹中的模板 运行期间“C:\ Program Files \ SoftwareName \ Custom Templates \”? 也许这很明显。我现在很困惑。