C# 使用Roslyn引用PCL库会导致.NET版本问题

C# 使用Roslyn引用PCL库会导致.NET版本问题,c#,.net,portable-class-library,roslyn,C#,.net,Portable Class Library,Roslyn,我试图使用Roslyn来执行引用PCL库的代码块。我的控制台应用程序和PCL库都是针对.NET 4.5的 语法树执行引用库中构造库类的方法。不应该有.NET 4.0引用 (5,27):错误CS0012:在未引用的程序集中定义了类型“Object”。您必须添加对程序集“System.Runtime,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。 有没有人与PCL和Roslyn有过争执,或者之前有人让它工作过

我试图使用Roslyn来执行引用PCL库的代码块。我的控制台应用程序和PCL库都是针对.NET 4.5的

语法树执行引用库中构造库类的方法。不应该有.NET 4.0引用

(5,27):错误CS0012:在未引用的程序集中定义了类型“Object”。您必须添加对程序集“System.Runtime,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。

有没有人与PCL和Roslyn有过争执,或者之前有人让它工作过

MyCompanyApplication:Program.cs

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
using System;
using System.IO;
using System.Reflection;

namespace MyCompanyApplication
{
  class Program
  {
    static void Main(string[] args)
    {
      EmitResult Result;
      var Options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);

      CSharpCompilation Compilation = CSharpCompilation.Create(
          assemblyName: Path.GetRandomFileName(),
          syntaxTrees: new[] { CSharpSyntaxTree.ParseText(
@"class Test
{
  public void Run(MyCompanyLibrary.Class Class)
  {
    var Label = Class.NewLabel();
  }
}") },
          references: new[] 
          {
            MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
            MetadataReference.CreateFromFile(typeof(MyCompanyLibrary.Class).Assembly.Location),
          },
          options: Options);

      Assembly Assembly = null;
      using (var Stream = new MemoryStream())
      {
        Result = Compilation.Emit(Stream);

        if (Result.Success)
          Assembly = Assembly.Load(Stream.GetBuffer());
      }

      if (Result.Success)
      {
        var TestType = Assembly.GetType("Test");
        var Instance = TestType.GetConstructor(new Type[0]).Invoke(new object[0]);
        var RunMethod = TestType.GetMethod("Run");

        RunMethod.Invoke(Instance, new object[] { new MyCompanyLibrary.Class() });
      }
      else
      {
        Console.WriteLine("Test (PCL) failed");
        Console.ReadLine();
      }
    }
  }
}

class Test
{
  public void Run(MyCompanyLibrary.Class Class)
  {
    var Label = Class.NewLabel();
  }
}
MyCompanyLibrary:Class.cs

namespace MyCompanyLibrary
{
  public class Class
  {
    public Class()
    {
    }

    public Label NewLabel()
    {
      return new Label(this);
    }
  }

  public class Label
  {
    internal Label(Class Class)
    {
      this.Class = Class;
    }

    private Class Class;
  }
}

您正在从“MyCompanyApplication”添加对
对象的引用,该应用程序不是可移植类库

更改此项:

MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
为此:

MetadataReference.CreateFromFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile7\System.Runtime.dll")

您使用的是哪个版本的Visual Studio?Microsoft Visual Studio Professional 2015版本14.0.23107.0 D14REL Microsoft.NET Framework版本4.6.00079切勿将GAC中的程序集用作参考程序集。它们需要来自c:\program files(x86)\reference程序集。巧尽心思隐藏各种4.x版本之间的差异。好的,您必须硬编码路径,并希望机器安装了正确的目标包。在这里使用PCL库是您真正不喜欢的。