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, и я предполагаю ссылки, но мне не нужно это делать.
Надеется, что это помогает ...
~ Кэмерон
Спасибо! Чтобы получить ссылки, вам нужно получить объект VSProject. Вы можете передать Project.Object в VSProject: if (project.Object - VSProject) {project vsProject = (VSProject) project.Object;/* ... * /} –
В случае, если кто-то еще борется за удовлетворение ссылочных требований для них: В Visual Studio 2015 мне пришлось добавить ссылку на 'Microsoft.VisualStudio.Text.Logic', чтобы сделать работу поиска по имени файла ('TextDataModel.DocumentBuffer'). Мне также пришлось добавить ссылку на 'EnvDTE' и' EnvDTE80', чтобы сделать работу по поиску проекта ('DTE2' и' Project'). – Spiralis