C#面试题更新 2026-08-03

请解释 .NET 中的轻量级代码生成技术,并说明如何利用它来实现动态代码生成。

考察说明

考查对 .NET 中轻量级代码生成概念及其实际应用流程的理解。

回答思路

  1. 【回答框架 1】轻量级代码生成指的是 .NET 中通过 Roslyn 提供的 Syntax API 和 Metadata API,以编程方式创建、修改和编译 C# 代码的程序化能力,区别于运行时 Emit 或 CodeDom 等重量级方案。
  2. 【回答框架 2】核心思路是先用 SyntaxFactory 构建语法树节点,组合成符合 C# 语法的编译单元,再通过 CSharpCompilation 将语法树编译为程序集或直接加载执行,整个过程无需文本字符串拼接,避免语法错误和注入风险。
  3. 【回答框架 3】实际使用流程通常包括:构造命名空间、类、方法等语法节点,添加必要的 using 指令和特性,形成 SyntaxTree;然后创建 CSharpCompilation 并引用所需程序集,最后通过 Emit 输出到内存流并加载为 Assembly。
  4. 【回答框架 4】这种技术常用于实现动态代理、模板引擎、AOP 或元编程场景,能在运行时根据规则生成新类型和方法。需要注意生成代码的调试支持、程序集卸载限制以及因引用缺失导致的编译失败问题。
  5. 【回答框架 5】相比 Emit,轻量级代码生成编写更直观、可读性强,且能利用 Roslyn 的分析功能提前发现错误;但性能开销较高,适合生成频率低、要求可读性的场景,高频率生成时应评估性能影响。
  6. 【关键点 1】轻量级代码生成基于 Roslyn,通过 SyntaxFactory 构建语法树而非字符串拼接。
  7. 【关键点 2】核心流程为生成语法树、创建编译对象、编译并加载程序集。
  8. 【关键点 3】适用动态代理、模板处理等需要运行时生成代码的场景。
  9. 【关键点 4】相比 Emit 更安全易调试,但性能较低。
  10. 【关键点 5】生成时的引用管理和程序集加载管理是常见问题。
  11. 【易错点 1】直接拼接字符串生成代码易引发语法错误和注入风险,应优先使用 Syntax API。
  12. 【易错点 2】未正确引用依赖程序集会导致编译失败,需确保传递正确的 MetadataReference。
  13. 【易错点 3】动态生成并加载的程序集无法卸载,长期运行需考虑隔离策略。