.net 从Visual Studio MEF编辑器扩展访问项目系统

.net 从Visual Studio MEF编辑器扩展访问项目系统,.net,visual-studio,mef,vsx,.net,Visual Studio,Mef,Vsx,我正在使用VS2010 SDK RC编写Visual Studio编辑器扩展。我想弄清楚当前项目的参考资料是什么。如何访问与当前编辑器对应的项目 中似乎没有包含有关如何访问VisualStudio的非编辑器部分的信息。我做了一些搜索,看起来在VS2008中,您可以编写访问项目系统的加载项,但我正在尝试从MEF编辑器扩展中获取此功能。Daniel-- 从编辑器到项目是一个多步骤的过程。首先,在编辑器中获取文件的文件名,然后从中可以找到包含该文件的项目 假设您有一个IWPFTextView,您可以得

我正在使用VS2010 SDK RC编写Visual Studio编辑器扩展。我想弄清楚当前项目的参考资料是什么。如何访问与当前编辑器对应的项目

中似乎没有包含有关如何访问VisualStudio的非编辑器部分的信息。我做了一些搜索,看起来在VS2008中,您可以编写访问项目系统的加载项,但我正在尝试从MEF编辑器扩展中获取此功能。

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;
}
从项目中,你可以得到代码模型,我假设引用,但我还不需要这样做

希望这有助于


~Cameron

谢谢!要获取引用,需要获取VSProject对象。您可以将Project.Object强制转换为VSProject:if(Project.Object是VSProject){var VSProject=(VSProject)Project.Object;/*…*/}如果其他人难以满足这些文件的引用要求:在Visual Studio 2015中,我必须添加对Microsoft.VisualStudio.Text.Logic的引用,以使文件名查找工作正常(
TextDataModel.DocumentBuffer
)。我还必须添加对
EnvDTE
EnvDTE80
的引用,以使项目查找工作正常(
DTE2
project
)。