2015-04-08 9 views
6

Sto lavorando a un progetto in cui compilo progetti da una soluzione che utilizza Roslyn.La compilazione di Roslyn non risolve i riferimenti mscorlib

foreach (var projectId in solution.GetProjectDependencyGraph().GetTopologicallySortedProjects()) 
{ 
    var project = solution.GetProject(projectId); 
    var compilation = project.GetCompilationAsync().Result; 
    var errors = compilation.GetDiagnostics().Where(d => d.Severity == DiagnosticSeverity.Error); 
    // ... 

compilazione contiene errori come

errore CS0012: Il tipo 'Task' è definito in un assembly che non è riferimento. È necessario aggiungere un riferimento all'assieme 'System.Threading.Tasks, Versione = 4.0.0.0, Cultura = neutra, PublicKeyToken = b03f5f7f11d50a3a'.

Perché Roslyn non accetta un riferimento esistente a mscorlib?

  • msdn for System.Threading.Task sottolinea che questo tipo è infatti situato in mscorlib.dll
  • PublicKeyToken b03f5f7f11d50a3a corrisponde di mscorlib

sono lì qualche CompilationOptions che dovrebbe prendere in considerazione? Per this thread Ho provato assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default ma non è stato d'aiuto. Ho provato a lavorare con metadataReferenceResolver ma non sono riuscito a trovare molte informazioni a riguardo.

Dopo la soluzione in Roslyn has no reference to System.Runtime ho implementato il codice che assicura che un progetto ha riferimenti a Mscorlib.dll, System.Core.dll, System.dll e System.Runtime.dll, in modo tale che il mio progetto e compilazione avere i riferimenti:

Nota a margine: il riferimento 7 è stato aggiunto in questo modo. Il progetto aveva già riferimenti # 1, 2 e 3, e rimuovendoli e sostituendoli con quelli di C: \ Windows \ Microsoft.NET \ Framework non ha risolto il problema.

project.MetadataReferences.ToList() 
Count = 8 
    [0]: Assembly Path='C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll' 
    [1]: Assembly Path='C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll' 
    [2]: Assembly Path='C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll' 
    [3]: Assembly Path='C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll' 
    [4]: Assembly Path='C:\Users\Amadeus\Documents\GitHub\InterProcessQueue\src\MemoryMappedQueue\packages\xunit.runner.visualstudio.2.0.0-rc1-build1030\build\_common\xunit.abstractions.dll' 
    [5]: Assembly Path='C:\Users\Amadeus\Documents\GitHub\InterProcessQueue\src\MemoryMappedQueue\packages\xunit.assert.2.0.0-rc1-build2826\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll' 
    [6]: Assembly Path='C:\Users\Amadeus\Documents\GitHub\InterProcessQueue\src\MemoryMappedQueue\packages\xunit.extensibility.core.2.0.0-rc1-build2826\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll' 
    [7]: Assembly Path='C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.dll' 

compilation.ExternalReferences.ToList() 
Count = 9 
    [0]: Assembly Path='C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll' 
    [1]: Assembly Path='C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll' 
    [2]: Assembly Path='C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll' 
    [3]: Assembly Path='C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll' 
    [4]: Assembly Path='C:\Users\Amadeus\Documents\GitHub\InterProcessQueue\src\MemoryMappedQueue\packages\xunit.runner.visualstudio.2.0.0-rc1-build1030\build\_common\xunit.abstractions.dll' 
    [5]: Assembly Path='C:\Users\Amadeus\Documents\GitHub\InterProcessQueue\src\MemoryMappedQueue\packages\xunit.assert.2.0.0-rc1-build2826\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll' 
    [6]: Assembly Path='C:\Users\Amadeus\Documents\GitHub\InterProcessQueue\src\MemoryMappedQueue\packages\xunit.extensibility.core.2.0.0-rc1-build2826\lib\portable-net45+aspnetcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll' 
    [7]: Assembly Path='C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.dll' 
    [8]: Compilation (C#): MemoryMappedQueue 
  • Come posso ottenere Roslyn per compilare questo progetto?
  • C'è qualche CompilationOptions che dovrei usare?
  • È correlato a Roslyn's issue #970?
+0

[Assomiglia a questo] (https://support.microsoft.com/en-us/kb/2971005). È ancora di qualità beta, zoppicante aggiungendo il riferimento. Si trova nella sottodirectory * Facades *. –

+0

Sì, è simile a questo, ma questa soluzione non ha risolto il problema. Proverò a pubblicare una soluzione minima in cui questo problema si verifica. –

risposta

0

Il progetto che sta producendo gli errori è un progetto non portatile che fa riferimento a un progetto portatile? In tal caso, osserva this answer - dovrai aggiungere riferimenti di facciata.

+0

No, entrambi i progetti nella soluzione sono librerie di classi con targeting .NET 4.5 –

+0

In realtà, l'unità x di riferimento.core è un PCL –

2

Come da Kevin'sanswer, questo può essere risolto specificando una proprietà per MSBuildWorkspace:

var props = new Dictionary<string, string>(); 
props["CheckForSystemRuntimeDependency"] = "true"; 
var msWorkspace = MSBuildWorkspace.Create(props); 

Ora soluzioni aperto nel msWorkspace sarà correttamente risolvere i loro riferimenti.

+1

Che non ha funzionato per me, sto usando VS 2015 RC. Chiunque? Qualsiasi aggiornamento? –

Problemi correlati