次の方法で共有


方法 : Visual Studio の別のインスタンスを作成してアタッチする

更新 : 2007 年 11 月

Visual Studio の新しいインスタンスをプログラムで作成したり、既に実行されている Visual Studio の特定のインスタンスにアタッチしたりすると便利な場合があります。同じシステムで実行されている Visual Studio の 2 つのインスタンスで同じソリューションを開く場合 (一方のインスタンスがソリューション ビルドを実行しているときにもう一方がデバッグ ビルドを実行する場合など)、2 つのインスタンスを区別するようにアドインをプログラミングできます。

たとえば、次の操作を実行できます。

  • ファイルまたはソリューションへのパスに基づいて Visual Studio のインスタンスを起動します。

  • ファイルまたはソリューションへのパスに基づいて Visual Studio のインスタンスにアタッチします。

  • Visual Studio の既存のインスタンスにファイルまたはソリューションを読み込みます。

  • 次の場合にシャットダウンする、Visual Studio の新しいインスタンスを作成します。

    • DTE オブジェクトおよび Solution オブジェクトの両方で数えられる外部参照が 0 の場合。

      および

    • 統合開発環境 (IDE: Integrated Development Environment) がユーザーに表示されていないか、ユーザーに制御されていない場合。

  • 次の場合でもインスタンスが読み込まれたままになる、Visual Studio の新しいインスタンスを作成します。

    • DTE オブジェクトおよび Solution オブジェクトの両方で数えられる外部参照が 0 の場合。

    • IDE がユーザーに表示される場合。

      および

    • IDE がユーザーに制御されている場合。

返されたオブジェクトは、DTE2Solution2 など、個別のオブジェクトにキャストできます。

6cefss65.alert_note(ja-jp,VS.90).gifメモ :

使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。

使用例

Visual Studio の新しいインスタンスを作成するには、CreateObject 関数 (Visual Basic) または System.Activator.CreateInstance を使用します。Visual Basic の CreateObject 関数を使用すると、"VisualStudio.DTE.8.0" または "VisualStudio.Solution.8.0." の値を渡すことができます。次の例では、これら 3 つの方法を使用します。

' CreateObject method 1 - VisualStudio.DTE.8.0.
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)
    CreateNewInstance1(_applicationObject)
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.8.0", "")
    dte80Obj = CType(inst, EnvDTE80.DTE2)
    MsgBox(dte80Obj.DisplayMode.ToString)
End Sub
' CreateObject method 2 - VisualStudio.Solution.8.0.
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)
    CreateNewInstance2(_applicationObject)
End Sub

Private Sub CreateNewInstance2(ByVal dte As DTE2)
    Dim inst As Object
    Dim dte80Obj As EnvDTE80.DTE2
    inst = Microsoft.VisualBasic.Interaction. _
    CreateObject("VisualStudio.Solution.8.0", "")
    dte80Obj = CType(inst, EnvDTE80.DTE2)
    MsgBox(dte80Obj.DisplayMode.ToString)
End Sub
' GetTypeFromProgID and CreateInstance method.
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)
    CreateNewInstance3(_applicationObject)
End Sub

Private Sub CreateNewInstance3(ByVal dte As DTE2)
    Dim Type As System.Type
    Dim inst As Object
    Dim dte80Obj As EnvDTE80.DTE2
    Type = System.Type.GetTypeFromProgID("VisualStudio.DTE.8.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;
    CreateNewInstance3(_applicationObject);
}

private void CreateNewInstance3(DTE2 dte)
{
    System.Type Type;
    object inst;
    EnvDTE80.DTE2 dte80Obj;
    Type = System.Type.GetTypeFromProgID("VisualStudio.DTE.8.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.8.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 関数 (Visual Basic) を使用します。以下の方法があります。

Private Sub GetInstance1 ()
    Dim inst As Object
    Dim dte80Obj As EnvDTE80.DTE2
    inst = Microsoft.VisualBasic.Interaction.GetObject(, _
    "VisualStudio.DTE.8.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")

参照

概念

アドインの登録

その他の技術情報

アドインおよびウィザードの作成