Visual studio 2017 VSIX如何获取当前快照文档名?

Visual studio 2017 VSIX如何获取当前快照文档名?,visual-studio-2017,vsix,Visual Studio 2017,Vsix,我一直在尝试创建一个扩展,在visualstudio的页边空白处突出显示特定的行号 我设法使用预定义的行号在页边空白处进行标记,但为了使其正常工作,我需要知道当前文档的全名(路径和文件名) 在谷歌搜索了很多之后,我发现如何使用示例代码(这并不理想) 现在我知道这里的问题了 是针对具体的文本版本 无法选择哪个实例(当运行多个VS时) 看起来很慢 我有一种感觉,我应该用MEF属性来做这件事,但是MS文档的例子太简单了,它们对我不起作用。我也浏览了一些问题,但我就是无法让它们发挥作用。他们主要谈论

我一直在尝试创建一个扩展,在visualstudio的页边空白处突出显示特定的行号

我设法使用预定义的行号在页边空白处进行标记,但为了使其正常工作,我需要知道当前文档的全名(路径和文件名)

在谷歌搜索了很多之后,我发现如何使用示例代码(这并不理想)

现在我知道这里的问题了

  • 是针对具体的文本版本
  • 无法选择哪个实例(当运行多个VS时)
  • 看起来很慢
我有一种感觉,我应该用MEF属性来做这件事,但是MS文档的例子太简单了,它们对我不起作用。我也浏览了一些问题,但我就是无法让它们发挥作用。他们主要谈论
服务
。。我没有,也不知道如何得到

我的代码的其余部分使用了
SnapshotSpans
,如示例中所示,如果您不需要知道文件名,则扩展名非常有用


我从未做过任何扩展开发。请有人帮我把这件事做好

您可以使用以下代码从快照中获取文件,而无需任何依赖项

    public string GetDocumentPath(Microsoft.VisualStudio.Text.ITextSnapshot ts)
    {
        Microsoft.VisualStudio.Text.ITextDocument textDoc;
        bool rc = ts.TextBuffer.Properties.TryGetProperty(
            typeof(Microsoft.VisualStudio.Text.ITextDocument), out textDoc);
        if (rc && textDoc != null)
            return textDoc.FilePath;
        return null;
    }
如果您不介意将
Microsoft.CodeAnalysis.EditorFeatures.Text
添加到您的项目中,它将为您提供一个扩展方法
Document GetOpenDocumentInCurrentContextWithChanges()
Microsoft.VisualStudio.Text.Snapshot
类上。(加上许多其他基于Rosyln的助手)


谢谢你,Sergey这是你提供的非常宝贵的代码。。我不确定还有哪些地方可以记录?我还发现了另一篇关于使用Rosylyn代码分析软件包的帖子,该软件包为我们分配了扩展,特别是Snapshot.GetOpenDocumentInCurrentContextWithChanges()
提供于Microsoft.CodeAnalysis.EditorFeatures.Text
-我想这将是您刚才提供的软件包中非常相似的代码。希望您不介意我添加了示例,以使您的答案更完整。谢谢+1.
    public string GetDocumentPath(Microsoft.VisualStudio.Text.ITextSnapshot ts)
    {
        Microsoft.VisualStudio.Text.ITextDocument textDoc;
        bool rc = ts.TextBuffer.Properties.TryGetProperty(
            typeof(Microsoft.VisualStudio.Text.ITextDocument), out textDoc);
        if (rc && textDoc != null)
            return textDoc.FilePath;
        return null;
    }
using Microsoft.CodeAnalysis.Text;

Document doc = span.Snapshot.GetOpenDocumentInCurrentContextWithChanges();