2010-09-24 3 views
4

J'ai une extension Visual Studio 2010, un fichier .vsix. Je peux obtenir l'instance DTE pour mon instance particulière de Visual Studio, que je confirme en imprimant le dte_instance.Solution.Fullname. Mais pour mon instance DTE2, il semble me donner des informations sur la mauvaise instance de Visual Studio.Extension Visual Studio 2010 (.vsix), obtention de l'instance DTE2

Voici le flux de travail: Développement Visual Studio IDE ouvert, code pour l'extension. Lancez le projet, ce qui provoque le lancement d'une nouvelle instance de Visual Studio sur laquelle l'extension est installée. Cliquez sur mon bouton de menu (dans la nouvelle IDE) qui exécute le code suivant:

DTE dte; 
DTE2 dte2, dte2Macros; 
dte = (DTE)GetService(typeof(DTE)); 
dte2 = (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0"); 
dte2Macros = (DTE2)dte2.MacrosIDE; 

//this returns what I expect, the solution name in the newer IDE. 
MessageBox.Show("solution name: " + dte.Solution.FullName); 

//code to get the startup project from MSDN 
//http://msdn.microsoft.com/en-us/library/ms228782.aspx 
SolutionBuild2 sb = (SolutionBuild2)dte2.Solution.SolutionBuild; 
string msg = ""; 
Int32 configs = sb.SolutionConfigurations.Count; 
foreach (String item in (Array)sb.StartupProjects) 
{ 
    msg += item; 
} 

//this returns a project from the development IDE, the one I don't want. 
System.Windows.Forms.MessageBox.Show("startup project is: " + msg); 
Project startupProject = dte2.Solution.Item(msg); 

J'ai trouvé plusieurs références à l'acquisition de l'objet ETTD2 dans un Addin avec la méthode de connexion(), mais je ne pouvais pas trouver un rappel similaire pour les extensions.

La question: Comment obtient-on l'instance DTE2 pour l'EDI dans laquelle s'exécute une extension?

Répondre

11

Essayez this, qui utilise un fournisseur de services importés, ou tout simplement utiliser Package.GetGlobalService:

DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;

+0

Fonctionne parfaitement, merci. – Adam

+0

J'ai exactement le même problème, et j'utilisais exactement la même approche que lui, mais quand j'essaie votre solution, j'ai "Le nom 'Package' n'existe pas dans le contexte actuel". Quel est l'usage correct de celui-ci? – Marcelo

+0

Vous aurez besoin d'une référence à 'Microsoft.VisualStudio.Shell.10.0.dll', et' using' pour 'Microsoft.VisualStudio.Shell'. –

0

J'ai eu le problème que sur certaines machines Package.GetGlobalService(typeof(DTE)) retourné null. Maintenant, j'utilise (DTE2)base.GetService(typeof(DTE)) dans la méthode Initialize() du package (qui est similaire à la méthode connect() d'un complément).