使用 Visual Studio SDk 2013 ,我正在尝试开发一个简单的扩展,旨在修改所选文本以将其封装在特定的XML文档标记中,然后,对于此任务,我需要区别当前项目的编程语言是VB.Net,还是C#,但是......怎么样?。
但我认为不止于此,请注意在C#项目下我们可以加载.vb文件,其语法将被IDE识别,反之亦然,然后...可能会检测当前的文件语言而不是当前的项目语言会更好,可能会使逻辑变得复杂吗?
答案 0 :(得分: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不提供基础结构编程结构,例如上面在代码片段中使用的Language
。
您可以按如下方式获取applicationObject
:
applicationObject = (DTE2)GetService(typeof(DTE));