当前位置: 首页 > news >正文

【踩坑】Roslyn 5与VS2022——不散的红色浪线

本文地址:https://www.cnblogs.com/oberon-zjt0806/p/19429665

首先祝大家2026新年快乐!🎉🐴

先说本文的结论——

Visual Studio 2022的IntelliSense似乎不能和Roslyn 5.0良好配合,导致MSBuild无法加载到生成器构建的代码
如果想在Visual Studio 2022中使用代码分析服务,请确保引用的Nuget包Microsoft.CodeAnalysis的版本为4.x
MSDN文档列举了Roslyn版本与具体IDE的兼容情况,详见这里
另外,如果目标项目的CS0103或者CS0246没有立即褪去,那么你需要关闭报错的文件,清理并重新生成解决方案。

前请提要

昨天想接触一下传说中的源代码生成器(Source Generator),于是就查了一堆资料照猫画虎写了一个——

/// 生成器程序集 SourceGeneratorDemo.Generators
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System.Text;namespace SourceGeneratorDemo.Generators;[Generator]
public class HelloWorldGenerator : IIncrementalGenerator
{public void Initialize(IncrementalGeneratorInitializationContext context){// A simple pipeline that always produces a single stringvar helloSource = context.AnalyzerConfigOptionsProvider.Select((_, _) => @"
namespace SourceGeneratorDemo.Generated
{public class GeneratedProgram{public static void HelloWorld(){Console.WriteLine(""Hello from incremental generator!"");}}
}
");context.RegisterSourceOutput(helloSource, (spc, source) =>{spc.AddSource("GeneratedProgram.g.cs", SourceText.From(source, Encoding.UTF8));});}
}

显然这个生成器预期产生下面这段代码,一个简单的Hello World类——

namespace SourceGenerator.Generated
{public class GeneratedProgram{public static void HelloWorld(){Console.WriteLine(""Hello from incremental generator!"");}}
}

然后安装了Roslyn,也就是Microsoft.CodeAnalysis包。按照项目配置了

<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>

然后在目标项目(此时是空的)中引用生成的代码。首先将生成器项目引入——

<!-- 目标项目 SourceGeneratorDemo.csproj -->
<ItemGroup><ProjectReference Include="..\SourceGeneratorDemo.HelloWorldGenerator\SourceGeneratorDemo.Generators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>

我们生成的代码在SourceGenerator.Generated命名空间下,包含一个类GeneratedProgram,带有一个方法void HelloWorld();

// 目标项目 Program.cs
using static System.Console;
using SourceGenerator.Generated;GeneratedProgram.HelloWorld(); // 直接使用了顶级语句

当写完上面这部分的时候在生成之前,SourceGenerator.GeneratedGeneratedProgram是会标红色波浪线的(前者为CS0246,后者为CS0103),这是正常的,因为生成的代码还没有通过编译器加载到目标项目。所以自然是找不到生成的这些元素的。

按照预期,只要我生成运行整个解决方案,那么Roslyn会调用生成器SourceGeneratorDemo.Generators.HelloWorldGenerator 生成出预期的代码,然后将这段生成的代码加入到目标项目中来。只要我重新打开Program.cs,IntelliSense就应该正确解析SourceGenerator.GeneratedGeneratedProgram这两个符号。

有趣的部分

然而,有趣的部分来了,虽然在生成解决方案之后目标项目被正确构建并且弹出了控制台输出了

Hello World

但是Program.cs中的红色波浪线依然没有消失!也就是说编辑器还在提示我CS0103和CS0246,也就是IntelliSense还是找不到SourceGeneratorDemo.GeneratedGeneratedProgram。按下F12也不能导航到生成代码下。

在多次重启IDE、清理重新构建项目、删除.vs缓存之后问题仍然存在,在网上搜了半天,没找到有效的解决方法(可能也是我想尽办法也没有描述清楚),于是就开始问Copilot。

Good End

与 Copilot battle了半天(查看需要T子),期间尝试过找茬<ProjectReference>namespace以及<EnforceExtendedAnalyzerRules>等诸多要素。最终确定,问题出在生成器项目的项目文件——

<ItemGroup><PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="5.0.0" PrivateAssets="all" />
</ItemGroup>

VS2022在安装时自动选择了5.0版本,虽然能正确生成和运行项目,但是与VS2022 IDE使用的Roslyn版本不匹配(Copilot是如此声称的)。

最终我们发现只要把Version改为4.14.0,清理并重新生成解决方案,重新打开Program.cs就不再有问题了。

http://www.jsqmd.com/news/175938/

相关文章:

  • Nginx+Docker组合拳,轻松搞定微服务负载均衡,99%的人都忽略了这一点
  • ServerStatus终极监控指南:三分钟搭建专业级云探针系统
  • 通达信day格式文件快速转换工具:金融数据分析的终极解决方案
  • 模糊测试工具的高级应用技巧与实践指南
  • 免费开源刺绣设计终极方案:Ink/Stitch完整快速指南
  • 突破传统:5种创新方式构建下一代AI应用
  • 2025年口碑好的电源定制全方位厂家推荐(综合榜) - 品牌宣传支持者
  • 2025年质量好的PTC纯水加热器热门厂家排行TOP(权威版) - 品牌宣传支持者
  • Docker微服务负载均衡配置避坑指南(90%项目都踩过的5大陷阱)
  • NexaSDK CLI终极指南:快速上手本地AI模型部署
  • 【Docker微服务负载均衡实战】:5步实现高可用服务架构
  • 2025年口碑好的精雕亚克力产品加工/亚克力产品加工厂家口碑热榜(用户推荐) - 品牌宣传支持者
  • MyBatis数据源架构:3分钟掌握连接池优化核心技巧
  • 如何快速提取APK文件中的网络端点:完整安全分析指南
  • libcurl终极配置指南:32位/64位dll快速集成全解析
  • Pock插件开发实战:从零构建Touch Bar自定义组件
  • 2025年评价高的自动化框架钣金加工厂家推荐及采购参考 - 品牌宣传支持者
  • 构建下一代AI制品供应链:FOLib的模块化架构与演进蓝图
  • 2025年靠谱的5G杆生产设备厂家最新TOP实力排行 - 品牌宣传支持者
  • 揭秘Docker多容器并发运行难题:5个关键步骤实现高效并行处理
  • 思源笔记 vs Obsidian:2025年终极使用体验深度评测
  • 揭秘Cilium在Docker中的安全机制:如何构建零信任网络(附配置模板)
  • nteract:下一代交互式计算平台,让Jupyter焕发新生
  • 告别模糊困扰:SeedVR让每一帧视频都重获新生
  • device_map简易模型并行:自动分配层到多张显卡
  • 2025年评价高的工业水性涂料厂家信誉综合榜(权威) - 品牌宣传支持者
  • AI人像真实化技术革命:告别塑料感,拥抱自然之美
  • PyTorch模型计算复杂度分析与移动端部署优化策略
  • 完整掌握数据挖掘:韩家炜最新版课件获取指南
  • 破局之道:LaTeX简历模板如何帮你实现技能跨行业转化