使用VB / C#Diagnostic Analyzer / CodeFix / AutoUpdate多个.vsix会导致性能问题吗?

时间:2014-08-12 11:02:03

标签: c# vb.net visual-studio roslyn vsix

我正在实施一个系统,该系统将实现代码质量作为内部质量措施的一部分。我用两种可能的实现方式构建了系统,如下所示:

实施1 :(已实施)

  1. AutoUpdate扩展程序(存根)
  2. C#CodeQualityPlugin(Roslyn C#Diagnostic Analyzer& Code Fix)
  3. VB CodeQualityPlugin(Roslyn VB诊断分析器和代码修复)
  4. AutoUpdate功能通过验证其版本号来检查自身和其他CodeQuality插件的任何更新。一旦更新了CodeQuality插件,它将停止接下来7天的更新。

    这是我目前的实现想法,但是由于此实现中与扩展数量相关的可能的性能问题以及可能存在Visual Studio对其使用/性能的限制(如上所述)团队)

    实施2 :(建议)

    1. C#CodeQualityPlugin(Roslyn C#Diagnostic Analyzer,Code Fix,AutoUpdate)
    2. VB CodeQualityPlugin(Roslyn VB诊断分析器,代码修复,自动更新)
    3. 在此,更新功能是单独触发的,并保持单一责任理念。

      我不确定AutoUpdate项目(使用菜单命令模板)和C#/ VB CodeFix / DiagnosticAnalyzer项目(Roslyn模板)是否可以共存?

      实施3 :(其中一个意见)

      1. CodeQualityPlugin(Roslyn C#/ VB诊断分析器,代码修复,自动更新)
      2. 我甚至不确定这三个是否可以在一个vsix中共存。

        所以我的问题可能是上述三种场景中的性能问题,以及我们如何将基于Roslyn模板开发的插件实现为visual studio的普通菜单命令模板扩展。

        --- --- EDIT 总结要求如下

        1. 共存:VSPackage扩展(用于扩展Visual Studio的shell命令组件)和Managed Extensibility Framework / MEF扩展(用于自定义和扩展编辑器以包含Roslyn DiagnosticAnalyzer / CodeFix),

          中共存
          • 单个VSIX
          • 最多2个VSIX
        2. 性能:共存不应影响性能,VSPackage扩展所处理的AutoUpdate不应创建冗余服务调用。

2 个答案:

答案 0 :(得分:2)

没有

你可以拥有的唯一真正的“性能问题”是将C#和VB放在同一个程序集中(注意,而不是VSIX),这意味着当我们必须加载一个时,我们加载其他组件。

从MEF的角度来看,我们只得到一份出口清单:我们不知道它们来自哪个VSIX,而且即使我们想要也很难弄明白。所以你放入的VSIX根本不重要:根据对用户有意义的东西进行划分。

答案 1 :(得分:1)

Roslyn和VSIX包装的注意事项:

mentioned

Srivatsn
  1. 引用Microsoft.CodeAnalysis.CSharpMicrosoft.CodeAnalysis.VisualBasic的扩展程序

    • 即使我们尝试打开C#项目,也要加载两个编译器,这不太理想。
  2. 如果我们必须分析符号ISymbolAnalyzer,你只是在分析符号而不是语法节点,那么我们应该采用一个与语言无关的分析器。这意味着我们不必引用任何C#/ VB dll(即使Microsoft正在考虑实现更多与语言无关的分析器)。包括两个导出属性 - 每种语言一个,当解决方案中包含相应的语言时,这些属性告诉VS实例化并调用这些分析器。

  3. 编译作为一个进程在编译完成后离开内存,但由于几乎每次击键都会发生编译,如果分析器同时引用c#和VB,它会将两个编译器都带入内存。由于存在持久性特征,如果解决方案下存在大型项目(这是我的典型生产方案),则可能会出现问题

  4. 在调用相应的语法方法时或在导出的分析器实例化时,是否加载了编译器(通过提及相应的语言用例再次通过MEF导出属性进行过滤) )因为他还提到if引用这两种语法节点的方法可能会使JIT编译并加载dll。

  5. 链接到菜单命令的任何分析器都是VS特定的,如果它们链接到项目,那么它也将参与构建,甚至在VS之外通过MSBuild

  6. VSIX应该能够导出多个组件以扩展这两个扩展点。

  7. mentioned

    VSadov
    1. 语法树数据结构的持久性以及每次击键时重新进行分析的需要( delta-compilation:这是Srivatsn编译的意思)使他们设计为红色-green tree方法,有助于执行delta编译。
    2. mentioned

      SLaks
      1. MEF导出无论是否打包在单个VSIX中都没有任何区别(但是应该注意的是,将两个类型分析器组合到单个组件中存在性能问题, MEF导出
      2. mentioned

        Kevin Pilch
        1. 虽然这些程序集的打包位置并不重要,除非在涉及特定语言的引用时它们是分开的。
        2. 如果分析器同时引用C#和VB特定的Roslyn程序集并且这些编译器程序集很大,则将保留虚拟内存
        3. 性能问题是磁盘加载和JIT成本(我不确定如果没有编译且只有引用,如何有JIT成本),但是因为有一个保留的地址空间可能存在VS中的问题(我不确定这将是一个什么问题。
        4. 据他所说,微软所做的是创建三个项目来解决这个问题(据Srivatsn称,微软仍在尝试使用与语言无关的分析器

          • 共享(其中没有特定语言的二进制文件
          • C#特定( +共享库
          • VB特定( +共享库
        5. 如果没有引用特定于语言的二进制文件,并且MEF导出是否适当地归因于ContentTypeLanguageName,则可以解决上述问题

        6. 我们可以将其他程序集捆绑到一个VSIX中(将其他项目嵌入其中),VS将独立加载
        7. 最终实施:

          所以最后我在与我的团队讨论后得出结论如下

          • 通过在其中嵌入以下项目来实现单个VSIX实现
            • 更新插件
              • 检查过去7天是否有更新
              • 然后通过JSON请求检查服务器端插件的版本号
              • 然后从服务器下载插件,将下载日期存储在VS设置中以进行初始检查
              • 停用以前的插件
              • 卸载以前的插件
              • 安装新插件
              • 此功能在触发时触发
                • VS加载
                • 手动菜单命令(应该覆盖下载日期检查)
            • C#插件
              • 仅实施和引用C#
              • 的规则
            • VB插件
              • 仅实现和引用VB的规则