FAQ: アドインを VSPackage 拡張に変換する

現在、アドインは推奨されていません。 新しい Visual Studio 拡張機能を作成するには、VSPackage を作成する必要があります。 既にアドインがある場合、アドインを引き続き実行できますが、アドインを配布する場合には VSPackage に変換する必要があります。 Visual Studio アドインを VSPackage 拡張機能に変換する方法についてよくある質問とその回答を以下に示します。

重要

多くの場合、アドイン コードを VSPackage プロジェクトに転送するだけです。Initialize メソッドで GetService を呼び出すことで、DTE オートメーション オブジェクトを取得できます。

DTE2 dte = (DTE2)GetService(typeof(DTE));

詳細については、以下の「VSPackage でアドイン コードを実行できますか?」を参照してください。

VSPackage 拡張機能の開発にはどのようなソフトウェアが必要ですか?

Visual Studio 2013 の Professional、Premium、または Ultimate エディションと Visual Studio 2013 SDK をインストールする必要があります。 SDK は、Microsoft ダウンロード センター Web サイトの Visual Studio 2013 SDK からダウンロードできます。 Visual Studio 2013 更新プログラム 2 をインストールする前に、SDK をインストールしておくことをお勧めします。

VSPackage のドキュメントはどこにありますか?

最初に「拡張 Visual Studio の概要」をお読みください。 VSPackage 開発に関するその他の記事は、このドキュメントの中にまとめられています。

アドイン プロジェクトを VSPackage プロジェクトに変換できますか?

アドイン プロジェクトを VSPackage プロジェクトに変換することはできません。これは、VSPackage プロジェクトで採用されているメカニズムが、アドイン プロジェクトのメカニズムと異なるためです。 VSPackage プロジェクト テンプレートには、容易に起動して VSPackage 拡張機能として実行できるようにする多くのコードが含まれています。

VSPackage 拡張機能の開発を開始するにはどのようにしたらよいですか?

VSPackage 拡張機能のプロジェクト テンプレートには、必要な要素が含まれています。 メニュー コマンドを含む VSPackage を作成する方法を次に示します。

メニュー コマンドを含む VSPackage を作成するには

  1. Visual Studio パッケージ プロジェクトを作成し、TestVSPackage という名前を付けます。 ([ファイル][新規作成][プロジェクト] の順にクリックするか、または [クイック起動] ウィンドウでプロジェクトを入力します)。 [新しいプロジェクト] ダイアログ ボックスで、[その他のプロジェクトの種類][機能拡張] の順に展開し、[Visual Studio パッケージ] をクリックします。 プロジェクトに TestVSPackage という名前を付け、その場所を指定します。

  2. Visual Studio パッケージ ウィザードが表示されます。 ウィザードの [プログラミング言語の選択] ページで、言語として C# を選択します。 [新しいキーの生成] を選択したままにします。 [Visual Studio パッケージのオプションの選択] ページで、[メニュー コマンド] を選択します。 [完了] をクリックします。

  3. F5 キーを押して、プロジェクトをデバッグ モードでビルドおよび実行します。

    Visual Studio の 2 番目のインスタンスが表示されます。 この 2 番目のインスタンスは実験用インスタンスと呼ばれます。コードの記述に使用する Visual Studio のインスタンスとは設定が異なることがあります。 実験用インスタンスを初めて実行するときには、VS Online にサインインしてテーマとプロファイルを指定するよう求められます。

    (実験用インスタンスの) [ツール] メニューに、[My Command name] (マイ コマンド名) という名前のボタンが表示されます。 このボタンを選択すると、**[TestVSPackagePackage.MenuItemCallback() 内]**というメッセージが表示されます。

VSPackage でアドイン コードを実行できますか?

通常、アドイン コードは次の 2 つの方法のどちらかで実行します。

  • メニュー コマンドによるトリガー (コードは IDTCommandTarget.Exec メソッド内にあります)

  • 起動時に自動的に実行 (コードは OnConnection イベント ハンドラー内にあります)。

VSPackage でも同じ操作を実行できます。 コールバック メソッドにアドイン コードを追加する方法を次に示します。

VSPackage にメニュー コマンドを実装するには

  1. メニュー コマンドを含む VSPackage を作成します。 (「VSPackage 拡張機能の開発を開始するにはどのようにしたらよいですか?」を参照。)

  2. VSPackage の定義が含まれているファイルを開きます。 (C# プロジェクトでは、これは <your project name>Package.cs です。)

  3. ファイルに次の using ステートメントを追加します。

    using EnvDTE;
    using EnvDTE80;
    
  4. MenuItemCallback メソッドを見つけます。 DTE2 オブジェクトを取得するため、GetService の呼び出しを追加します。

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. アドインのコードを IDTCommandTarget.Exec メソッドに追加します。 たとえば、新しいペインを [出力] ウィンドウに追加し、そのペインに "Some Text"と出力するコードを次に示します。

    private void MenuItemCallback(object sender, EventArgs e)
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE));
        OutputWindow outputWindow = dte.ToolWindows.OutputWindow;
    
        OutputWindowPane outputWindowPane = outputWindow.OutputWindowPanes.Add("A New Pane");
        outputWindowPane.OutputString("Some Text");
    }
    
  6. このプロジェクトをビルドして実行します。 F5 キーを押すか、[デバッグ] ツールバーの [開始] をクリックします。 Visual Studio の実験用インスタンスで、[ツール] メニューに [My Command name] (マイ コマンド名) という名前のボタンが表示されます。 このボタンを選択すると、[出力] ウィンドウに Some Text が表示されます。 (場合によっては [出力] ウィンドウを開く必要があります。)

起動時にコードを実行することもできます。 ただし、VSPackage 拡張機能では通常、この方法はお勧めできません。 Visual Studio の起動時に読み込まれる拡張機能が多すぎると、起動にかかる時間がかなり長くなることがあります。 何らかの条件 (ソリューションが開いているなど) に一致した場合にのみ VSPackage を自動的に読み込むようにしておくことをお勧めします。

この手順では、ソリューションが開いているときに自動的に読み込まれる VSPackage のアドイン コードを実行する方法を示します。

VSPackage を自動読み込みさせるには

  1. Visual Studio Packageプロジェクトを作成します。 実行手順については、「VSPackage 拡張機能の開発を開始するにはどのようにしたらよいですか?」を参照してください。 プロジェクトに TestAutoload という名前を付け、その場所を指定します。

  2. Visual Studio パッケージ ウィザードが表示されます。 ウィザードの [プログラミング言語の選択] ページで、言語として C# を選択します。[新しいキーの生成] はオンのままにします。 [完了] をクリックします。

  3. TestAutoloadPackage.cs を開きます。 パッケージ クラスが宣言されている行を見つけます。

    public sealed class <name of your package>Package : Package
    
  4. この行の上に、一連の属性が記述されています。 次の属性を追加します。

    [ProvideAutoLoad(UIContextGuids80.SolutionExists)]
    
  5. Initialize() メソッド内にブレークポイントを設定し、デバッグを開始します (F5)。

  6. この実験用インスタンスで、プロジェクトを開きます。 VSPackage が読み込まれ、ブレークポイントにヒットします。

UIContextGuids80 のフィールドを使用して、VSPackage を読み込む他のコンテキストを指定できます。 詳細については、「方法 : 自動ロード VSPackage」を参照してください。

DTE オブジェクトは入手するにはどうしたらよいですか?

アドインが UI (メニュー コマンド、ツールバー ボタン、ツール ウィンドウなど) を表示しない場合、VSPackage から DTE オートメーション オブジェクトを入手できる限り、コードを変更せずにそのまま使用できます。 次の手順に従います。

VSPackage から DTE オブジェクトを取得するには

  1. VSPackage ソリューションで、<project name>Package.cs ファイルを検索します。 これは Package から派生するクラスで、Visual Studio の操作に役立ちます。 この場合、GetService を使用して DTE2 オブジェクトを取得します。

  2. 次の using ステートメントを追加します。

    using EnvDTE;
    using EnvDTE80;
    
  3. Initialize メソッドを見つけます。 このメソッドは、パッケージ ウィザードで指定したコマンドを処理します。 DTE オブジェクトを取得するため、GetService の呼び出しを追加します。

    DTE dte = (DTE)GetService(typeof(DTE));
    

DTE オートメーション オブジェクトを取得したら、プロジェクトに残りのアドイン コードを追加できます。 DTE2 オブジェクトが必要な場合は、同じ操作を実行できます。

アドインのメニュー コマンドとツールバー ボタンを VSPackage スタイルで変更するにはどうしたらよいですか?

VSPackage 拡張機能は、ほとんどのメニュー コマンド、ツールバー、ツールバー ボタン、その他の UI を作成するときに .vsct ファイルを使用します。 VSPackage プロジェクト テンプレートを使用すると、[ツール] メニューのコマンドを作成できます。 詳細については、「チュートリアル : メニュー コマンドを Visual Studio パッケージのインポート テンプレートを使用して作成します。」を参照してください。

.vsct ファイルの詳細については、「IDE に VSPackage 追加のユーザー インターフェイス要素に示します。」を参照してください。 .vsct ファイルを使用してメニュー項目、ツールバー、およびツールバー ボタンを追加する方法を説明するチュートリアルについては、「コマンドは、メニューとツール バーのチュートリアル」を参照してください。

VSPackage を使用してカスタム ツールウィンドウを追加するにはどうしたらよいですか?

VSPackage プロジェクト テンプレートを使用すると、ツール ウィンドウを作成できます。 詳細については、「ツール ウィンドウ」およびその中の記事、特に「方法: ツール ウィンドウを作成する」を参照してください。

VSPackage を使用して Visual Studio ウィンドウを管理するにはどうしたらよいですか?

Visual Studio ウィンドウを管理するアドインの場合、そのアドイン コードは VSPackage で機能します。 たとえば、[タスク一覧] を管理するコードを VSPackage の MenuItemCallback メソッドに追加する手順を次に示します。

アドインのウィンドウ管理コードを VSPackage に挿入するには

  1. VSPackage 拡張機能の開発を開始するにはどのようにしたらよいですか?」セクションに従って、メニュー コマンドがある VSPackage を作成します。

  2. VSPackage の定義が含まれているファイルを開きます。 (C# プロジェクトでは、これは <your project name>Package.cs です。)

  3. 次の using ステートメントを追加します。

    using EnvDTE;
    using EnvDTE80;
    
  4. MenuItemCallback メソッドを見つけます。 DTE2 オブジェクトを取得するため、GetService の呼び出しを追加します。

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. アドインのコードを追加します。 たとえば、[タスク一覧] に新しいタスクを追加して、タスク数をリストし、次に 1 つのタスクを削除するコードを以下に示します。

    private void MenuItemCallback(object sender, EventArgs e) 
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE)); 
    
        TaskList tl = (TaskList)dte.ToolWindows.TaskList; 
        askItem tlItem; 
    
        // Add a couple of tasks to the Task List. 
        tlItem = tl.TaskItems.Add(" ", " ", "Test task 1.",  
            vsTaskPriority.vsTaskPriorityHigh, vsTaskIcon.vsTaskIconUser, 
            true, "", 10, true, true);
        tlItem = tl.TaskItems.Add(" ", " ", "Test task 2.", 
            vsTaskPriority.vsTaskPriorityLow, vsTaskIcon.vsTaskIconComment, true, "", 20, true,true);
    
        // List the total number of task list items after adding the new task items.
        System.Windows.Forms.MessageBox.Show("Task Item 1 description: "+tl.TaskItems.Item(2).Description);
        System.Windows.Forms.MessageBox.Show("Total number of task items: "+tl.TaskItems.Count); 
    
        // Remove the second task item. The items list in reverse numeric order. 
        System.Windows.Forms.MessageBox.Show("Deleting the second task item");
        tl.TaskItems.Item(2).Delete();
        System.Windows.Forms.MessageBox.Show("Total number of task items: "+tl.TaskItems.Count); 
    }
    

VSPackage でプロジェクトとソリューションを管理するにはどうしたらよいですか?

プロジェクトとソリューションを管理するアドインの場合、そのアドイン コードは VSPackage で機能します。 たとえば、スタートアップ プロジェクトを取得するコードを追加する手順を次に示します。

  1. VSPackage 拡張機能の開発を開始するにはどのようにしたらよいですか?」セクションに従って、メニュー コマンドがある VSPackage を作成します。

  2. VSPackage の定義が含まれているファイルを開きます。 (C# プロジェクトでは、これは <your project name>Package.cs です。)

  3. 次の using ステートメントを追加します。

    using EnvDTE;
    using EnvDTE80;
    
  4. MenuItemCallback メソッドを見つけます。 DTE2 オブジェクトを取得するため、GetService の呼び出しを追加します。

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. アドインのコードを追加します。 たとえば、次のコードはソリューション内のスタートアップ プロジェクトの名前を取得します。 (このパッケージを実行するときには、マルチプロジェクト ソリューションが開いている必要があります。)

    private void MenuItemCallback(object sender, EventArgs e)
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE)); 
    
        SolutionBuild2 sb = (SolutionBuild2)dte.Solution.SolutionBuild; 
        Project startupProj; 
        string msg = "";
    
        foreach (String item in (Array)sb.StartupProjects) 
        {
            msg += item; 
        }
        System.Windows.Forms.MessageBox.Show("Solution startup Project: "+msg); 
        startupProj = dte.Solution.Item(msg); 
        System.Windows.Forms.MessageBox.Show("Full name of solution's startup project: "+"/n"+startupProj.FullName); 
    }
    

VSPackage でキーボード ショートカットを設定するにはどうしたらよいですか?

.vsct ファイルの <KeyBindings> 要素を使用します。 次の例では、idCommand1 コマンドのキーボード ショートカットは Alt+A、idCommand2 コマンドのキーボード ショートカットは Alt+Ctrl+A です。 キー名の構文に注意してください。

<KeyBindings>
    <KeyBinding guid="MyProjectCmdSet" id="idCommand1" editor="guidVSStd97" key1="A" mod1="ALT" />
    <KeyBinding guid="MyProjectCmdSet" id="idCommand2" editor="guidVSStd97" key1="A" mod1="CONTROL" mod2="ALT" />
</KeyBindings>

VSPackage でオートメーション イベントを処理するにはどうしたらよいですか?

VSPackage では、アドインと同様の方法でオートメーション イベントを処理します。 OnItemRenamed イベントを処理する方法を次のコードに示します。 (この例は、DTE オブジェクトを既に取得していることを前提としています。)

Events2 dteEvents = (Events2)dte.Events;
dteEvents.ProjectItemsEvents.ItemRenamed += listener1.OnItemRenamed; 
. . .
public void OnItemRenamed(EnvDTE.ProjectItem projItem, string oldName) 
{
    string s = "[Event] Renamed " + oldName + " to " + Path.GetFileName(projItem.get_FileNames(1) + " in project " + projItem.ContainingProject.Name; 
}