2020年1月30日 星期四

SharpDevelop IDE 系列研究 (2) - 模組開發方法, 在 Visual Studio 進行開發,打造自己的範本

範本是指打開 IDE 時,建立專案時所套用到的範本,由於這個章節的目的是將 Sharpdevelop 的專案建立範本移動到 Visual Studio 上,就不需要在 Sharpdevelop 寫 Code ,純做開發就好。


 如圖所示,如果要建立 AddIns ,可能就得在 Sharpdevelop 中開發,但如果不想要呢? 你其實還有其他選擇,就是自己做一個 Visual Studio 的 Sharpdevelop AddIns 模板。

由於它的製作過程有點繁複,所以我把我整理過後的範本公開使用:

https://github.com/hpcslag/sp-template-for-visual-studio

標題雖然有冠名工研院 (ITRI) ,但我懶得改,而且裡面的內容並不涉及任何院內智慧財產權,有需要的人可以自己去改裡面的內容。

在上面這個範本集中,要注意的是打開 Items 的 Reference ,請記得增加路徑,指向 Sharpdevelop 的 bin 目錄:

C:\Users\Mac\Desktop\SharpDevelop-5.0.0\bin

本篇只會順帶介紹製作 Sharpdevelop Template 的方式,不一定需要看,只是順邊工商一下我整理的 Template ,裡面自帶一個我預先幫你做好的 AddIns 範本 (能從 Menu 打開一個空白 Form 的外掛範本),方便初學者入門。



製作 Items Template


範本製作最重要的檔案是 .vstemplate ,他決定你按下 Add New Items 之後要給出什麼東西安裝到你的專案。


這篇文章的 New Item 範本製作,用一個 SharpDevelop Empty View 當作範本,我的目錄下有這些東西:

  • Properties 裡面塞的是一個很正常的 AssemblyInfo.cs
  • __TemplateIcon.ico 應該是塞錯的檔案... (給 VS 讀的圖片)
  • FullFile.png 是給 VS 讀的圖片 (拿 Sharpdevelop 的)
  • Class.cs 是樣本程式檔
  • ItemTemplate1.vstemplate 是主要的 template 描述檔
關於 Class.cs 的內容,是這樣的:

(留意 $rootnamespace$ 和 $safeitemrootname$)
using System;
using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Gui;

namespace $rootnamespace$ //$rootnamespace$ 會套用到要新增的專案的 namespace 中
{
	/// <summary>
	/// Description of the view content
	/// </summary>
	public class $safeitemrootname$ : AbstractViewContent //safeitemrootname 會套用到使用者自己輸入的那個名稱
	{
		/// <summary>
		/// The <see cref="System.Windows.Forms.Control"/> representing the view
		/// </summary>
		public override object Control
        {
            get
            {
                //
                // TODO : Give back a working Windows.Forms Control
                //
                return null; //return some view
            }
        }

        /// <summary>
        /// Creates a new $safeitemrootname$ object
        /// </summary>
        public $safeitemrootname$() //safeitemrootname 會套用到使用者自己輸入的那個名稱 (建構子)
		{
			this.TitleName = "$safeitemrootname$"; //safeitemrootname 會套用到使用者自己輸入的那個名稱
		}

        /// <summary>
        /// Loads a new file into MyView
        /// </summary>
        /*public override void Load(string fileName)
        {
            // TODO
            throw new System.NotImplementedException();
        }

        /// <summary>
        /// Refreshes the view
        /// </summary>
        public override void RedrawContent()
        {
            // TODO: Refresh the whole view control here, renew all resource strings
            //       Note that you do not need to recreate the control.
        }*/

        /// <summary>
        /// Cleans up all used resources
        /// </summary>
        public override void Dispose()
        {
            // TODO: Clean up resources in this method
            // Control.Dispose();
            base.Dispose();
        }
	}
}

關於 vstemplate ,它是長這樣的格式:

<?xml version="1.0" encoding="utf-8"?>
<VSTemplate Version="3.0.0" Type="Item" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" xmlns:sdk="http://schemas.microsoft.com/developer/vstemplate-sdkextension/2010">
  <TemplateData>
    <Name>[樣板標題]</Name>
    <Description>[樣板說明]</Description>
    <Icon>[圖片檔位置]</Icon>
    <TemplateID>6b648a83-bf04-44c8-bf60-014a7cab5f97</TemplateID>
    <ProjectType>CSharp [語言類型]</ProjectType>
    <RequiredFrameworkVersion>2.0</RequiredFrameworkVersion>
    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
    <DefaultName>Class.cs [項目檔案名稱]</DefaultName>
  </TemplateData>
  <TemplateContent>
    <References>
      <Reference>
        <Assembly>System</Assembly>
      </Reference>
    </References>
    <ProjectItem ReplaceParameters="true">Class.cs [項目匯入進來的檔案路徑]</ProjectItem>
  </TemplateContent>
</VSTemplate>


製作 Project Template


這個 Project 相對簡單一些,結構中也可以包含自動化更改 class name 的 Items 出現,我的專案長這樣:


  •  Configuration 裡面也是很純的 AssemblyInfo.cs
  • MyTemplate.vstemplate 是整個專案的主要描述檔
  • MenuCommand.cs 是我一開始就希望加入進來的檔案
  • ITRI-AddIn.nuspec 是 nupackege 描述檔
  • ITRI-AddIn.csproj 是預設的專案模板
  • ITRI-AddIn.addin 是 Sharpdevelop 專用的外掛描述檔
  • 剩下的 Image 是給 VS  讀取預覽圖用的
重點應該不會是在 AddIns.addin ,這些有關 Sharpdevelop 的項目,會在下一個章節介紹。

重點應該是放在 MyTemplate.vstemplate 跟 ITRI-AddIn.csproj 上,要製作 Project 檔,你必須真的去開個 Project ,在把檔案放進來,比較容易。

關於 MyTemplate.vstemplate ,它是長這樣的:

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateData>
    <Name>[專案檔標題]</Name>
    <Description>[專案檔說明]</Description>
    <ProjectType>CSharp [專案檔語言類形]</ProjectType>
    <ProjectSubType>
    </ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>true</CreateNewFolder>
    <DefaultName>ITRI - AddIn [預設專案名稱]</DefaultName>
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
    <Icon>__TemplateIcon.png [預覽 ICON]</Icon>
    <PreviewImage>__PreviewImage.png [預覽圖片]</PreviewImage>
  </TemplateData>
  <TemplateContent>
    <Project TargetFileName="ITRI-AddIn.csproj" File="ITRI-AddIn.csproj" ReplaceParameters="true">
      <ProjectItem ReplaceParameters="true" TargetFileName="AddInWritingHelp.txt [要增加的檔案的 Path ]">AddInWritingHelp.txt [要增加的檔案]</ProjectItem>
      <Folder Name="Configuration" TargetFolderName="Configuration">
        <ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
      </Folder>
      <ProjectItem ReplaceParameters="true" TargetFileName="ITRI-AddIn.addin">ITRI-AddIn.addin</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="ITRI-AddIn.nuspec">ITRI-AddIn.nuspec</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="MenuCommand.cs">MenuCommand.cs</ProjectItem>
    </Project>
  </TemplateContent>
</VSTemplate>

然後關於 .csproj 的部分,只擷取一些,這個 .csproj 可以從 VS 打開,並且需要把每一個引用入徑都改成相對路徑,像下面這樣:

部分顯示...
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <OutputPath>..\..\..\..\AddIns\Misc\$safeprojectname$\</OutputPath>
    <DebugSymbols>True</DebugSymbols>
    <DebugType>Full</DebugType>
    <Optimize>False</Optimize>
    <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
  </PropertyGroup>

打包


打包的目的是讓 VS 可以正常匯入,直接把整個目錄包成 zip,放在 item/project template 目錄底下就可以了。

把這些檔案分別丟到【我的文件】中 Visual Studio 的 Templates 底下各 Project / Item 資料夾中,然後如果你是 VS 2019 的用戶,可能需要執行清空指令,才能看到 Template:

devenv.exe /Resetuserdata

完成後,直接按下 New Item / New Project 就可以看到剛才新增的模板。

Reference:

有興趣可自行參考 VSIX 範本說明:
https://docs.microsoft.com/en-us/visualstudio/extensibility/creating-custom-project-and-item-templates?view=vs-2019


沒有留言:

張貼留言

© Mac Taylor, 歡迎自由轉貼。
Background Email Pattern by Toby Elliott
Since 2014