通过屡次的实验,终于完美生成一个.VSIX的项目模板安装包,其中遇到很多问题与挫折,久经google/baidu/自行摸索.终于解决全部问题.工具
现将心得记录总结以下 ui
1.能够经过导出模板直接生成.vstemplate及其余项目文件,以做为 模板的母版! 建议复制一份csprj文件作.vstemplate里面引用的模板项目文件.this
2.TargetFileName/TargetFolderName能够根据须要进行修改甚至替换成变量,可是原文件名及目录名必须存在google
3./Project[@TargetFileName]的csproj生成出来的项目文件,语法必须正确,不然不但没法生成项目,错误提示也容易让人误觉得是.vstemplate出错spa
4.关于<CustomParameters>,必须放在</Project> 以后,</TemplateContent>以前(schema定义了顺序)操作系统
5.经过菜单栏导出的项目,生成在 %Userprofile%\Documents\Visual Studio 2012\Templates\My Exported Templates\, 压缩项目文件为zip时,根目录必须包含.vstemplate,不然没法出如今VS 模板项目选择界面中命令行
6.zip后的模板项目文件,须要放 %Userprofile%\Documents\Visual Studio 2012\Templates\ProjectTemplates 方可被VS识别.code
7. AssemblyInfo.cs文件也要挪出Properties目录,并在.vstemplate 修改以下orm
<ProjectItem ReplaceParameters="true" TargetFileName="Properties\AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
8.vstemplate项目的.cs文件,因为被$变量替换$,正常生成会提示大量错误信息.所以须要将全部.cs的"文件属性--生成操做"设置为"无". blog
或者在sln解决方案文件中,"配置属性"中设置该项目为不生成(不推荐使用该方法)
9.能够附加上一个.bat批处理文件.内容以下
cd /d %1 "C:\Program Files\HaoZip\haozipc" a TemplateProject.zip *.* -r move/y TemplateProject.zip ..\Template.Vsix\ProjectTemplates
注释: 在build项目的时候,执行批处理文件,将项目目录做为参数%1传入到bat文件
bat line 1: 进入项目目录,方便line2的压缩命令压缩本目录及子目录文件,缘由参考第5.点
bat line 2:压缩命令,使用有命令行的压缩软件,例如rar,haozip等.不过haozip很奇怪,我家里的机器是安装在program files,而公司的机器是program files(x86).可是两台机操做系统都是x64
bat line 3:上文是移动到vsix的目录所在位置(推荐,以便使用IWizard生成的dll),实际上能够移动到%Userprofile%\Documents\Visual Studio 2012\Templates\ProjectTemplates直接使用(无IWizard时)
IWizard也是很是麻烦的东西,由于以前不多用须要注册到GAC带签名的项目,因此当时也走了很多冤枉路
1.须要引用EnvDTE 及 Microsoft.VisualStudio.TemplateWizardInterface
2.只要实现接口方法RunStarted便可,ShouldAddProjectItem方法返回true,其余方法所有留空
3.能够建立一个winform来输入参数,而后再RunStarted里面初始化这个winform,并ShowDialog();
4.参数replacementsDictionary,既可访问也可修改,这里能够添加新的替换变量,或者读取默认替换变量的值
5.项目须要"签名--为程序集签名",生成的key文件,必须带密码,不然没法添加到GAC
项目copy到其余机器使用时,编译的时候会提示证书文件相关的错误.此时只需在更改密码处从新输入一次密码
6.GAC注册看似简单,但仍是有注意的地方.首先要使用管理员身份运行vs工具命令提示,而后命令参数须要注意
注册 gacutil /i 项目名.dll
卸载 gacutil /u 项目名 这里不能带dll
查看注册状况 gacutil /lr 项目名 这里不能带dll
7.在使用vsix项目的时候,能够省略第6点.
想要不注册GAC,并且能够很炫的分发给别人,能够选择建立VSIX项目.
可是若是是小团队合做,我仍是推荐注册GAC,而后在vs中设置模板目录为共享目录以访问vstemplate生成的zip文件
1.须要先下载visual studio 20XX SDK,安装后可建立VSIX PROJCT(扩展性栏目下)
2.可视化编辑source.extension.vsixmanifest,关键是在Asset栏目中新建对应的项
a.对于IWizard生成的DLL,注意要引用包含了IWizard的项目
Type: Microsoft.VisualStudio.Assembly
Embed in this folder填 "Assemblies"
b.对于vstemplate项目
Type:Microsoft.VisualStudio.ProjectTemplate
Source: 可选择File on System, 选择文件后,文件会自动copy到ProjectTemplates目录下.所以, "关于.vstemplate"第9点描述的批处理move位置,应该是该路径
若是选择 A project in current solution,请留意如下内容.
3. 选择 A project in current solution后,若是在编译时出现提示 "该项目中不存在目标“TemplateProjectOutputGroup”, 那么想必你的project是从菜单栏导出的模板改出来的,若是是"新建--扩展性--C# Template project",是不会出现这个错误提示的.
这个问题在google,baidu能搜到有人提问,可是没有确切解决问题的办法. 最终我在仔细对比两套csprj文件后,发现须要添加如下两项
a.在<PropertyGroup>...</PropertyGroup>中添加下项
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
b.找到<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />在下面添加
<Import Project="$(VSToolsPath)\VSSDK\Microsoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />
且a要先于b.
4.安装VSIX后,若果在新建项目中还没看到,请关闭全部vs IDE,重启后方可显示.
更新一样须要先卸载--再安装--再重启.
这也是为何在小团队中推荐使用设置模板目录为共享目录的缘由.不然实在是太麻烦了