2010-03-22 19 views
4

我正在使用VS 2010 SDK RC编写Visual Studio编辑器扩展。我希望能够弄清楚当前项目的参考内容。我如何访问与当前编辑器相对应的项目?从Visual Studio MEF Editor扩展访问项目系统

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

从项目你可以得到的代码模型,我假设的参考,但我不需要那样做。

希望这有助于...

〜卡梅伦

+0

谢谢!要获取参考,您需要获取VSProject对象。您可以将Project.Object强制转换为VSProject:if(project.Object is VSProject){var vsProject =(VSProject)project.Object;/* ... * /} –

+0

如果有人为满足这些参考需求而奋斗: 在Visual Studio 2015中,我不得不添加一个对'Microsoft.VisualStudio.Text.Logic'的引用来使文件名查找工作( 'TextDataModel.DocumentBuffer')。 我还必须添加一个对'EnvDTE'和'EnvDTE80'的引用来使项目查找工作('DTE2'和'Project')。 – Spiralis