【问题标题】:.net Core amd Roslyn CSharpCompilation, The type 'Object' is defined in an assembly that is not referenced.net Core amd Roslyn CSharpCompilation,“对象”类型是在未引用的程序集中定义的
【发布时间】:2017-01-08 11:38:05
【问题描述】:

我正在尝试将一些 .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");

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

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

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

【问题讨论】:

    标签: c# .net roslyn .net-core


    【解决方案1】:

    好的,终于搞定了:

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

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

    【讨论】:

    • 获取运行时目录的更优雅的方法是使用System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();,而不是获取任意类型的程序集位置。
    • @nullPainter 我试过但有问题,如果我没记错的话,如果程序作为独立版本发布,它会找不到库。
    • 您是否尝试过使用 MetadataReference.CreateFromFile(typeof(object).Assembly.Location)(使用小写的 'o')?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2020-10-12
    • 2016-09-04
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多