方法 : Visual Studio の別のインスタンスを作成してアタッチする
Visual Studio の新しいインスタンスをプログラムで作成したり、既に実行されている Visual Studio の特定のインスタンスにアタッチしたりすると便利な場合があります。同じシステムで実行されている Visual Studio の 2 つのインスタンスで同じソリューションを開く場合 (一方のインスタンスがソリューション ビルドを実行しているときにもう一方がデバッグ ビルドを実行する場合など)、2 つのインスタンスを区別するようにアドインをプログラミングできます。
たとえば、次の操作を実行できます。
ファイルまたはソリューションへのパスに基づいて Visual Studio のインスタンスを起動します。
ファイルまたはソリューションへのパスに基づいて Visual Studio のインスタンスにアタッチします。
Visual Studio の既存のインスタンスにファイルまたはソリューションを読み込みます。
次の場合にシャットダウンする、Visual Studio の新しいインスタンスを作成します。
次の場合でもインスタンスが読み込まれたままになる、Visual Studio の新しいインスタンスを作成します。
返されたオブジェクトは、DTE2 や Solution2 など、個別のオブジェクトにキャストできます。
[!メモ]
実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。
使用例
Visual Studio の新しいインスタンスを作成するには、CreateObject Function または System.Activator.CreateInstance を使用します。Visual Basic の CreateObject 関数を使用すると、"VisualStudio.DTE.10.0." の値を渡すことができます。次の例では、これらの方法を使用します。
' CreateObject method 1 - VisualStudio.DTE.10.0.
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 = "VBTestAddin.Connect.VBTestAddin" Then
CreateNewInstance1(_applicationObject)
handled = True
Exit Sub
End If
End If
End Sub
Private Sub CreateNewInstance1(ByVal dte As DTE2)
Dim inst As Object
Dim dte80Obj As EnvDTE80.DTE2
inst = Microsoft.VisualBasic.Interaction. _
CreateObject("VisualStudio.DTE.10.0", "")
dte80Obj = CType(inst, EnvDTE80.DTE2)
MsgBox(dte80Obj.DisplayMode.ToString)
End Sub
' GetTypeFromProgID and CreateInstance method.
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 = "VBTestAddin.Connect.VBTestAddin" Then
CreateNewInstance2(_applicationObject)
handled = True
Exit Sub
End If
End If
End Sub
Private Sub CreateNewInstance2(ByVal dte As DTE2)
Dim Type As System.Type
Dim inst As Object
Dim dte80Obj As EnvDTE80.DTE2
Type = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0")
inst = System.Activator.CreateInstance(Type, True)
dte80Obj = CType(inst, EnvDTE80.DTE2)
MsgBox(dte80Obj.DisplayMode.ToString)
End Sub
public void OnConnection(object application, ext_ConnectMode
connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
CreateNewInstance2(_applicationObject);
}
private void CreateNewInstance2(DTE2 dte)
{
System.Type Type;
object inst;
EnvDTE80.DTE2 dte80Obj;
Type = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
inst = System.Activator.CreateInstance(Type, true);
dte80Obj = (EnvDTE80.DTE2)inst;
System.Windows.Forms.MessageBox.Show
(dte80Obj.DisplayMode.ToString());
}
// Create a new instance of Visual Studio by using
// GetTypeFromProgID and CreateInstance.
private void CreateNewInstance1()
{
System.Type type = System.Type.GetTypeFromProgID
("VisualStudio.DTE.10.0");
Object obj = System.Activator.CreateInstance(type, true);
EnvDTE80.DTE2 dte8Obj = (EnvDTE80.DTE2)obj;
}
Visual Basic の例では、2 つのステートメントによって Visual Studio IDE の新しいインスタンスが作成されます。最初のステートメントでは、新しいインスタンスが直接作成されますが、2 番目のステートメントでは、新しいソリューションを作成することによって新しいインスタンスが作成されます。
Visual Studio IDE の既存のインスタンスへの参照を取得するには、GetObject Function を使用します。以下の方法があります。
Private Sub GetInstance1 ()
Dim inst As Object
Dim dte80Obj As EnvDTE80.DTE2
inst = Microsoft.VisualBasic.Interaction.GetObject(, _
"VisualStudio.DTE.10.0")
dte80Obj = CType(inst, EnvDTE80.DTE2)
MsgBox(dte80Obj.DisplayMode.ToString)
End Sub
' -or-
Dim inst As Object
inst = Microsoft.VisualBasic.Interaction.GetObject(, _
"VisualStudio.Solution.8.0")
' ---------------------------
' -or-
' Change the path to your application.
Dim inst As Object
inst = Microsoft.VisualBasic.Interaction.GetObject _
("C:\Projects\WindowsApplication1\WindowsApplication1.sln")
' ---------------------------
' -or-
' Change the path to your application.
Dim inst As Object
inst = Microsoft.VisualBasic.Interaction.GetObject _
("C:\Projects\WindowsApplication1\WindowsApplication1.sln", _
"VisualStudio.Solution.8.0")