Visual Studio 2008 のアドインを作成する。アドインの構成。

VisualStudio2008のアドインは、アドインとIDEとのインタフェースに次の2つのインタフェースを使用します。

  • IDTExtensibility2(IDEとの接続用インタフェース)
  • IDTCommandTarget(コマンドボタンが押された際に通知するインタフェース)

そのため、.Addinファイルで公開したクラスが上記2つのインタフェースを継承する必要があります。

(IDTCommandTargetインタフェースは継承が必須という訳ではありませんが、このインタフェースが無いとコマンドバーのボタンが押したイベントが取得できません。)


Public Class Connect
Implements IDTExtensibility2
Implements IDTCommandTarget

VisualStudioのプロジェクトウイザードで作成すると以下のようなコードが出力されます。

  • IDTExtensibility2インタフェース
  1. OnConnectionメソッド(アドイン接続イベント)
  2. OnDisconnectionメソッド(アドイン切断イベント)
  3. OnAddInsUpdateメソッド(アドイン更新イベント)
  4. OnStartupCompleteメソッド(IDE初期処理完了後のイベント)
  5. OnBeginShutdownメソッド(IDE終了時のイベント)
  • IDTCommandTargetインタフェース
  1. QueryStatusメソッド(コマンドバーボタンが有効化どうかの問い合わせ。使用するボタンは使用できると返す必要がある。)
  2. Execメソッド(コマンドバーボタンが実行された時のイベント)

一般に、IDTExtensibility2インタフェースOnConnectionメソッドでコマンドバーボタンを作成し、IDTCommandTargetインタフェースのExecメソッドで実行する処理を記載します。


Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80

Public Class Connect

Implements IDTExtensibility2
Implements IDTCommandTarget

Dim _applicationObject As DTE2
Dim _addInInstance As AddIn

'''

アドイン オブジェクトのコンストラクタを実装します。初期化コードをこのメソッド内に配置してください。
Public Sub New()

End Sub

'''

IDTExtensibility2 インターフェイスの OnConnection メソッドを実装します。アドインが読み込まれる際に通知を受けます。
'''ホスト アプリケーションのルート オブジェクトです。
'''アドインの読み込み状態を説明します。
'''このアドインを表すオブジェクトです。
'''
Public Sub OnConnection(ByVal application As Object, ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, ByRef custom As Array) Implements IDTExtensibility2.OnConnection

_applicationObject = CType(application, DTE2)
_addInInstance = CType(addInInst, AddIn)

If connectMode = ext_ConnectMode.ext_cm_UISetup Then

Dim commands As Commands2 = CType(_applicationObject.Commands, Commands2)
Dim toolsMenuName As String
Try

'コマンドを別のメニューに移動するには、単語 "Tools" を英語版のメニューに変換してください。
' このコードはカルチャを認識して、メニュー名に追加した後、コマンドをそのメニューに追加します。
' ファイル内にトップレベル メニューの一覧があります。
' CommandBar.resx.
Dim resourceManager As System.Resources.ResourceManager = New System.Resources.ResourceManager("MyAddin1.CommandBar", System.Reflection.Assembly.GetExecutingAssembly())

Dim cultureInfo As System.Globalization.CultureInfo = New System.Globalization.CultureInfo(_applicationObject.LocaleID)
If (cultureInfo.TwoLetterISOLanguageName = "zh") Then
Dim parentCultureInfo As System.Globalization.CultureInfo = cultureInfo.Parent
toolsMenuName = resourceManager.GetString(String.Concat(parentCultureInfo.Name, "Tools"))
Else
toolsMenuName = resourceManager.GetString(String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools"))
End If

Catch e As Exception
'単語 'Tools' の他言語バージョンを検索しましたが、見つかりませんでした。
' 既定は en-US の単語ですが、現在のカルチャでも機能する可能性があります。
toolsMenuName = "Tools"
End Try

'コマンドを [ツール] メニューに配置します。
'メイン メニュー項目のすべてを保持するトップレベル コマンド バーである、MenuBar コマンド バーを検索します:
Dim commandBars As CommandBars = CType(_applicationObject.CommandBars, CommandBars)
Dim menuBarCommandBar As CommandBar = commandBars.Item("MenuBar")

'MenuBar コマンド バーで [ツール] コマンド バーを検索します:
Dim toolsControl As CommandBarControl = menuBarCommandBar.Controls.Item(toolsMenuName)
Dim toolsPopup As CommandBarPopup = CType(toolsControl, CommandBarPopup)

Try
'コマンド コレクションにコマンドを追加します:
Dim command As Command = commands.AddNamedCommand2(_addInInstance, "MyAddin1", "MyAddin1", "Executes the command for MyAddin1", True, 59, Nothing, CType(vsCommandStatus.vsCommandStatusSupported, Integer) + CType(vsCommandStatus.vsCommandStatusEnabled, Integer), vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton)

'MenuBar コマンド バーで適切なコマンド バーを検索します:
command.AddControl(toolsPopup.CommandBar, 1)
Catch argumentException As System.ArgumentException
'同じ名前のコマンドが既に存在しているため、例外が発生した可能性があります。
' その場合、コマンドを再作成する必要はありません。 例外を
' 無視しても安全です。
End Try

End If
End Sub

'''

IDTExtensibility2 インターフェイスの OnDisconnection メソッドを実装します。アドインがアンロードされる際に通知を受けます。
'''アドインのアンロード状態を説明します。
'''ホスト アプリケーション固有のパラメータの配列です。
'''
Public Sub OnDisconnection(ByVal disconnectMode As ext_DisconnectMode, ByRef custom As Array) Implements IDTExtensibility2.OnDisconnection
End Sub

'''

IDTExtensibility2 インターフェイスの OnAddInsUpdate メソッドを実装します。アドインのコレクションが変更されたときに通知を受けます。
'''ホスト アプリケーション固有のパラメータの配列です。
'''
Public Sub OnAddInsUpdate(ByRef custom As Array) Implements IDTExtensibility2.OnAddInsUpdate
End Sub

'''

IDTExtensibility2 インターフェイスの OnStartupComplete メソッドを実装します。ホスト アプリケーションが読み込みを終了したときに通知を受けます。
'''ホスト アプリケーション固有のパラメータの配列です。
'''
Public Sub OnStartupComplete(ByRef custom As Array) Implements IDTExtensibility2.OnStartupComplete
End Sub

'''

IDTExtensibility2 インターフェイスの OnBeginShutdown メソッドを実装します。ホスト アプリケーションがアンロードされる際に通知を受けます。
'''ホスト アプリケーション固有のパラメータの配列です。
'''
Public Sub OnBeginShutdown(ByRef custom As Array) Implements IDTExtensibility2.OnBeginShutdown
End Sub

'''IDTCommandTarget インターフェイスの QueryStatus メソッドを実装します。これは、コマンドの可用性が更新されたときに呼び出されます。
'''状態を決定するためのコマンド名です。
'''コマンドに必要なテキストです。
'''ユーザー インターフェイス内のコマンドの状態です。
'''neededText パラメータから要求されたテキストです。
'''
Public Sub QueryStatus(ByVal commandName As String, ByVal neededText As vsCommandStatusTextWanted, ByRef status As vsCommandStatus, ByRef commandText As Object) Implements IDTCommandTarget.QueryStatus
If neededText = vsCommandStatusTextWanted.vsCommandStatusTextWantedNone Then
If commandName = "MyAddin1.Connect.MyAddin1" Then
status = CType(vsCommandStatus.vsCommandStatusEnabled + vsCommandStatus.vsCommandStatusSupported, vsCommandStatus)
Else
status = vsCommandStatus.vsCommandStatusUnsupported
End If
End If
End Sub

'''

IDTCommandTarget インターフェイスの Exec メソッドを実装します。これは、コマンドが実行されるときに呼び出されます。
'''実行するコマンド名です。
'''コマンドの実行方法を説明します。
'''呼び出し元からコマンド ハンドラへ渡されたパラメータです。
'''コマンド ハンドラから呼び出し元へ渡されたパラメータです。
'''コマンドが処理されたかどうかを呼び出し元に通知します。
'''
Public Sub Exec(ByVal commandName As String, ByVal executeOption As vsCommandExecOption, ByRef varIn As Object, ByRef varOut As Object, ByRef handled As Boolean) Implements IDTCommandTarget.Exec
handled = False
If executeOption = vsCommandExecOption.vsCommandExecOptionDoDefault Then
If commandName = "MyAddin1.Connect.MyAddin1" Then
handled = True
Exit Sub
End If
End If
End Sub
End Class