VSIX如何获取当前快照文件名?
VSIX how to get current snapshot document name?
我一直在尝试创建一个扩展,在 Visual Studio 的页边空白处为我突出显示特定的行号。
我设法使用预定义的行号在页边空白处进行了标记,但要使其正常工作,我需要知道当前文档的全名是什么(路径和文件名)
经过多次谷歌搜索后,我想出了如何使用示例代码(这并不理想)
DTE2 dte = (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.15.0");
var activeDocument = dte.ActiveDocument;
var docName = activeDocument.Name;
var docFullName = activeDocument.FullName;
现在我知道这里的问题了
- 是针对特定版本的,以文中为准
- 没办法select是哪个实例(当运行不止一个VS)
- 好像很慢
我觉得我应该使用 MEF 属性来执行此操作,但 MS 文档示例非常简单,它们对我不起作用。我也扫描了一些 SO 问题,但我无法让它们工作。他们主要谈论 Services
.. 我没有也不知道如何获得。
我的其余代码使用 SnapshotSpans
,如 Todo_Classification examples 的扩展示例中那样,如果您不需要知道文件名,这非常好。
我从来没有做过任何扩展开发。请有人能帮我正确地做到这一点。
您可以使用以下代码从快照中获取文件,而无需任何依赖项。
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
添加到您的项目中,它将为您提供 Microsoft.VisualStudio.Text.Snapshot
class 上的扩展方法 Document GetOpenDocumentInCurrentContextWithChanges()
。 (加上许多其他基于 Rosyln 的助手)
using Microsoft.CodeAnalysis.Text;
Document doc = span.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
我一直在尝试创建一个扩展,在 Visual Studio 的页边空白处为我突出显示特定的行号。
我设法使用预定义的行号在页边空白处进行了标记,但要使其正常工作,我需要知道当前文档的全名是什么(路径和文件名)
经过多次谷歌搜索后,我想出了如何使用示例代码(这并不理想)
DTE2 dte = (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.15.0");
var activeDocument = dte.ActiveDocument;
var docName = activeDocument.Name;
var docFullName = activeDocument.FullName;
现在我知道这里的问题了
- 是针对特定版本的,以文中为准
- 没办法select是哪个实例(当运行不止一个VS)
- 好像很慢
我觉得我应该使用 MEF 属性来执行此操作,但 MS 文档示例非常简单,它们对我不起作用。我也扫描了一些 SO 问题,但我无法让它们工作。他们主要谈论 Services
.. 我没有也不知道如何获得。
我的其余代码使用 SnapshotSpans
,如 Todo_Classification examples 的扩展示例中那样,如果您不需要知道文件名,这非常好。
我从来没有做过任何扩展开发。请有人能帮我正确地做到这一点。
您可以使用以下代码从快照中获取文件,而无需任何依赖项。
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
添加到您的项目中,它将为您提供 Microsoft.VisualStudio.Text.Snapshot
class 上的扩展方法 Document GetOpenDocumentInCurrentContextWithChanges()
。 (加上许多其他基于 Rosyln 的助手)
using Microsoft.CodeAnalysis.Text;
Document doc = span.Snapshot.GetOpenDocumentInCurrentContextWithChanges();