代码之家  ›  专栏  ›  技术社区  ›  Piotr Kula David Boike

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

  •  0
  • Piotr Kula David Boike  · 技术社区  · 6 年前

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

    在google了很多次之后,我找到了如何使用示例代码(这并不理想)

    DTE2 dte = (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.15.0");
    
    var activeDocument = dte.ActiveDocument;
    
    var docName = activeDocument.Name;
    var docFullName = activeDocument.FullName;
    

    现在我知道这里的问题了

    • 那是基于文本的特定版本
    • 好像很慢

    我有一种感觉,我应该用MEF属性来做这件事,但是MS docs的例子太简单了,它们对我不起作用。我也浏览了一些问题,但我无法让它们发挥作用。他们主要谈论 Services

    我其余的代码使用 SnapshotSpans 例如 Todo_Classification examples 这是伟大的,如果你不需要知道文件名。

    我从未做过任何扩展开发。有人能帮我把这个做对吗。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Piotr Kula David Boike    6 年前

        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();