2010-03-22 25 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