2010-03-22 9 views
4

J'écris une extension d'éditeur Visual Studio à l'aide de VS 2010 SDK RC. J'aimerais pouvoir comprendre quelles sont les références du projet actuel. Comment accéder au projet correspondant à l'éditeur actuel?Accès au système de projet à partir d'une extension Visual Studio MEF Editor

Le documentation on editor extensions ne semble pas inclure d'informations sur l'accès aux parties non-éditeur de Visual Studio. J'ai fait quelques recherches et il semblerait que dans VS2008 vous puissiez écrire des compléments qui accèderaient au système de projet, mais j'essaye d'obtenir cette fonctionnalité à partir d'une extension d'éditeur MEF.

Répondre

10

Daniel -

Obtenir de l'éditeur au projet est un processus à plusieurs étapes. D'abord, vous obtenez le nom de fichier du fichier dans l'éditeur, et à partir de là vous pouvez trouver le projet contenant.

En supposant que vous avez un IWPFTextView, vous pouvez obtenir le nom de fichier comme ceci:

public static string GetFilePath(Microsoft.VisualStudio.Text.Editor.IWpfTextView wpfTextView) 
{ 
    Microsoft.VisualStudio.Text.ITextDocument document; 
    if ((wpfTextView == null) || 
      (!wpfTextView.TextDataModel.DocumentBuffer.Properties.TryGetProperty(typeof(Microsoft.VisualStudio.Text.ITextDocument), out document))) 
     return String.Empty; 

    // If we have no document, just ignore it. 
    if ((document == null) || (document.TextBuffer == null)) 
     return String.Empty; 

    return document.FilePath; 
} 

Une fois que vous avez un nom de fichier, vous pouvez l'obtenir est le projet parent comme celui-ci:

using Microsoft.VisualStudio.Shell; 
using Microsoft.VisualStudio.Interop; 

public static Project GetContainingProject(string fileName) 
{ 
    if (!String.IsNullOrEmpty(fileName)) 
    { 
     var dte2 = (DTE2)Package.GetGlobalService(typeof(SDTE)); 
     if (dte2 != null) 
     { 
      var prjItem = dte2.Solution.FindProjectItem(fileName); 
      if (prjItem != null) 
       return prjItem.ContainingProject; 
     } 
    } 
    return null; 
} 

Depuis le projet, vous pouvez accéder au codemodel, et j'assume les références, mais je n'ai pas encore eu besoin de le faire.

Hope this helps ...

~ Cameron

+0

Merci! Pour obtenir les références, vous devez obtenir un objet VSProject. Vous pouvez convertir le Project.Object en un VSProject: if (project.Object est VSProject) {var vsProject = (VSProject) project.Object;/* ... * /} –

+0

Dans le cas où quelqu'un d'autre a du mal à satisfaire les exigences de référence pour ceux-ci: Dans Visual Studio 2015, j'ai dû ajouter une référence à 'Microsoft.VisualStudio.Text.Logic' pour que la recherche de nom de fichier fonctionne ('TextDataModel.DocumentBuffer'). J'ai aussi dû ajouter une référence à 'EnvDTE' et' EnvDTE80' pour que la recherche de projet fonctionne ('DTE2' et' Project'). – Spiralis