【问题标题】:Is there any way to store data when writing Roslyn analyzers or VS extensions?编写 Roslyn 分析器或 VS 扩展时有什么方法可以存储数据?
【发布时间】:2016-01-12 22:57:13
【问题描述】:

我正在编写一个 Roslyn 分析器,我需要存储一些数据,因此我的分析器可以在它们之间共享数据。或者我想保存分析仪的状态,然后我想再次将一些数据保存到数据库或写入文件。使用带有代码修复模板的分析器时是否有任何存储数据的选项?

【问题讨论】:

  • 您想在分析器之间或分析器与代码修复之间共享数据吗?我会避免任何与诊断生命周期没有内在联系的持久性:每次调用分析器时进行数据库往返很可能会非常昂贵。

标签: roslyn roslyn-code-analysis


【解决方案1】:

@Srivatsn Narayanan 提到的问题将增加在分析器之间共享资源的能力。但这并不意味着您可以共享状态。

为了使状态在分析器之间有用,您需要某种不存在的分析器之间的依赖关系或执行顺序保证。

PS: 您可以要求添加对此类保证的支持,但由于这会使整个系统变得更加复杂,并且有一个解决方法作者可以自己做(通过创建一个分析器并自己做所有事情)可能不会很快得到支持。

【讨论】:

  • 顺便说一下,analyzer 目前的设计不是为了将某些东西写回系统。它仅从上下文(系统)中读取某些内容,并且它可以生成的唯一输出是诊断性的。如果您想将某些内容更改为系统,则需要代码修复,并且必须由用户显式调用。由于根据主机的不同,分析器可以按任何顺序运行且无需任何用户显式操作,因此分析器不是写出任何内容的好地方。
【解决方案2】:

目前没有简单的 API 可以在分析器实例之间共享状态。我们正在讨论在this issue 中添加这样的功能。但是,该 API 的功能可以简单地通过您拥有一个公开静态 ConditionalWeakTable 并将您的数据存储在那里并在您的分析器之间共享的类型来实现。您确实需要小心以确保您没有泄漏编译。

模板生成的分析器是一个可移植的库项目,因此无法访问许多 file\db API。您可以将分析器转换为以 .NET 4.5.2 为目标的项目,然后使用这些 API。但是,我强烈建议尽可能避免这种情况,原因有两个 - 一个是分析器将在 VS 中的每次击键时执行,并进行通常会降低性能的 db 调用。第二个是不可移植的分析器将特定于 VS,并且无法在 ASP.NET 5 或 .NET CLI 上运行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多