VS 2013 SDK:如何检测当前的编程语言?
VS 2013 SDK: How to detect the current programming language?
使用 Visual Studio SDK 2013,我正在尝试开发一个简单的扩展,旨在修改所选文本以将其包含在特定的 XML 文档标签,然后,对于此任务,我需要区分当前项目的编程语言是 VB.Net 还是 C#,但是...如何?
但我认为不止于此,请注意,在 C# 项目下,我们可以加载一个 .vb 文件,其语法将被 IDE 识别,反之亦然。 .. 也许检测当前文件语言而不是当前项目语言会更好,也许这会使完成此操作的逻辑复杂化?
首先,非常准确地说,语言与项目无关。对于 C# 项目,人们的意思是主要语言是 C#,因此这些 CS 文件是使用 C# 编译器编译的。项目中可能会使用需要不同编译器的其他语言,例如 XAML。所以从编程的角度来说,不存在项目的语言这样的东西。只有文档与语言相关联。一个文档最多可以有一种语言。
现在的问题是如何获取给定文档的编程语言?一种方法是使用文件扩展名。这不起作用,因为扩展名为 CS 的资源文件不是 C# 文件,即使它具有相同的扩展名。
您建议使用 IWpfTextViewHost.TextView.TextDataModel.ContentType.DisplayName
。首先,即使解决方案当前打开,TextView
对象也可能是 null
。首次打开解决方案但未打开文档时会发生这种情况。其次,TextView
对象维护所有打开文档的历史记录并表示仍然打开的最后一个文档。它没有说明当前活动的任何内容 window,它甚至可能不包含文档,或者它可能包含没有语言的文档。
以下是如何获取当前打开文档的语言(如果存在):
if (applicationObject.ActiveWindow.Document != null)
{
Document activeDoc = applicationObject.ActiveDocument;
if (activeDoc.Language != null)
{
// The currently active window contains a document that has a language.
}
}
请注意 ActiveWindow
和 ActiveDocument
永远不会是 null
。但是,如果当前打开的 window 不包含文档,则访问 ActiveDocument
会导致抛出异常。这就是您必须执行 null
检查的原因。另请注意,没有为基础结构编程构造提供 Intellisense,例如上面代码片段中使用的 Language
。
您可以获得applicationObject
如下:
applicationObject = (DTE2)GetService(typeof(DTE));
使用 Visual Studio SDK 2013,我正在尝试开发一个简单的扩展,旨在修改所选文本以将其包含在特定的 XML 文档标签,然后,对于此任务,我需要区分当前项目的编程语言是 VB.Net 还是 C#,但是...如何?
但我认为不止于此,请注意,在 C# 项目下,我们可以加载一个 .vb 文件,其语法将被 IDE 识别,反之亦然。 .. 也许检测当前文件语言而不是当前项目语言会更好,也许这会使完成此操作的逻辑复杂化?
首先,非常准确地说,语言与项目无关。对于 C# 项目,人们的意思是主要语言是 C#,因此这些 CS 文件是使用 C# 编译器编译的。项目中可能会使用需要不同编译器的其他语言,例如 XAML。所以从编程的角度来说,不存在项目的语言这样的东西。只有文档与语言相关联。一个文档最多可以有一种语言。
现在的问题是如何获取给定文档的编程语言?一种方法是使用文件扩展名。这不起作用,因为扩展名为 CS 的资源文件不是 C# 文件,即使它具有相同的扩展名。
您建议使用 IWpfTextViewHost.TextView.TextDataModel.ContentType.DisplayName
。首先,即使解决方案当前打开,TextView
对象也可能是 null
。首次打开解决方案但未打开文档时会发生这种情况。其次,TextView
对象维护所有打开文档的历史记录并表示仍然打开的最后一个文档。它没有说明当前活动的任何内容 window,它甚至可能不包含文档,或者它可能包含没有语言的文档。
以下是如何获取当前打开文档的语言(如果存在):
if (applicationObject.ActiveWindow.Document != null)
{
Document activeDoc = applicationObject.ActiveDocument;
if (activeDoc.Language != null)
{
// The currently active window contains a document that has a language.
}
}
请注意 ActiveWindow
和 ActiveDocument
永远不会是 null
。但是,如果当前打开的 window 不包含文档,则访问 ActiveDocument
会导致抛出异常。这就是您必须执行 null
检查的原因。另请注意,没有为基础结构编程构造提供 Intellisense,例如上面代码片段中使用的 Language
。
您可以获得applicationObject
如下:
applicationObject = (DTE2)GetService(typeof(DTE));