【问题标题】:CodeAnalysis: Loading Linq Assembly代码分析:加载 Linq 程序集
【发布时间】:2020-03-28 18:15:50
【问题描述】:

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

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

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

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

CS1061 - “List”不包含“Aggregate”的定义,并且找不到接受“List”类型的第一个参数的可访问扩展方法“Aggregate”(您是否缺少 using 指令或程序集引用?)

ChannelsList<>。显然我错过了参考:)。

让我感到困惑的是,我为所有项目加载了某些默认程序集和包:

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 的程序集吗?

【问题讨论】:

  • IIRC,任何Linq方法,如Aggregate,在System.Core程序集中定义,尝试添加
  • 但 .NET Core sources 显示它是在单独的 System.Linq 程序集中定义的
  • 太棒了,@PavelAnikhouski!添加 System.Linq 显式工作。不知道为什么我自己没有想到这一点... :) 如果您愿意将其写成答案,我很乐意接受并投票。

标签: c# linq roslyn-code-analysis microsoft.codeanalysis


【解决方案1】:

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

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

【讨论】:

  • 再次感谢@Pavel。可以问后续吗?如果您熟悉 project.assets.json(我对其进行解析以获取大量所需信息),为什么 System.Linq 未在其中列出需要它的项目?或者,是否有一个清单详细说明 netstandard.dll 中的内容与 netstandard.dll 中没有但需要的内容?
  • @MarkOlbert 我认为,System.Linq 是应用程序中使用的 .NET Core SDK 的一部分。但是,.NET Core 2.x 和 3.x 之间的行为可能会有所不同
猜你喜欢
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多