創建Visual studio項目模板 vstemplate關鍵點紀要


經過多次的實驗,終於完美生成一個.VSIX的項目模板安裝包,其中遇到不少問題與挫折,久經google/baidu/自行摸索.終於解決所有問題.

現將心得記錄總結如下 

關於.vstemplate

1.可以通過導出模板直接生成.vstemplate及其他項目文件,以作為 模板的母版! 建議復制一份csprj文件做.vstemplate里面引用的模板項目文件.

2.TargetFileName/TargetFolderName可以根據需要進行修改甚至替換成變量,但是原文件名及目錄名必須存在

3./Project[@TargetFileName]的csproj生成出來的項目文件,語法必須正確,否則不但無法生成項目,錯誤提示也容易讓人誤以為是.vstemplate出錯

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識別.

7. AssemblyInfo.cs文件也要挪出Properties目錄,並在.vstemplate 修改如下

 <ProjectItem ReplaceParameters="true" TargetFileName="Properties\AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>

8.vstemplate項目的.cs文件,由於被$變量替換$,正常生成會提示大量錯誤信息.因此需要將所有.cs的"文件屬性--生成操作"設置為"無".   

   或者在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

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點.

 

關於VSIX項目

想要不注冊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,重啟后方可顯示.

     更新同樣需要先卸載--再安裝--再重啟.

     這也是為什么在小團隊中推薦使用設置模板目錄為共享目錄的原因.否則實在是太麻煩了

   

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM