Roslyn 动态 class 生成问题

Roslyn dynamic class generation issue

所以我正在尝试使用 Roslyn 创建一个动态类型(在运行时)。这个要求的整个背景故事太长了,无法深入探讨。但是,我确实需要创建一个具有 x 多个属性的新类型,我试图在其中输入 属性 名称和来自 Dictionary

的初始值

这里是相关代码

private void CreateAssembly(Dictionary<string, string> propertiesToEmit)
{
    if (ourAssembly == null)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("using System;");
        sb.AppendLine("public class MyClass");
        sb.AppendLine("{");
        sb.AppendLine("  public static void Main()");
        sb.AppendLine("  {");
        sb.AppendLine("  }");
        foreach (var kvp in propertiesToEmit)
        {
            sb.AppendLine($"  public {kvp.Value} {kvp.Key}" + " { get; set; }");
        }
        sb.AppendLine("  public  MyClass CreateFromDynamic(Dictionary<string, object> sourceItem)");
        sb.AppendLine("  {");
        sb.AppendLine("     MyClass newOne = new MyClass();");
        foreach (var kvp in propertiesToEmit)
        {
            sb.AppendLine($@"  newOne.{kvp.Key} = sourceItem[""{kvp.Key}""];");
        }
        sb.AppendLine("  return newOne;");
        sb.AppendLine("  }");
        sb.AppendLine("}");

        var tree = CSharpSyntaxTree.ParseText(sb.ToString());
        var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
        var dictsLib = MetadataReference.CreateFromFile(typeof(Dictionary<,>).Assembly.Location);

        var compilation = CSharpCompilation.Create("MyCompilation",
            syntaxTrees: new[] { tree }, references: new[] { mscorlib, dictsLib });

        //Emit to stream
        var ms = new MemoryStream();
        var emitResult = compilation.Emit(ms);

        //Load into currently running assembly. Normally we'd probably
        //want to do this in an AppDomain
        ourAssembly = Assembly.Load(ms.ToArray());
    }
}

我在使用 Roslyn 时遇到了这个奇怪的错误,它似乎找不到对 Dictionary<,> 的引用,即使它在被引用的 mscorlib 中也是如此。

可以清楚地看到,Dictionary<,>确实存在于被引用的dll(即mscorlib)中。

有什么想法吗?

好的,我找到了答案,我忘记在我使用 Roslyn 创建的代码中添加这个 using 语句

sb.AppendLine("using System.Collections.Generic;");