標籤:
from:http://www.cnblogs.com/stickman/p/3454719.html
經過多次的實驗,終於完美產生一個.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,重啟後方可顯示.
更新同樣需要先卸載--再安裝--再重啟.
這也是為什麼在小團隊中推薦使用設定模板目錄為共用目錄的原因.否則實在是太麻煩了
建立Visual studio項目模板 vstemplate關鍵點紀要