C# Microsoft.CodeAnalysis:使用Newtonsoft JObject编译动态代码时出错

C# Microsoft.CodeAnalysis:使用Newtonsoft JObject编译动态代码时出错,c#,json.net,roslyn,dynamic-code,microsoft.codeanalysis,C#,Json.net,Roslyn,Dynamic Code,Microsoft.codeanalysis,我有一个奇怪的问题,我无法解决。我已经成功地编译了动态程序集,但在编译以下代码行时遇到了一个奇怪的问题: 返回新的JObject().Properties().ElementAt(0.Value() 错误如下: System.ApplicationException: 'Error creating dynamic code assembly 'IEnumerable<JProperty>' does not contain a definition for 'ElementAt'

我有一个奇怪的问题,我无法解决。我已经成功地编译了动态程序集,但在编译以下代码行时遇到了一个奇怪的问题:

返回新的JObject().Properties().ElementAt(0.Value()

错误如下:

System.ApplicationException: 'Error creating dynamic code assembly 'IEnumerable<JProperty>' does not contain a definition for 'ElementAt' and no accessible extension method 'ElementAt' accepting a first argument of type 'IEnumerable<JProperty>' could be found (are you missing a using directive or an assembly reference?) '
System.ApplicationException:“创建动态代码程序集'IEnumerable'时出错,该程序集不包含'ElementAt'的定义,并且找不到接受'IEnumerable'类型的第一个参数的可访问扩展方法'ElementAt'(是否缺少using指令或程序集引用?)
当在项目中创建为真实类时,发出的文本输出可以正常工作,但在动态程序集中则不行。该项目是asp.net core 2.2项目,它引用了创建动态程序集的程序集

以下是创建程序集的代码:

public static class Class2
{
    public static Assembly GenerateAssenbly()
    {

        //generate the code
        StringBuilder sb = new StringBuilder("");
        sb.AppendLine("using System;");
        sb.AppendLine("using System.Linq;");

        sb.AppendLine("using Newtonsoft.Json;");
        sb.AppendLine("using Newtonsoft.Json.Linq;");

        sb.AppendLine("namespace test");
        sb.AppendLine("{");
        sb.AppendLine($"class Parser");
        sb.AppendLine("{");

        sb.AppendLine($"public object test() ");
        sb.AppendLine("{");
        sb.AppendLine("return new JObject().Properties().ElementAt(0).Value<string>();");
        sb.AppendLine("}");

        sb.AppendLine("}"); //class
        sb.AppendLine("}"); //namespace

        SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(sb.ToString());

        var runtimeAssemblyDirectory = Path.GetDirectoryName(typeof(object).Assembly.Location);
        string assemblyName = Path.GetRandomFileName();
        MetadataReference[] references = new MetadataReference[]
        {
            MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location),
            MetadataReference.CreateFromFile(Assembly.GetExecutingAssembly().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")),

            MetadataReference.CreateFromFile(typeof(JObject).GetTypeInfo().Assembly.Location),
        };

        CSharpCompilation compilation = CSharpCompilation.Create(
            assemblyName,
            syntaxTrees: new[] { syntaxTree },
            references: references,
            options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));


        Debug.Print(sb.ToString()); // copy output to a class to test

        using (var ms = new MemoryStream())
        {
            EmitResult result = compilation.Emit(ms);

            if (!result.Success)
            {
                throw new ApplicationException($"Error creating dynamic code assembly " + GetCompilerResultsErrors(result));
            }
            else
            {
                return Assembly.Load(ms.GetBuffer());
            }
        }
    }

    private static string GetCompilerResultsErrors(EmitResult result)
    {
        StringBuilder sb = new StringBuilder();

        IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
            diagnostic.IsWarningAsError ||
            diagnostic.Severity == DiagnosticSeverity.Error);

        foreach (Diagnostic diagnostic in failures)
        {
            sb.AppendLine(diagnostic.GetMessage());
        }

        return sb.ToString();
    }
}
公共静态类2
{
公共静态程序集GenerateAssembly()
{
//生成代码
StringBuilder sb=新的StringBuilder(“”);
sb.附录(“使用系统;”;
sb.AppendLine(“使用System.Linq;”);
sb.AppendLine(“使用Newtonsoft.Json;”);
sb.AppendLine(“使用Newtonsoft.Json.Linq;”);
sb.AppendLine(“名称空间测试”);
某人附加物(“{”);
sb.AppendLine($“类解析器”);
某人附加物(“{”);
sb.AppendLine($“public object test()”);
某人附加物(“{”);
sb.AppendLine(“returnnewjobject().Properties().ElementAt(0.Value();”);
(b)附加物(“}”);
sb.AppendLine(“}”);//类
sb.AppendLine(“}”);//名称空间
SyntaxTree SyntaxTree=CSharpSyntaxTree.ParseText(sb.ToString());
var runtimeAssemblyDirectory=Path.GetDirectoryName(typeof(object.Assembly.Location);
string assemblyName=Path.GetRandomFileName();
MetadataReference[]引用=新MetadataReference[]
{
MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location),
MetadataReference.CreateFromFile(Assembly.getExecutionGassembly().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”),
MetadataReference.CreateFromFile(typeof(JObject.GetTypeInfo().Assembly.Location),
};
csharpcomilation=csharpcomilation.Create(
汇编名,
syntaxTrees:new[]{syntaxTree},
参考文献:参考文献,
选项:新的CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
Debug.Print(sb.ToString());//将输出复制到要测试的类
使用(var ms=new MemoryStream())
{
EmitResult=compilation.Emit(毫秒);
如果(!result.Success)
{
抛出新的ApplicationException($“创建动态代码程序集时出错”+GetCompilerResultsErrors(结果));
}
其他的
{
返回Assembly.Load(ms.GetBuffer());
}
}
}
私有静态字符串GetCompilerResultErrors(EmitResult)
{
StringBuilder sb=新的StringBuilder();
IEnumerable failures=result.Diagnostics.Where(Diagnostics=>
诊断警告错误||
诊断严重性==诊断严重性错误);
foreach(故障诊断)
{
sb.AppendLine(diagnostic.GetMessage());
}
使某人返回字符串();
}
}
(所示代码并非用于工作目的,而是经过简化以演示问题)


提前感谢,

解决方案是添加特定参考:

MetadataReference.CreateFromFile(Path.Combine(runtimeAssemblyDirectory, "System.Linq.Expressions.dll")),
MetadataReference.CreateFromFile(Path.Combine(runtimeAssemblyDirectory, "System.Linq.dll")),