工作区层是在整个解决方案上执行代码分析和重构的起点。 在此层中,工作区 API 可帮助你将解决方案中项目的所有信息组织到单个对象模型中,从而直接访问编译器层对象模型,例如源文本、语法树、语义模型和编译,而无需分析文件、配置选项或管理项目间依赖项。
主机环境(如 IDE)提供与打开的解决方案对应的工作区。 此外,只需加载解决方案文件即可在 IDE 外部使用此模型。
工作空间
工作区是解决方案作为项目集合的活动表示形式,每个项目都有一组文档。 工作区通常绑定到随着用户输入或操作属性不断变化的主机环境。
Workspace 提供对解决方案当前模型的访问权限。 当主机环境发生变化时,工作区会触发相应的事件,并更新 Workspace.CurrentSolution 属性。 例如,当用户在与其中一个源文档对应的文本编辑器中键入时,工作区使用事件来指示解决方案的整体模型已更改以及修改了哪个文档。 然后,可以通过分析新模型以获取正确性、突出显示重要区域或就代码更改提出建议来对这些更改做出反应。
还可以创建与主机环境断开连接或在没有主机环境的应用程序中使用的独立工作区。
解决方案、项目和文档
尽管每次按下某个键时工作区都可能会更改,但可以单独使用解决方案的模型。
解决方案是项目和文档的不可变模型。 这意味着可以在不锁定或重复的情况下共享模型。 从 Workspace.CurrentSolution 属性获取解决方案实例后,该实例永远不会更改。 但是,与语法树和编译一样,可以通过基于现有解决方案和特定更改来构造新实例来修改解决方案。 要使工作区反映您的更改,必须明确地将更新后的解决方案应用到工作区。
项目是整体不可变解决方案模型的一部分。 它表示所有源代码文档、分析和编译选项,以及程序集和项目到项目的引用。 在项目中,无需确定项目依赖项或分析任何源文件,即可访问相应的编译。
文档也是整体不可变解决方案模型的一部分。 文档表示一个源文件,可从中访问文件的文本、语法树和语义模型。
下图是工作区与主机环境、工具和编辑方式的关系的表示形式。
概要
Roslyn 公开了一组编译器 API 和工作区 API,这些 API 提供有关源代码的丰富信息,并且具有 C# 和 Visual Basic 语言的完全保真度。 .NET 编译器平台 SDK 大幅降低创建以代码为中心的工具和应用程序的入口障碍。 它在元编程、代码生成和转换、C# 和 Visual Basic 语言的交互式使用,以及将 C# 和 Visual Basic 嵌入领域专用语言方面创造了许多创新机会。