Gewusst wie: Erstellen einer Instanz und Anfügen an eine andere Instanz von Visual Studio
In einigen Fällen bietet sich das programmgesteuerte Erstellen einer neuen Instanz von Visual Studio oder das Anfügen an eine bestimmte Instanz von Visual Studio an, die bereits ausgeführt wird. Wenn auf einem System zwei Instanzen von Visual Studio ausgeführt werden und die gleiche Projektmappe geöffnet ist (eine Instanz führt beispielsweise einen Projektmappenbuild und die andere einen Debugbuild durch), können Sie das Add-In so programmieren, dass eine Unterscheidung der Instanzen möglich ist.
Sie haben z. B. folgende Möglichkeiten:
Starten einer Instanz von Visual Studio basierend auf einem Pfad zu einer Datei oder einer Projektmappe.
Anfügen an eine Instanz von Visual Studio basierend auf einem Pfad zu einer Datei oder einer Projektmappe.
Laden einer Datei oder Projektmappe in eine vorhandene Instanz von Visual Studio.
Erstellen einer neuen Instanz von Visual Studio, wobei die Instanz in den folgenden Fällen heruntergefahren wird:
Erstellen einer neuen Instanz von Visual Studio, in der die Instanz auch in den folgenden Fällen nicht heruntergefahren wird:
Die zurückgegebenen Objekte können in ihre jeweiligen Objekte umgewandelt werden, z. B. DTE2 und Solution2.
Tipp
Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Bei der Entwicklung dieser Verfahren war die Option Allgemeine Entwicklungseinstellungen aktiviert. Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.
Beispiel
Um eine neue Instanz von Visual Studio zu erstellen, verwenden Sie entweder CreateObject Function (Visual Basic) oder System.Activator.CreateInstance. Beim Verwenden der CreateObject-Funktion in Visual Basic können Sie Werte vom Typ "VisualStudio.DTE.10.0." übergeben. Dies ist in den Beispielen unten veranschaulicht.
' 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;
}
Im Visual Basic-Beispiel erstellen beide Anweisungen eine neue Instanz der IDE von Visual Studio. Die erste Anweisung erstellt direkt eine neue Instanz. Die zweite Anweisung hingegen erstellt eine neue Instanz durch Erstellen einer neuen Projektmappe.
Um einen Verweis auf eine vorhandene Instanz der Visual Studio-IDE abzurufen, können Sie die GetObject Function (Visual Basic) verwenden. Es stehen Ihnen folgende Möglichkeiten zur Verfügung:
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")