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

如何打包附带Roslyn源码生成器的.Net类库且无需主项目显式引用生成器

核心问题原因

你当前的依赖结构存在两个错误配置:

  1. 源码生成器被设置为类库的普通项目依赖,只会在编译你的类库时运行,自然只能读取类库本身的源码,不会在用户主项目编译阶段触发执行
  2. 普通项目依赖的生成器不会自动被NuGet/MSBuild传递到上层主项目的编译上下文,也不会被识别为需要执行的Roslyn组件

解决步骤

  • 第一步:调整源码生成器项目的基础配置
    打开生成器的.csproj文件,添加以下属性:

    <PropertyGroup>
      <!-- 标记为Roslyn分析器/生成器组件 -->
      <IsRoslynComponent>true</IsRoslynComponent>
      <!-- 强制遵循Roslyn组件规则,避免兼容性问题 -->
      <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
      <!-- 必须使用netstandard2.0作为目标框架保证全场景兼容性 -->
      <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    
  • 第二步:修改类库项目对生成器的引用规则
    打开你的类库的.csproj文件,把原来对生成器的普通ProjectReference替换为以下配置:

    <ProjectReference 
      Include="..\你的生成器项目路径\你的生成器项目名.csproj"
      PrivateAssets="all"
      ReferenceOutputAssembly="false"
      OutputItemType="Analyzer"
    />
    

    各属性作用:

    • PrivateAssets="all":该引用不会被传递到上层项目,避免用户项目看到生成器的直接依赖
    • ReferenceOutputAssembly="false":你的类库不需要在运行时引用生成器的程序集
    • OutputItemType="Analyzer":告诉MSBuild打包时要将该生成器归类到分析器目录
  • 第三步:验证打包结果
    完成配置后对类库执行打包操作,打开生成的.nupkg文件,确认生成器的dll被放置在以下路径:
    analyzers/dotnet/cs/你的生成器程序集名.dll


配置完成后,用户无论是直接引用类库项目,还是引用你发布的NuGet包,都不需要做任何额外配置,生成器会自动注入到用户项目的编译流程中,运行时可以直接获取到主项目的完整编译上下文(包括所有源码的语法树、语义信息)。

常见问题排查

  • 如果生成器还是读不到主项目的指定内容,检查你是否需要读取Compile以外的文件(如嵌入式资源、.cshtml等),此时需要在类库的build目录下添加.targets文件,主动声明需要编译器暴露的文件类型
  • 避免在生成器中引用高版本的第三方依赖库,防止和用户项目的依赖产生冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:48:04