You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Source Generator中生成共享代码的正确方式及多项目疑问

关于Source Generator代码生成策略与跨程序集类型冲突的问题

一、跨程序集生成同命名空间同名称委托的行为

首先澄清一个误解:CS0101错误仅会在**同一编译单元(即同一个项目/程序集)**内出现重复类型定义时触发。跨程序集定义同命名空间、同名称的委托(或其他类型)是完全合法的,不会触发编译错误——你之前遇到的手动定义报错,大概率是在同一个项目里重复定义了该委托,而非跨程序集。

但需要明确:这些跨程序集生成的“同名委托”是完全独立的CLR类型,CLR通过「程序集标识+命名空间+类型名」的组合来唯一识别类型。也就是说,程序集A里的MyNamespace.MyDelegate和程序集B里的MyNamespace.MyDelegate是两个毫无关系的类型,无法互换使用——比如你不能把A中该委托的实例赋值给B中该委托类型的变量,编译器会直接报类型不匹配错误。

二、代码生成策略的最优选择

你的三类代码需要区分处理,不能一概而论全生成或全放在类库中:

1. 必须放在Source Generator类库程序集的类型

  • 标记用Attribute:用户需要在自己的代码中直接引用这些Attribute来标注目标类型,因此必须将其作为公共API打包在生成器类库中,让所有用户项目引用该类库。如果每个项目都生成一份Attribute,会导致用户代码中引用的Attribute类型在不同项目间不统一,生成器也无法稳定识别标注。
  • 通用委托、基础复用类型:如果这些类型需要在跨程序集场景下兼容(比如用户需要让不同程序集生成的类型交互,共享同一个委托类型),或者这些类型不依赖任何用户项目的特有代码,就应该放在生成器类库中。这样所有用户项目使用的都是同一个类型,避免类型不兼容的问题,同时减少代码冗余。

2. 必须生成在用户程序集的类型

  • 用户实际请求的类型:这类类型通常依赖用户定义的目标类型(比如实现用户的接口、扩展用户的internal类),必须与用户的目标类型处于同一程序集才能保证访问权限合法,且每个用户项目的这类类型都是特有的,无法复用,因此必须生成在用户的程序集内。

总结

最优策略是拆分通用类型与项目特有类型:将Attribute、通用委托等不依赖用户代码的公共类型放在生成器类库中,作为用户项目的依赖引用;仅将与用户目标类型绑定的特有类型生成到用户程序集内。这样既避免了跨程序集类型不兼容的问题,又保证了生成代码的合法性与可维护性。

内容的提问来源于stack exchange,提问作者patvax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:23:20