2016-02-29 9 views
5

referanslar olduğunda derlemeye Roslyn almak nasıl (i PCL'yi ve 4.0.0.0'ı tahmin edin. başvurulan derlemeler Dinamik Microsoft.OData.Client bu kütüphane hem mscorlib 2.0.5.0 başvurular var kullanan bir sınıf inşa ediyorum hem mscorlib 2.0.5.0 ve 4.0.0.0

Sınıfımı daha büyük bir programın parçası olarak roslyn ile derlemek istiyorum, ancak işe yaramaya gelemiyorum. type 'Nesne' başvurulan olmayan bir montaj tanımlanır: My Roslyn derleyici kod

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());     
       } 
     } 

Bunlar

CS0012 olsun hatalardır oldukça minimalist olduğunu. Sen 'Sürüm = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Evet, mscorlib' montaj bir başvuru eklemeniz gerekir.

CS0012: türü 'XmlReader' başvurulan olmayan bir montaj tanımlanır. Sen montaj 'System.XML, Version = 2.0.5.0, nötr Kültür =, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Evet' bir başvuru eklemeniz gerekir.

+0

bir derleme app.config için bu derlemeler için yönlendirmesi ekleyerek denediniz? (Ve * .exe.config uzantısına göre) – Guvante

+0

Ben herhangi bir şey yapmak için derleme yönlendirmesi alamıyorum - aynı zamanda burada sorun olduğunu düşünmüyorum. Sorun büyük olasılıkla roslyn derleyicisini nasıl kuracağım. – sjkp

+0

IIRC 'DesktopAssemblyIdentityComparer' bir kez benim için sorunu çözdü. CSharpCompilationOptions' yanı değişmez 'Ancak unutmayın ki, ... sen' op = op.WithAssemblyIdentityComparer (DesktopAssemblyIdentityComparer.Default) 'denediniz mi? – m0sa

cevap

4

DesktopAssemblyIdentityComparer yorumunda öngörülen gibi bir çözümdür. Ancak, CSharpCompilationOptions değişmez ve WithAssemblyIdentityComparer yöntem yeni bir örnek verir, bu yüzden bu şekilde kullanmak zorunda:

var op = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); 
op = op.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); 
CSharpCompilation compilation = CSharpCompilation.Create(
    assemblyName, 
    syntaxTrees: new[] { syntaxTree }, 
    references: references, 
    options: op); 
İlgili konular