You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Microsoft.CodeAnalysis动态编译含Newtonsoft JObject代码遇ElementAt报错求助

解决动态编译程序集时找不到ElementAt扩展方法的问题

我碰到过类似的动态编译坑,你的情况本质是:静态编译时项目会自动帮你处理依赖程序集的引用,但动态编译必须手动添加所有必要的程序集——哪怕你已经在代码里加了对应的using指令也没用。

问题根源

ElementAt是System.Linq.Enumerable类里的扩展方法,在.NET Core 2.2环境下,这个类属于System.Linq.dll。你现在的动态编译代码里,虽然源码写了using System.Linq;,但MetadataReference数组里根本没加这个程序集,编译器自然找不到这个方法。

解决方案

直接在你的引用数组里添加System.Linq.dll的引用,而且用typeof获取路径是最可靠的,不用硬拼目录路径:

MetadataReference[] references = new MetadataReference[] {
    MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location),
    MetadataReference.CreateFromFile(Assembly.GetExecutingAssembly().Location),
    // 新增这一行,指向System.Linq.Enumerable所在的程序集
    MetadataReference.CreateFromFile(typeof(System.Linq.Enumerable).GetTypeInfo().Assembly.Location),
    MetadataReference.CreateFromFile(typeof(JObject).GetTypeInfo().Assembly.Location),
    // 保留你原有的其他必要引用
    MetadataReference.CreateFromFile(Path.Combine(runtimeAssemblyDirectory, "System.Runtime.dll")),
    MetadataReference.CreateFromFile(Path.Combine(runtimeAssemblyDirectory, "mscorlib.dll")),
    MetadataReference.CreateFromFile(Path.Combine(runtimeAssemblyDirectory, "System.dll")),
    MetadataReference.CreateFromFile(Path.Combine(runtimeAssemblyDirectory, "netstandard.dll")),
    MetadataReference.CreateFromFile(Path.Combine(runtimeAssemblyDirectory, "System.Core.dll")),
};

额外小建议

  • 你可以考虑移除一些冗余引用,比如.NET Core环境下mscorlib.dll其实不是必须的,不过留着也不会出错。
  • 你的测试代码里new JObject().Properties().ElementAt(0)运行时会抛ArgumentOutOfRangeException,因为空JObject没有任何属性,只是提前提醒你一下这个小问题~

内容的提问来源于stack exchange,提问作者rakewell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:27:30