【问题标题】:VS 2013 SDK: How to detect the current programming language?VS 2013 SDK:如何检测当前的编程语言?
【发布时间】:2015-07-01 12:17:07
【问题描述】:

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

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

【问题讨论】:

  • 你会不会检查文件扩展名并简单地忽略 c# 项目中的 .vb 文件,反之亦然?
  • 最后我在IWpfTextViewHost.TextView.TextDataModel.ContentType.DisplayName 属性中找到了答案:msdn.microsoft.com/en-us/library/… 无论如何,任何人都可以随意发布带有不同解决方案的答案以将其标记为已接受。
  • 附加信息:据我所知,显示名称可以是“Basic”或“CSharp”,我只用这些语言进行了测试。
  • 编写并接受您自己的答案,假设它是正确的,完全没问题,explicitly encouraged。

标签: c# .net vb.net visual-studio visual-studio-extensions


【解决方案1】:

首先,非常准确地说,语言与项目无关。通过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.
    }
}

请注意,ActiveWindow 和 ActiveDocument 永远不会是 null。但是,如果当前打开的窗口不包含文档,则访问ActiveDocument 会引发异常。这就是您必须执行null 检查的原因。另请注意,Intellisense 不提供用于基础架构编程结构,例如上面代码 sn-p 中使用的Language。

您可以通过以下方式获取applicationObject:

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

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2013-11-30
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多