VS 2013 SDK:如何检测当前的编程语言

本文关键字:检测 编程语言 SDK 2013 何检测 VS | 更新日期: 2023-09-27 18:00:35

使用Visual Studio SDk 2013,我正在尝试开发一个简单的扩展,该扩展旨在修改所选文本以将其包含在特定的XML文档标记中,然后,对于此任务,我需要区分当前项目的编程语言是VB.Net还是C#,但是。。。怎样

但我认为不止于此,请注意,在C#项目下,我们可以加载一个.vb文件,它的语法将被IDE识别,反之亦然,然后。。。也许检测当前的文件语言而不是当前的项目语言会更好,也许这会使实现这一点的逻辑变得复杂?。

VS 2013 SDK:如何检测当前的编程语言

首先,准确地说,语言与项目没有关联。对于C#项目,人们的意思是主要语言是C#,因此这些CS文件是使用C#编译器编译的。项目中可能会使用其他需要不同编译器的语言,如XAML。因此,从编程的角度来说,不存在项目语言这样的东西。只有文档与语言相关联。一个文档最多可以有一种语言。

现在的问题是如何获得给定文档的编程语言?一种方法是使用文件扩展名。这不起作用,因为扩展名为CS的资源文件不是C#文件,即使它具有相同的扩展名。

您建议使用IWpfTextViewHost.TextView.TextDataModel.ContentType.DisplayName。首先,即使解决方案当前处于打开状态,TextView对象也可以是null。当第一次打开解决方案但没有打开任何文档时,就会发生这种情况。其次,TextView对象维护所有打开文档的历史记录,并表示最后一个仍然打开的文档。它没有说明任何关于当前活动窗口的信息,该窗口甚至可能不包含文档,或者可能包含没有语言的文档。

以下是如何获取当前打开文档的语言(如果存在):

if (applicationObject.ActiveWindow.Document != null)
{
    Document activeDoc = applicationObject.ActiveDocument;
    if (activeDoc.Language != null)
    {
        // The currently active window contains a document that has a language.
    }
}

注意,ActiveWindowActiveDocument从来都不是null。但是,如果当前打开的窗口不包含文档,则访问ActiveDocument会引发异常。这就是您必须执行null检查的原因。还要注意,Intellisense并没有提供给基础结构编程构造,例如上面代码片段中使用的Language

您可以按如下方式获得applicationObject

applicationObject = (DTE2)GetService(typeof(DTE));