2014年7月14日月曜日

Visual Studio 2013 SDK で拡張機能を作りたい その7

拡張機能の設定方法を調べてみる。

  1. メニューバーに、新しく項目が追加される。
  2. ツールメニューに、新しく項目が追加される。
  3. ツール→オプションに、新しく項目が追加される。

1と2は、設定画面も作らなくてはならないので、パス。
(そんなスゴイものを作るわけでもないし)
というわけで、3の方法をage

まずプロジェクトに、新しいクラスを追加する。
namespace Company.VSPackage7
{
    using Microsoft.VisualStudio.Shell;

    public class MyOptionPage : DialogPage
    {
        public bool MyProperty { get; set; }
    }
}

つぎに、拡張機能でオプションページを使う宣言を追加する
namespace Company.VSPackage7
{
    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio.Shell;
    
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideOptionPage(typeof(MyOptionPage), "MyOption", "General", 0, 0, true)]
    [Guid(GuidList.guidVSPackage7PkgString)]
    public sealed class VSPackage7Package : Package
    {
        public VSPackage7Package()
        {
            Debug.WriteLine( ...
        }

これだけで、オプションページが表示されるようになる。

PropertyGridと同じ属性が使えるようだ
namespace Company.VSPackage7
{
    using System.ComponentModel;
    using Microsoft.VisualStudio.Shell;

    public class MyOptionPage : DialogPage
    {
        [Category("なにか")]
        [DisplayName("なにかのON/OFF")]
        [Description("なにかをON/OFFします。")]
        public bool MyProperty { get; set; }
    }
}


もちろん、親のインスタンスにもアクセスできる
(MyOptionPageのインスタンスは、勝手に作られて勝手に消えるので、アクセス出来ないと困る)
    public class MyOptionPage : DialogPage
    {
        public override void LoadSettingsFromStorage()
        {
            var obj = GetService(typeof(VSPackage7Package)) as VSPackage7Package;
            if (obj != null)
            {
                // 読込処理
            }
            
        }

        public override void SaveSettingsToStorage()
        {
            var obj = GetService(typeof(VSPackage7Package)) as VSPackage7Package;
            if (obj != null)
            {
                // 保存処理
            }
        }

2014年7月3日木曜日

Visual Studio 2013 SDK で拡張機能を作りたい その6

VisualStudioの起動と同時に、インスタンスが生成されるようにしてみた。

    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionHasMultipleProjects_string)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionHasSingleProject_string)]
    [ProvideOptionPage(typeof(Properties), "DteEventView", "General", 0, 0, true)]
    [Guid(GuidList.guidVSPackage5PkgString)]
    public sealed class VSPackage5Package : Package
    {

多少、力技な気がしなくもないが・・・

拡張機能は、基本的には使うとき(呼ばれた時)にインスタンスが生成される。
そうでなければ、VisualStudioの起動が重くなる。
しかしイベントハンドラは、最初に登録しないと、他にやるタイミングがないよな。