Comment : créer une autre instance de Visual Studio et s'y attacher

Mise à jour : novembre 2007

Il peut parfois être utile de créer par programme une instance de Visual Studio ou un d'effectuer un attachement à une instance spécifique de Visual Studio qui est déjà en cours d'exécution. Si deux instances de Visual Studio sont exécutées sur un système et si la même solution est ouverte pour les deux (par exemple, une instance génère une solution tandis que l'autre débogue une génération), vous pouvez programmer votre complément de sorte qu'il différencie les deux.

Vous pouvez, par exemple, effectuer les opérations suivantes :

  • démarrer une instance de Visual Studio basée sur un chemin d'accès à un fichier ou à une solution ;

  • effectuer un attachement à une instance de Visual Studio basée sur un chemin d'accès à un fichier ou à une solution ;

  • charger un fichier ou une solution dans une instance existante de Visual Studio ;

  • créer une instance de Visual Studio qui s'arrête dans les conditions suivantes :

    • le compte de références externes à la fois sur l'objet DTE et sur l'objet Solution est de 0.

      – et –

    • l'environnement de développement intégré (IDE) n'est pas présenté à l'utilisateur ou n'est pas sous son contrôle.

  • créer une instance de Visual Studio qui reste chargée même dans les conditions suivantes :

    • le compte de références externes à la fois sur l'objet DTE et sur l'objet Solution est de 0.

    • L'IDE est présenté à l'utilisateur.

      – et –

    • L'IDE est sous contrôle de l'utilisateur.

Les objets retournés peuvent être castés en leurs objets respectifs, tels que DTE2 et Solution2.

Remarque :

Selon vos paramètres actifs ou votre édition, les boîtes de dialogue et les commandes de menu que vous voyez peuvent différer de celles qui sont décrites dans l'aide. Ces procédures ont été développées avec les paramètres de développement généraux actifs. Pour modifier vos paramètres, sélectionnez Importer et ExporterParamètres dans le menu Outils. Pour plus d'informations, consultez Paramètres Visual Studio.

Exemple

Pour créer une instance de Visual Studio, utilisez la fonction CreateObject (voir CreateObject, fonction (Visual Basic)) ou System.Activator.CreateInstance. Lorsque vous utilisez la fonction CreateObject dans Visual Basic, vous pouvez passer des valeurs de "VisualStudio.DTE.8.0" ou de "VisualStudio.Solution.8.0." Les exemples ci-après illustrent ces trois méthodes.

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

Dans l'exemple Visual Basic, les deux instructions créent une instance de l'IDE Visual Studio. La première instruction crée une instance directement, tandis que la seconde crée une instance en créant une nouvelle solution.

Pour établir une référence à une instance existante de l'IDE Visual Studio, vous pouvez utiliser la fonction GetObject (voir GetObject, fonction (Visual Basic)). Vous pouvez utiliser l'une ou l'autre de ces deux instructions :

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

Voir aussi

Concepts

Inscription d'un complément

Autres ressources

Création de compléments et d'Assistants