2010-03-22 3 views
4

Я пишу расширение редактора Visual Studio с помощью VS 2010 SDK RC. Я хотел бы узнать, что такое ссылки на текущий проект. Как получить доступ к проекту, соответствующему текущему редактору?Доступ к системе проекта с расширением редактора Visual Studio MEF

documentation on editor extensions, похоже, не содержит информации о том, как получить доступ к незаменимым частям Visual Studio. Я сделал некоторые поиски, и похоже, что в VS2008 вы могли писать надстройки, которые могли бы получить доступ к системе проекта, но я пытаюсь получить эту функциональность из расширения редактора MEF.

ответ

10

Daniel -

Получение из редактора проекта является многостадийным процессом. Сначала вы получите имя файла в редакторе, и оттуда вы можете найти содержащийся проект.

Предполагая, что у вас есть IWPFTextView, вы можете получить имя файла, как это:

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

После того, как вы получили имя файла, вы можете получить его родительский проект так:

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

Из проекта вы можете добраться до codemodel, и я предполагаю ссылки, но мне не нужно это делать.

Надеется, что это помогает ...

~ Кэмерон

+0

Спасибо! Чтобы получить ссылки, вам нужно получить объект VSProject. Вы можете передать Project.Object в VSProject: if (project.Object - VSProject) {project vsProject = (VSProject) project.Object;/* ... * /} –

+0

В случае, если кто-то еще борется за удовлетворение ссылочных требований для них: В Visual Studio 2015 мне пришлось добавить ссылку на 'Microsoft.VisualStudio.Text.Logic', чтобы сделать работу поиска по имени файла ('TextDataModel.DocumentBuffer'). Мне также пришлось добавить ссылку на 'EnvDTE' и' EnvDTE80', чтобы сделать работу по поиску проекта ('DTE2' и' Project'). – Spiralis

 Смежные вопросы

  • Нет связанных вопросов^_^