【发布时间】: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 指令或程序集引用?)
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# linq roslyn-code-analysis microsoft.codeanalysis