2016-02-29 14 views
5

Tôi đang xây dựng một lớp động có sử dụng Microsoft.OData.Client thư viện này có tham chiếu đến cả mscorlib 2.0.5.0 (i đoán PCL) và 4.0.0.0. enter image description hereCách lấy roslyn để biên dịch khi các assembly được tham chiếu có tham chiếu đến cả hai mscorlib 2.0.5.0 và 4.0.0.0

Tôi muốn biên dịch lớp học của mình bằng roslyn, như một phần của chương trình lớn hơn, nhưng tôi dường như không làm cho nó hoạt động. My Roslyn đang biên dịch là khá Minimalistic

SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(s); 
      string assemblyName = Path.GetRandomFileName(); 

      List<MetadataReference> references = new List<MetadataReference>() 
      { 
       MetadataReference.CreateFromFile(typeof(DataServiceActionQuery).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(ODataAction).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(GeneratedCodeAttribute).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(IEdmModel).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(TimeOfDay).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(object).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(XmlDocument).Assembly.Location), 
       // MetadataReference.CreateFromFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile328\mscorlib.dll") 

      }; 

      references.AddRange(Directory.GetFiles(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades").Select(f => MetadataReference.CreateFromFile(f))); 

      var op = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); 
      //op.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); 
      //CSharpCompilationOptions.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); 
      CSharpCompilation compilation = CSharpCompilation.Create(
       assemblyName, 
       syntaxTrees: new[] { syntaxTree }, 
       references: references, 
       options: op); 
      Assembly assembly = null; 
      using (var ms = new MemoryStream()) 
      { 
       EmitResult result = compilation.Emit(ms); 

       if (!result.Success) 
       { 
        IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => 
         //diagnostic.IsWarningAsError || 
         diagnostic.Severity == DiagnosticSeverity.Error); 

        foreach (Diagnostic diagnostic in failures) 
        { 
         Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage()); 
        } 
       } 
       else 
       { 
        ms.Seek(0, SeekOrigin.Begin); 
        assembly = Assembly.Load(ms.ToArray());     
       } 
     } 

Đây là những lỗi tôi nhận được

CS0012: Loại 'Object' được định nghĩa trong một hội đồng đó không được tham chiếu. Bạn phải thêm tham chiếu đến assembly 'mscorlib, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Yes'.

CS0012: Loại 'XmlReader' được xác định trong một hội đồng không được tham chiếu. Bạn phải thêm tham chiếu vào assembly 'System.Xml, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Yes'.

+0

Bạn đã thử thêm một lắp ráp chuyển hướng cho các hội đồng để app.config của bạn? (Và bằng cách mở rộng cho * .exe.config) – Guvante

+0

Tôi không thể có được chuyển hướng lắp ráp để làm bất cứ điều gì - cũng không nghĩ rằng đó là vấn đề ở đây. Vấn đề là rất có thể làm thế nào tôi thiết lập trình biên dịch roslyn. – sjkp

+0

IIRC 'DesktopAssemblyIdentityComparer' đã giải quyết vấn đề cho tôi một lần. Tuy nhiên, lưu ý rằng 'CSharpCompilationOptions' cũng không thay đổi ... bạn đã thử' op = op.WithAssemblyIdentityComparer (DesktopAssemblyIdentityComparer.Default) '? – m0sa

Trả lời

4

Như bạn đã dự đoán trong các ý kiến ​​DesktopAssemblyIdentityComparer là giải pháp. Tuy nhiên, CSharpCompilationOptions là không thay đổi, và các phương pháp WithAssemblyIdentityComparer trả về một thể hiện mới, vì vậy bạn phải sử dụng nó như thế này:

var op = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); 
op = op.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); 
CSharpCompilation compilation = CSharpCompilation.Create(
    assemblyName, 
    syntaxTrees: new[] { syntaxTree }, 
    references: references, 
    options: op); 
Các vấn đề liên quan