SourceGenerator 分析器包在 Visual Studio 2022 年有效,但在 2019 年无效

SourceGenerator analyzer package works in Visual Studio 2022 but not in 2019

我们最近一直在我们的产品中测试源代码生成器,目前为止一切都很好。但是,我的一位使用 VS 2019 的同事在使用分析器将项目 运行 时遇到问题,但在 VS 2022 上似乎 运行 没问题。

我在 2019 年收到此警告消息:

Warning CS8032  An instance of analyzer 
...Generator cannot be created from analyzer\...\analyzers\dotnet\cs\Analyzer.dll:
Could not load file or assembly 
'Microsoft.CodeAnalysis, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 
or one of its dependencies.
The system cannot find the file specified

我的生成器项目如下所示:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
        <Authors>...</Authors>
        <Description>...</Description>
        <Copyright>$(Authors)</Copyright>
        <AssemblyVersion></AssemblyVersion>
        <FileVersion></FileVersion>
        <Deterministic>false</Deterministic>
        <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
        <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
        <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
        <Version />
        <PackageTags>Analyzer</PackageTags>
        <IncludeBuildOutput>false</IncludeBuildOutput>
    </PropertyGroup>

    <ItemGroup>
      <None Remove="config.xml" />
    </ItemGroup>

    <ItemGroup>
        <Content Include="config.xml" CopyToOutputDirectory="Always" Pack="false"/>
    </ItemGroup>

    <ItemGroup>
        <None Include="$(OutputPath)$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    </ItemGroup>
    
    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.1.0" />
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.1.0" />
    </ItemGroup>

</Project>

和运行后生成的nuspec dotnet pack:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>...Analyzer</id>
    <version>...</version>
    <authors>...</authors>
    <description>...</description>
    <copyright>...</copyright>
    <tags>Analyzer</tags>
    <dependencies>
      <group targetFramework=".NETStandard2.0">
        <dependency id="Microsoft.CodeAnalysis.CSharp" version="4.1.0" exclude="Build,Analyzers" />
        <dependency id="Microsoft.CodeAnalysis.Common" version="4.1.0" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>
</package>

只有我们的分析器 dll 在 analyzers\dotnet\cs\ 下。消费者项目如下所示:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net472</TargetFramework>
        <UseWPF>true</UseWPF>
        <UseWindowsForms>true</UseWindowsForms>
        <deterministic>false</deterministic>
        <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>

这一切看起来都是正确的,并且在消费者项目中添加了正确的 nuget 依赖项,所以我不确定我还能做错什么。这是 2019 年和 2022 年不同的 .NET 目标问题吗?

到目前为止我已经:

  1. 清除了 nuget 缓存
  2. 删除了 .vs 文件夹
  3. 重启 VS 2019

运气不好。感谢任何帮助。

如果您在生成器中依赖 Roslyn 4.1 版,这意味着您的最低 VS 版本将是 VS2022 17.1。如果要支持VS2019,需要参考一些3.*版本的Roslyn。