C# 源代码生成器 - 警告 CS8032:无法创建分析器实例
C# Source Generator - warning CS8032: An instance of analyzer cannot be created
我正在尝试构建源代码生成器。现在,只是最基本的静态方法 returns "Hello World".
生成器项目构建,但生成的代码不可用,调试器从未启动,构建输出显示
CSC : warning CS8032: An instance of analyzer Generator.StaticPropertyEnum.helloWorld cannot be created from ...\bin\Debug\net5.0\Generator.StaticPropertyEnum.dll : Could not load file or assembly 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified..
我引用的例子
- Roslyn Team Generator Sample Project
- Roslyn Team Generator Cookbook
- Generator.Equals Project
- How To Debug C# 9 Source Generators
我试过了
- 更改生成器和测试项目的 TargetFramework 和 LanguageVersion
- 引用了许多版本的分析器库
Microsoft.CodeAnalysis.CSharp
和 Microsoft.CodeAnalysis.Analyzers
- 引用
Microsoft.Net.Compilers.Toolset
的显式版本
- 添加对 NetStandard 库的显式引用
- 使用分析器项目模板从头开始
- 寻找生成器项目模板(但没有找到)
版本
Visual Studio: 版本 16.8.3
.NET SDK:5.0.101
代码
Generator.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0-2.final" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.0.0" PrivateAssets="all" />
</ItemGroup>
</Project>
测试 csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="1.3.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Generator.StaticPropertyEnum\Generator.StaticPropertyEnum.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
</ItemGroup>
</Project>
发电机
[Generator]
public class helloWorld : ISourceGenerator
{
public void Execute(GeneratorExecutionContext context)
{
context.AddSource("HelloWorld-generated.cs", @"
using System;
namespace HelloWorld
{
public static class Hello
{
public static string SayHello() {
return ""HelloWorld"";
}
}
}");
}
public void Initialize(GeneratorInitializationContext context)
{
#if DEBUG
if(!Debugger.IsAttached) Debugger.Launch();
#endif
}
}
Source Generator 必须是 Visual Studio 2019+ 中的 .NET Standard 2.0 到 运行 或 Visual Studio 2017+ 中的 .NET Standard 1.x 到 运行 .
我有针对 netstandard2.0
和 net5.0
的源代码生成器以支持可空性。
<TargetFrameworks>net5.0;netstandard2.0</TargetFrameworks>
<Nullable>enable</Nullable>
和针对相同框架的示例库。
在 Visual Studio 中构建项目时崩溃,但从终端构建正常。
为了解决这个问题,我在使用 SetTagetFramework
将其作为生成器引用时更改了目标框架,现在它编译时没有任何警告或错误。
<ItemGroup>
<ProjectReference Include="..\MyGenerator\MyGenerator.csproj"
OutputItemType="Analyzer" ReferenceOutputAssembly="false"
SetTargetFramework="TargetFramework=netstandard2.0" />
</ItemGroup>
正如@Yair-Halberstadt 在另一个答案中提到的,列出的特定错误是由于当前源代码生成器项目需要以 netstandard2.0 为目标。
但是,如果您使用不同的程序集(例如 Microsoft.CodeAnalysis, Version=3.0.x ...
)遇到 CS8032 错误,您的问题可能是由 SDK 版本不匹配引起的。
例如,在我的计算机上,我有 SDK 5.0.302,它具有 Microsoft.CodeAnalysis
和 Microsoft.CodeAnalysis.CSharp
的 3.10.0 版本。
虽然生成器项目使用 nuget 获取这些包,但引用生成器的项目构建从 SDK 解析这些文件。
这就是为什么恢复到 3.8.0 对一些评论员有用,他们安装的 SDK 版本包含这些引用的 3.8.0。
我不得不从 4.0.0 降级到 3.9 CodeAnalysis Sharp 和 Analyzers。
就这么疯狂
- 关闭并重新打开 Visual Studio(2019 年、2022 年)
- 如果第 1 步不起作用,请删除 .vs 文件夹
解决了我的问题
我正在尝试构建源代码生成器。现在,只是最基本的静态方法 returns "Hello World".
生成器项目构建,但生成的代码不可用,调试器从未启动,构建输出显示
CSC : warning CS8032: An instance of analyzer Generator.StaticPropertyEnum.helloWorld cannot be created from ...\bin\Debug\net5.0\Generator.StaticPropertyEnum.dll : Could not load file or assembly 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified..
我引用的例子
- Roslyn Team Generator Sample Project
- Roslyn Team Generator Cookbook
- Generator.Equals Project
- How To Debug C# 9 Source Generators
我试过了
- 更改生成器和测试项目的 TargetFramework 和 LanguageVersion
- 引用了许多版本的分析器库
Microsoft.CodeAnalysis.CSharp
和Microsoft.CodeAnalysis.Analyzers
- 引用
Microsoft.Net.Compilers.Toolset
的显式版本
- 添加对 NetStandard 库的显式引用
- 使用分析器项目模板从头开始
- 寻找生成器项目模板(但没有找到)
版本
Visual Studio: 版本 16.8.3
.NET SDK:5.0.101
代码
Generator.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0-2.final" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.0.0" PrivateAssets="all" />
</ItemGroup>
</Project>
测试 csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="1.3.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Generator.StaticPropertyEnum\Generator.StaticPropertyEnum.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
</ItemGroup>
</Project>
发电机
[Generator]
public class helloWorld : ISourceGenerator
{
public void Execute(GeneratorExecutionContext context)
{
context.AddSource("HelloWorld-generated.cs", @"
using System;
namespace HelloWorld
{
public static class Hello
{
public static string SayHello() {
return ""HelloWorld"";
}
}
}");
}
public void Initialize(GeneratorInitializationContext context)
{
#if DEBUG
if(!Debugger.IsAttached) Debugger.Launch();
#endif
}
}
Source Generator 必须是 Visual Studio 2019+ 中的 .NET Standard 2.0 到 运行 或 Visual Studio 2017+ 中的 .NET Standard 1.x 到 运行 .
我有针对 netstandard2.0
和 net5.0
的源代码生成器以支持可空性。
<TargetFrameworks>net5.0;netstandard2.0</TargetFrameworks>
<Nullable>enable</Nullable>
和针对相同框架的示例库。
在 Visual Studio 中构建项目时崩溃,但从终端构建正常。
为了解决这个问题,我在使用 SetTagetFramework
将其作为生成器引用时更改了目标框架,现在它编译时没有任何警告或错误。
<ItemGroup>
<ProjectReference Include="..\MyGenerator\MyGenerator.csproj"
OutputItemType="Analyzer" ReferenceOutputAssembly="false"
SetTargetFramework="TargetFramework=netstandard2.0" />
</ItemGroup>
正如@Yair-Halberstadt 在另一个答案中提到的,列出的特定错误是由于当前源代码生成器项目需要以 netstandard2.0 为目标。
但是,如果您使用不同的程序集(例如 Microsoft.CodeAnalysis, Version=3.0.x ...
)遇到 CS8032 错误,您的问题可能是由 SDK 版本不匹配引起的。
例如,在我的计算机上,我有 SDK 5.0.302,它具有 Microsoft.CodeAnalysis
和 Microsoft.CodeAnalysis.CSharp
的 3.10.0 版本。
虽然生成器项目使用 nuget 获取这些包,但引用生成器的项目构建从 SDK 解析这些文件。
这就是为什么恢复到 3.8.0 对一些评论员有用,他们安装的 SDK 版本包含这些引用的 3.8.0。
我不得不从 4.0.0 降级到 3.9 CodeAnalysis Sharp 和 Analyzers。
就这么疯狂
- 关闭并重新打开 Visual Studio(2019 年、2022 年)
- 如果第 1 步不起作用,请删除 .vs 文件夹
解决了我的问题