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

Gus*_*man 13 .net c# roslyn .net-core

我正在尝试将一些.net代码移植到新的Core运行时,并且我在移植一些动态编译时遇到了不好的时间.

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

作为旁注,我不能引用Framework 4.6,因为项目必须发布到带有.net Core的Linux机器上.

这是最小代码:

        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");
Run Code Online (Sandbox Code Playgroud)

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

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

关于如何使用Roslyn和.net Core动态编译的任何想法?

Gus*_*man 15

好吧,让它终于工作了:

    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");
Run Code Online (Sandbox Code Playgroud)

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

  • @nullPainter我尝试了它,但是遇到了问题,如果我以程序独立发布的方式正确地回忆起它,则找不到库。 (2认同)