使用了C#动态编辑器,C# compiler,来动态编译类文件,于是乎遇到错误:命名空间“System”中不存在类型或命名空间名称“Linq”。很明显是缺少引用了。检查类文件,并未发现需要引入Linq的地方,也就是说文件并不需要引入 using System.Linq; 其实主要是编译器的问题。写的类用到 linq下的相关函数,但是有一些方法间接使用了System.Linq中的方法。所以我们必须把 System.Linq;这个些扩展方法的提供体给引用进来。它就是 System.Core.dll;
当我们遇到 命名空间“System”中不存在类型或命名空间名称“Linq”错误时,统一的解决方案就是把 System.Core.dll放到程序的根目录下。或者确实一下能否找到System.Core.dll文件所在的位置。
再尝试添加引用:using System.Linq;
原因解析与解决步骤
这类报错几乎都发生在"动态编译"场景:代码里虽然没有显式写 LINQ,但扩展方法(如 Select、Where、First)编译后需要 System.Linq 命名空间,而它实际位于 System.Core.dll 程序集。CSharpCodeProvider 默认引用列表里没有它,于是编译器找不到类型。
- 用 CSharpCodeProvider 时,在 CompilerParameters 的 ReferencedAssemblies 里补上 System.Core.dll;
- 用 Roslyn 时,在 Workspace 引用里加 MetadataReference.CreateFromFile 定位 System.Core.dll;
- 目标框架低于 3.5 时根本没有 LINQ,需升级目标框架;
- 加完引用后在源码里补上 using System.Linq; 再重新编译验证。