VS2022中如何实时调用源生成类的属性与方法?
源生成器问题解决方案
一、解决CS8032初始化异常
这个警告的核心是源生成器类无法被实例化,检查以下几点:
- 确保
AbstractFactoryGenerator类有公共无参构造函数,源生成器必须通过无参构造实例化,不能使用带参数的构造函数。 - 排查构造函数内部逻辑,移除所有可能引发异常的代码(比如尝试读取不存在的文件、未初始化的对象操作)。
- 确认源生成器项目的目标框架为
netstandard2.0或netstandard2.1,且未引用仅支持高版本.NET的不兼容NuGet包。
二、实现实时生成代码无需手动输出
当前实现可能是直接将代码写入磁盘文件,导致VS无法实时识别。正确做法是通过GeneratorExecutionContext的AddSource方法将代码注入编译流程:
- 删除所有手动写入文件的代码(比如
File.WriteAllText这类操作)。 - 在
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
相关产品推荐
相关产品推荐

