在编写 Roslyn 分析器或 VS 扩展时,有什么方法可以存储数据吗?

Is there any way to store data when writing Roslyn analyzers or VS extensions?

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

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

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

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

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

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