首页 > 解决方案 > 代码分析:加载 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 的程序集吗?

标签: c#linqroslyn-code-analysismicrosoft.codeanalysis

解决方案


根据 .NET Core 源代码(Aggregate方法AssemblyInfo.csSystem.Linq.csproj文件),所有方法都在System.Linq程序集中定义(但在 .NET Framework 中,它们都在System.Core程序集中)。

所以,尝试添加和加载System.Linq程序集


推荐阅读