2012-07-29 1 views
0

quand je fais:Fixation aux instances spécifiques de l'IDE

// Get an instance of the currently running Visual Studio IDE. 
EnvDTE80.DTE2 dte2; 
dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. 
GetActiveObject("VisualStudio.DTE.10.0"); 

var solution = dte2.Solution; // get solution 

Console.WriteLine(solution.FullName); // prints the name of the solution where this code is written 

Je suis en mesure d'obtenir une instance de l'ide actuelle

Je voudrais obtenir une référence à ETTD2 de une instance différente de studio visuel si. This link indique qu'il est possible de le faire. En conséquence, j'ai essayé quelque chose comme:

Process p = new Process(); 
    ProcessStartInfo ps = new ProcessStartInfo(@"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe"); 
    p.StartInfo = ps; 
    p.Start(); // start a new instance of visual studio 

    var ROT = "!VisualStudio.DTE.10.0:" + p.Id; 

    // Get an instance of the NEW instance of Visual Studio IDE. 
    EnvDTE80.DTE2 dte2; 
    dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. 
    GetActiveObject(ROT); 

Si je tente que je reçois l'exception:

chaîne de classe non valide (Exception de HRESULT: 0x800401F3 (CO_E_CLASSSTRING))

Il y a plus de liens qui montrent comment faire ce que je cherche mais pour une raison quelconque je ne peux pas le faire fonctionner. Voici quelques-unes des liens:

http://msdn.microsoft.com/en-us/library/6cefss65.aspx

http://msdn.microsoft.com/en-us/library/ms228755.aspx

+0

Quelqu'un at-il remarqué à quel point « GetActiveObject » ne revient pas toujours instance actuelle de VS mais plutôt l'instance, en dehors de l'ensemble actuel d'instances ouvertes, qui a été ouverte en premier. –

Répondre

3

Une chose qui a fonctionné pour moi est toujours

var dte = GetDTE(); 
var debugger = dte.Debugger; 
var processes = debugger.LocalProcesses; 
int processIdToAttach; //your process id of second visual studio 
foreach (var p in processes) 
{ 
    EnvDTE90.Process3 process3 = (EnvDTE90.Process3)p; 
    if (process3.ProcessID == processIdToAttach) 
    { 
     if (!process3.IsBeingDebugged) 
     { 
      if (doMixedModeDebugging) 
      { 
       string[] arr = new string[] { "Managed", "Native" }; 
       process3.Attach2(arr); 
      } 
      else 
      { 
       process3.Attach(); 
      } 
     } 
     break; 
    } 
} 
+0

Belle solution qui ne nécessite pas d'invocation. – Will

Questions connexes