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
相关产品推荐
相关产品推荐

