.net Core和Roslyn CSharpCompilation,类型'Object'在未引用的程序

本文关键字:引用 程序 Object Core CSharpCompilation 类型 net Roslyn | 更新日期: 2023-09-27 18:05:06

我正在尝试移植一些。net代码到新的Core运行时,我有一个糟糕的时间移植一些动态编译。

要回复,它总是要求我提供System的参考。运行时和mscorlib,但不知道如何引用它们。

作为旁注,我不能引用框架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。运行时(在我的实际项目中)。

我使用的是Microsoft.CodeAnalysis.CSharp软件包版本2.0.0-beta3

关于如何与Roslyn和。net Core一起编译的任何想法?

.net Core和Roslyn CSharpCompilation,类型'Object'在未引用的程序

好了,终于修好了:

    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");

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