CodeAnalysis:加载 Linq 程序集

CodeAnalysis: Loading Linq Assembly

我正在编写一个应用程序,它使用 Roslyn API 来提取有关 C# 源代码文件中定义的符号的信息。它通过编译内存中的源代码然后扫描它来完成此操作。为了完成这项工作,我必须加载源代码引用的程序集和 nuget 包。

效果很好……直到我开始分析一些包含一些简单 Linq 表达式的源代码,如下所示:

return Channels.Aggregate( retVal, ( current, channel ) => current | channel.Channel );

该代码的作用的细节并不重要。但是当代码库在内存中编译时,源代码中的那一行会产生以下诊断错误:

CS1061 - 'List' does not contain a definition for 'Aggregate' and no accessible extension method 'Aggregate' accepting a first argument of type 'List' could be found (are you missing a using directive or an assembly reference?)

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 method, AssemblyInfo.cs and System.Linq.csproj files), all methods are defined in System.Linq assembly (but in .NET Framework they are in System.Core 程序集)。

因此,尝试添加和加载 System.Linq 程序集