0

0

c# 编译器 roslyn 是什么

星降

星降

发布时间:2025-12-29 11:37:36

|

817人浏览过

|

来源于php中文网

原创

Roslyn 是微软开源的可编程 C#/VB.NET 编译器平台,将编译过程拆解为语法分析→语义分析→绑定→IL生成四阶段,暴露强类型API;其核心是不可变SyntaxTree(结构)与需手动引用的Compilation(语义),支持代码分析、修改与生成。

c# 编译器 roslyn 是什么

Roslyn 不是传统意义上“黑盒式”的编译器,它是微软开源的、可编程的 C#(和 VB.NET)编译器平台——你可以把它当成一个“带 API 的编译器”,而不是只能敲 dotnet build工具

它把编译过程拆成可观察、可干预的阶段:语法分析 → 语义分析 → 绑定 → IL 生成。每个阶段都暴露了强类型的 API,让你能读取、遍历、修改甚至重新生成代码。


为什么 Roslyn 能解析代码还能改代码?

因为 Roslyn 把源码转成了两棵关键树:SyntaxTree(纯结构,不关心含义)和 Compilation(带类型、符号、引用信息)。前者告诉你“代码长什么样”,后者告诉你“这段代码到底在干啥”。
比如你写 var x = new List();SyntaxTree 只知道这是个变量声明,而 Compilation 能告诉你 List 是来自 System.Collections.Generic,且 var 推导为 List

  • SyntaxTree 是不可变的,每次修改都返回新树(函数式风格,线程安全)
  • Compilation 需要显式添加引用(如 corlibSystem.Runtime),漏掉会报 CS0246: 未能找到类型或命名空间名
  • 真实项目中,别手动拼 MetadataReference,优先用 Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create() + .AddReferences(...) 或直接用 CSharpProject(.NET SDK 内置方式)

动态编译字符串代码时最常卡在哪?

不是语法错,而是环境缺失。Roslyn 默认不带任何框架引用,哪怕只写 Console.WriteLine,也得手动加 System.Console 对应的元数据引用。

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

string code = @"using System; class A { static void Main() => Console.WriteLine(1); }"; SyntaxTree tree = CSharpSyntaxTree.ParseText(code);

// ⚠️ 下面这步极易遗漏 CSharpCompilation compilation = CSharpCompilation.Create("tmp.dll") .AddSyntaxTrees(tree) .AddReferences( MetadataReference.CreateFromFile(typeof(object).Assembly.Location), MetadataReference.CreateFromFile(typeof(Console).Assembly.Location) ) .WithOptions(new CSharpCompilationOptions(OutputKind.ConsoleApplication));

// 编译失败?先看 diagnostics: foreach (Diagnostic d in compilation.GetDiagnostics()) Console.WriteLine(d.ToString());

  • 如果用 CSharpScript(脚本模式),它会自动加载常用引用,但仅限表达式/语句级执行,不能定义类或程序集
  • compilation.Emit() 返回 bool,必须检查结果;失败时 GetDiagnostics() 才是真相

Roslyn 分析器(Analyzer)和源生成器(Source Generator)有什么区别

两者都基于 Roslyn API,但生命周期和用途完全不同:

  • Analyzer:只读分析,在 IDE 设计时或编译时报告诊断(警告/错误),不改变输出代码。例如检测未使用的变量、硬编码密码。

    OpenMP并行程序设计 WORD版
    OpenMP并行程序设计 WORD版

    本文档主要讲述的是OpenMP并行程序设计;OpenMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的。目前支持OpenMP的语言主要有Fortran,C/C++。 OpenMP在并行执行程序时,采用的是fork/join式并行模式,共享存储式并行程序就是使用fork/join式并行的。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

    下载
  • SourceGenerator:在编译前介入,生成新的 .cs 文件并加入编译流程。例如从 [JsonSerializable] 特性自动生成序列化器代码。

  • 分析器需打包为 .dll + .ruleset 或 NuGet,通过 引入

  • 源生成器必须标记 [Generator] 特性,且只能在 netstandard2.0net6.0+ 下运行;.NET SDK 6+ 默认启用,但需显式开启:true


真正难的从来不是“怎么调 API”,而是理解 Roslyn 的两个世界:一个是语法层面的“字面结构”,一个是语义层面的“真实含义”。漏掉一次引用、误用 SyntaxFactory 而没设 Parent、在生成器里试图访问尚未生成的符号——这些坑不会报编译错误,只会让生成结果为空或诊断静默失效。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1429

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

606

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

546

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

539

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

157

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

77

2025.08.07

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

121

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号