.net Core amd Roslyn CSharpCompilation,类型 'Object' 在未引用的程序集中定义

.net Core amd Roslyn CSharpCompilation, The type 'Object' is defined in an assembly that is not referenced

我正在尝试将一些 .net 代码移植到新的 Core 运行时,但我在移植一些即时编译时遇到了麻烦。

要恢复,它总是要求我提供对 System.Runtime 和 mscorlib 的引用,但不知道如何引用它们。

附带说明一下,我不能引用 Framework 4.6,因为项目必须发布到 Linux 带有 .net Core 的机器。

这是最低代码:

        string testClass = @"using System; 
        namespace test{

         public class tes
         {

           public string unescape(string Text)
          { 
            return Uri.UnescapeDataString(Text);
          } 

         }

        }";

        var compilation = CSharpCompilation.Create(Guid.NewGuid().ToString() + ".dll")
            .WithOptions(new CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary))
            .AddReferences(
            MetadataReference.CreateFromFile(typeof(Object).GetTypeInfo().Assembly.Location),
            MetadataReference.CreateFromFile(typeof(Uri).GetTypeInfo().Assembly.Location)
            )
            .AddSyntaxTrees(CSharpSyntaxTree.ParseText(testClass));

        var eResult = compilation.Emit("test.dll");

它总是抱怨需要 mscorlib(在这个例子中)和 System.Runtime(在我的真实项目中)。

我正在使用 Microsoft.CodeAnalysis.CSharp 软件包版本 2.0.0-beta3

关于如何使用 Roslyn 和 .net Core 进行即时编译有什么想法吗?

好的,终于成功了:

    string testClass = @"using System; 
    namespace test{

     public class tes
     {

       public string unescape(string Text)
      { 
        return Uri.UnescapeDataString(Text);
      } 

     }

    }";

    var dd = typeof(Enumerable).GetTypeInfo().Assembly.Location;
    var coreDir = Directory.GetParent(dd);

    var compilation = CSharpCompilation.Create(Guid.NewGuid().ToString() + ".dll")
        .WithOptions(new CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary))
        .AddReferences(
        MetadataReference.CreateFromFile(typeof(Object).GetTypeInfo().Assembly.Location),
        MetadataReference.CreateFromFile(typeof(Uri).GetTypeInfo().Assembly.Location),
        MetadataReference.CreateFromFile(coreDir.FullName + Path.DirectorySeparatorChar + "mscorlib.dll"),
        MetadataReference.CreateFromFile(coreDir.FullName + Path.DirectorySeparatorChar + "System.Runtime.dll")
        )
        .AddSyntaxTrees(CSharpSyntaxTree.ParseText(testClass));

    var eResult = compilation.Emit("test.dll");

我不喜欢它,因为硬编码,但它似乎是让它工作的唯一方法。