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

关于Source Generator生成文件物理访问性及项目结构可见化标准方案的技术问询

Source Generator生成文件的物理访问与VS可见性解决方案

首先,Source Generator生成的代码默认不会作为物理文件存在于你的项目目录中——它们是在编译阶段动态生成并直接注入到Roslyn编译管道的,不会自动写入磁盘。而且正如你提到的,Roslyn明确禁止在生成器的Execute()方法中进行IO操作,这是为了保证构建的稳定性和可重复性,避免生成器对文件系统产生意外修改。

接下来是你关心的「无需自行IO操作,让生成代码在VS中可见」的标准方案,完全通过MSBuild配置就能实现:

步骤1:配置MSBuild让生成文件输出到磁盘

在你的项目文件(.csproj)中添加以下配置:

<PropertyGroup>
  <!-- 启用生成文件的磁盘输出 -->
  <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
  <!-- 指定生成文件的输出路径(可自定义,建议用中间目录避免污染项目根目录) -->
  <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GeneratedFiles</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
  • $(BaseIntermediateOutputPath)是MSBuild的内置变量,默认对应项目的obj目录,这样生成的文件会放在obj\GeneratedFiles下,不会混入你的源代码目录。
  • 这个配置会让编译器自动把所有Source Generator生成的代码写入指定路径的物理文件,完全不需要你在生成器里写任何IO逻辑。

步骤2:让生成文件在VS解决方案资源管理器中显示

添加上面的配置后,文件已经在磁盘上了,但VS默认不会显示它们。你需要再添加一个ItemGroup把这些文件包含到项目中,并设置可见:

<ItemGroup>
  <!-- 包含所有生成的CS文件,并设置为可见 -->
  <Compile Include="$(CompilerGeneratedFilesOutputPath)**/*.cs" Visible="true" />
</ItemGroup>

设置Visible="true"是关键,这样这些文件就会出现在VS的解决方案资源管理器中,你可以直接点击查看内容,甚至在调试时跳转到生成的代码(前提是你的生成器在AddSource时指定了合理的hintName,比如带命名空间的文件名,这会帮助VS更好地关联代码位置)。

关于调试时的临时文件

你提到的C:\Users\user\AppData\Local\Temp\.vsdbgsrc下的文件,是VS在调试会话中临时生成的调试用代码副本,不属于正式构建的产物,而且这个路径下的文件会被VS定期清理。至于F12导航失效的问题,建议检查你的生成器代码:在调用context.AddSource(hintName, sourceText)时,确保hintName是一个有意义的文件名(比如MyNamespace.MyGeneratedClass.cs),而不是随机字符串,这能帮助Roslyn和VS正确建立代码的导航关联。

补充说明

这种方案的优势在于完全符合Roslyn的设计规范,避免了自行IO带来的构建不稳定问题,同时生成的文件作为构建产物存放在中间目录,不会被误提交到版本控制(通常obj目录会被加入.gitignore)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:29:04