Procedura: creare e collegarsi a un'altra istanza di Visual Studio

Aggiornamento: novembre 2007

In alcuni casi è utile creare a livello di codice una nuova istanza di Visual Studio o collegarsi a un'istanza specifica di Visual Studio già in esecuzione. Se in un sistema sono in esecuzione due istanze di Visual Studio con la stessa soluzione aperta, ad esempio in un'istanza è in corso la compilazione di una soluzione e nell'altra è in corso una build di debug, è possibile programmare il componente aggiuntivo in modo da differenziarle.

È ad esempio possibile:

  • Avviare un'istanza di Visual Studio in base a un percorso di un file o di una soluzione.

  • Collegarsi a un'istanza di Visual Studio in base a un percorso di un file o di una soluzione.

  • Caricare un file o una soluzione in un'istanza esistente di Visual Studio.

  • Creare una nuova istanza di Visual Studio in cui l'istanza viene chiusa quando:

    • Il conteggio dei riferimenti esterni sull'oggetto DTE e sull'oggetto Solution è pari a zero.

      - e -

    • L'ambiente di sviluppo integrato (IDE, Integrated Development Environment) non viene visualizzato oppure non è sotto il controllo dell'utente.

  • Creare una nuova istanza di Visual Studio in cui l'istanza rimane caricata anche quando:

    • Il conteggio dei riferimenti esterni sull'oggetto DTE e sull'oggetto Solution è pari a zero.

    • L'IDE viene visualizzato all'utente.

      - e -

    • L'IDE è sotto il controllo dell'utente.

È possibile eseguire il cast degli oggetti restituiti sui rispettivi oggetti, ad esempio DTE2 e Solution2.

Nota:

Le finestre di dialogo e i comandi di menu visualizzati potrebbero non corrispondere a quelli descritti nella Guida in linea in quanto dipendono dall'edizione o dalle impostazioni attive. Queste routine sono state sviluppate con le Impostazioni generali per lo sviluppo attive. Per modificare le impostazioni, scegliere Importa/EsportaImpostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Impostazioni di Visual Studio.

Esempio

Per creare una nuova istanza di Visual Studio, utilizzare Funzione CreateObject (Visual Basic) oppure System.Activator.CreateInstance. Quando si utilizza la funzione CreateObject in Visual Basic, è possibile passare valori di "VisualStudio.DTE.8.0" o "VisualStudio.Solution.8.0." . Negli esempi riportati di seguito vengono illustrati questi tre metodi.

' 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;
}

Nell'esempio relativo a Visual Basic entrambe le istruzioni creano una nuova istanza dell'IDE di Visual Studio. La prima istruzione crea direttamente una nuova istanza, mentre la seconda crea una nuova istanza creando una nuova soluzione.

Per ottenere un riferimento a un'istanza esistente dell'IDE di Visual Studio, è possibile utilizzare Funzione GetObject (Visual Basic). È possibile eseguire una delle seguenti operazioni:

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")

Vedere anche

Concetti

Registrazione di un componente aggiuntivo

Altre risorse

Creazione di componenti aggiuntivi e di procedure guidate