c# - 代码分析:加载 Linq 程序集
问题描述
我正在编写一个应用程序,它使用 Roslyn API 来提取有关 C# 源代码文件中定义的符号的信息。它通过在内存中编译源代码然后扫描它来做到这一点。为了完成这项工作,我必须加载源代码引用的程序集和 nuget 包。
效果很好......直到我开始分析一些包含一些简单 Linq 表达式的源代码,如下所示:
return Channels.Aggregate( retVal, ( current, channel ) => current | channel.Channel );
该代码的作用的细节并不重要。但是当代码库在内存中编译时,在源代码中包含该行会产生以下诊断错误:
CS1061 - “List”不包含“Aggregate”的定义,并且找不到接受“List”类型的第一个参数的可访问扩展方法“Aggregate”(您是否缺少 using 指令或程序集引用?)
Channels
是一个List<>
。显然我缺少参考:)。
令我困惑的是,我为所有项目加载了某些默认程序集和包:
okay &= TryAddMetadataReference( "netstandard", result );
okay &= TryAddMetadataReference( "System.Private.CoreLib", result );
okay &= TryAddMetadataReference( "System.Private.Uri", result );
okay &= TryAddMetadataReference( "System.Runtime.Extensions", result );
同样,我认为这段代码所做的细节并不重要。所有这些调用都成功了,这意味着找到了所有目标程序集并将其加载到编译环境中。
然而,由于找不到 Linq 代码,该 Linq 表达式被拒绝了。
我需要添加另一个特定于 Linq 的程序集吗?
解决方案
根据 .NET Core 源代码(Aggregate
方法AssemblyInfo.cs
和System.Linq.csproj
文件),所有方法都在System.Linq
程序集中定义(但在 .NET Framework 中,它们都在System.Core
程序集中)。
所以,尝试添加和加载System.Linq
程序集
推荐阅读
- testing - 如何定义用于 Oculus 远程监视器的“远程变量”?
- javascript - Javascript后置摄像头
- android - 滚动时 Listview 中的 Android 项目重叠
- java - 使用 JsonSubTypes 的 InvalidSchemaException,没有选择我在基本接口中定义的内容
- mysql - Mysql where 子句在主键字段上接受带有字符串的整数
- hive - 如何将字符串格式的日期(“April 25, 2018”)转换为 hive 中的时间戳?
- php - 在 PHP 中从 REST API 读取 JSON - 无数据
- angular - 在 Angular 6 中从控制台隐藏 IE 警告
- javascript - 元素句柄的 Puppeteer 循环不起作用
- java - 在 ClientInterceptor 上使用 grpc-java 在元数据中包含消息哈希?