VSIX如何获取当前的快照文档名称?

时间:2018-10-01 14:53:53

标签: visual-studio-2017 vsix

我一直试图创建一个扩展名,该扩展名在Visual Studio中为我突出显示特定行号。

我希望使用预定义的行号在边距处打标记,但要使其正常工作,我需要知道当前文档的FullName是什么(路径和文件名)

经过大量的搜索之后,我想出了如何使用示例代码来完成此操作(这并不理想)

DTE2 dte = (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.15.0");

var activeDocument = dte.ActiveDocument;

var docName = activeDocument.Name;
var docFullName = activeDocument.FullName;

现在我知道了这里的问题

  • 是基于文本的特定版本
  • 无法选择哪个实例(运行多个VS时)
  • 这似乎很慢

我觉得我应该使用MEF属性来执行此操作,但是MS docs示例太简单了,以至于它们对我不起作用。我也扫描了一些SO问题,但无法解决这些问题。他们大多谈论Services ..我没有,也不知道如何获得。

我的其余代码都使用SnapshotSpans,如示例Todo_Classification examples的扩展名,如果您不需要知道文件名,那很好。

我从未做过任何扩展开发。请有人可以帮助我正确执行此操作。

1 个答案:

答案 0 :(得分: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;
    }

如果您不介意将Microsoft.CodeAnalysis.EditorFeatures.Text添加到项目中,它将在Document GetOpenDocumentInCurrentContextWithChanges()类上为您提供扩展方法Microsoft.VisualStudio.Text.Snapshot。 (加上许多其他基于Rosyln的助手)

using Microsoft.CodeAnalysis.Text;

Document doc = span.Snapshot.GetOpenDocumentInCurrentContextWithChanges();