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

VS2022中如何实时调用源生成类的属性与方法?

源生成器问题解决方案

一、解决CS8032初始化异常

这个警告的核心是源生成器类无法被实例化,检查以下几点:

  • 确保AbstractFactoryGenerator类有公共无参构造函数,源生成器必须通过无参构造实例化,不能使用带参数的构造函数。
  • 排查构造函数内部逻辑,移除所有可能引发异常的代码(比如尝试读取不存在的文件、未初始化的对象操作)。
  • 确认源生成器项目的目标框架为netstandard2.0或netstandard2.1,且未引用仅支持高版本.NET的不兼容NuGet包。

二、实现实时生成代码无需手动输出

当前实现可能是直接将代码写入磁盘文件,导致VS无法实时识别。正确做法是通过GeneratorExecutionContext的AddSource方法将代码注入编译流程:

  1. 删除所有手动写入文件的代码(比如File.WriteAllText这类操作)。
  2. 在Execute方法中,将生成的类代码字符串传入context.AddSource,示例代码:
var generatedCode = @"
namespace YourNamespace;
public partial class MyClass1
{
    public string GeneratedProperty { get; set; }
    public void GeneratedMethod() { }
}";
// 第一个参数是唯一标识,避免重复生成
context.AddSource("MyClass1.Generated.cs", SourceText.From(generatedCode, Encoding.UTF8));

这样生成的代码会直接被编译器纳入编译,无需手动输出文件,主项目就能实时识别GeneratedProperty和GeneratedMethod。

三、自动清理旧生成文件

如果之前手动生成了文件到项目目录:

  • 从项目中排除这些手动生成的文件(右键文件→从项目中排除),避免和源生成器的代码冲突。
  • 若必须保留文件输出,将生成路径改为项目的obj目录(比如Path.Combine(context.Compilation.Assembly.Location, "../obj/Generated")),obj目录会在清理项目时自动删除旧文件。

额外检查点

  • 确保手动编写的MyClass1是partial类,且命名空间和生成的代码完全一致(包括大小写)。
  • 主项目引用源生成器时,使用ProjectReference并设置正确的输出类型,示例项目文件配置:
<ProjectReference Include="..\SourceGeneratorsLibrary\SourceGeneratorsLibrary.csproj"
                  OutputItemType="Analyzer"
                  ReferenceOutputAssembly="false" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:03:14