Visual Studio扩展:从文件名或ProjectItem

时间:2019-01-21 18:08:09

标签: c# visual-studio-2015 visual-studio-sdk

我正在编写扩展程序以提供基本的项目统计信息(例如代码行)。迭代Solution树并找到与文件对应的ProjectItem很简单。

Document结构具有KindLanguage属性,但是后者被标记为仅供内部使用,并且都需要首先在编辑器中打开文件。

所以...有办法:

  1. 查看Visual Studio将哪些文件分类为文本文件。
  2. 查看Visual Studio与给定文件名/文件扩展名关联的语言。

不打开文件?

1 个答案:

答案 0 :(得分:1)

我已经编写了这样的统计信息(尽管仅适用于C#和VB.NET),并且对于所有项目类型/文件类型/语言,这两个问题都非常棘手。首先,如果需要,可以使用ProjectItem.Open(view)方法从EnvDTE.ProjectItem打开EnvDTE.Document / EnvDTE.TextDocument,该方法将返回EnvDTE.Window。这不会使窗口可见,默认情况下是不可见的,您需要调用Window.Visible = true使其可见。完成后,请使用Window.Close关闭(不可见)窗口,除非该窗口已经打开(您可以知道先调用ProjectItem.get_IsOpen(view),然后再调用或不关闭)。

现在:

  • 很难知道文件是否为文本,因为VS支持许多项目,并且每种项目类型都可以将其文件/扩展名视为文本文件。我发现的最好方法是将所有文件都视为文本文件,除非已知扩展名不是文本文件(.jpg等)。另外,请注意,并非所有文本文件都是代码文件(例如:.txt文件)。对于某些功能(例如查找文本功能),您可能会对文本文件感兴趣,而对于统计功能,您可能会对代码文件(而不仅仅是文本文件)感兴趣。

  • 您可以使用EnvDTE.ProjectItem.FileCodeModel.Language(和EnvDTE.Project.CodeModel.Language)来了解文件语言的向导。 las,某些项目/文件具有语言,但不提供代码模型,因此您可能需要使用已知的扩展名来映射到一种语言。

一些有用的语言指导:

     const string LANGUAGE_CSHARP = "{B5E9BD34-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_IDL = "{B5E9BD35-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_MANAGED_C = "{B5E9BD36-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_VBNET = "{B5E9BD33-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_VISUAL_C = "{B5E9BD32-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_PYTHON = "{888888A0-9F3D-457C-B088-3A5042F75D52}";
     const string LANGUAGE_FSHARP = "{F2A71F9B-5D33-465A-A702-920D77279786}";
     const string LANGUAGE_R = "{DA7A21FA-8162-4350-AD77-A8D1B671F3ED}";

请注意,由于VS如此可扩展,因此没有语言枚举。新语言提供了新的指导。