Доступ к системе проектов из расширения редактора MEF Visual Studio

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

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


person Daniel Plaisted    schedule 22.03.2010    source источник


Ответы (1)


Даниэль --

Переход от редактора к проекту — это многоэтапный процесс. Во-первых, вы получаете имя файла в редакторе, а оттуда можете найти содержащий его проект.

Предполагая, что у вас есть 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;
}

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

Надеюсь это поможет...

~ Кэмерон

person Cameron Peters    schedule 22.03.2010
comment
Спасибо! Чтобы получить ссылки, вам нужно получить объект VSProject. Вы можете привести Project.Object к VSProject: if (project.Object is VSProject) { var vsProject = (VSProject)project.Object; /* ... */ } - person Daniel Plaisted; 24.03.2010
comment
На случай, если кто-то еще борется за выполнение требований к ссылкам для них: в Visual Studio 2015 мне пришлось добавить ссылку на Microsoft.VisualStudio.Text.Logic, чтобы поиск имени файла работал (TextDataModel.DocumentBuffer). Мне также пришлось добавить ссылку на EnvDTE и EnvDTE80, чтобы поиск проекта работал (DTE2 и Project). - person Spiralis; 03.09.2015