È possibile caricare la soluzione utilizzando Roslyn.Services.Workspace.LoadSolution
. Dopo averlo fatto, è necessario passare attraverso ciascuno dei progetti in ordine di dipendenza, ottenere il Compilation
per il progetto e chiamare Emit
su di esso.
È possibile ottenere le compilazioni in ordine di dipendenza con il codice come di seguito. (Sì, lo so che dover trasmettere a IHaveWorkspaceServices fa schifo, sarà meglio nella prossima versione pubblica, lo prometto).
using Roslyn.Services;
using Roslyn.Services.Host;
using System;
using System.Collections.Generic;
using System.IO;
class Program
{
static void Main(string[] args)
{
var solution = Solution.Create(SolutionId.CreateNewId()).AddCSharpProject("Foo", "Foo").Solution;
var workspaceServices = (IHaveWorkspaceServices)solution;
var projectDependencyService = workspaceServices.WorkspaceServices.GetService<IProjectDependencyService>();
var assemblies = new List<Stream>();
foreach (var projectId in projectDependencyService.GetDependencyGraph(solution).GetTopologicallySortedProjects())
{
using (var stream = new MemoryStream())
{
solution.GetProject(projectId).GetCompilation().Emit(stream);
assemblies.Add(stream);
}
}
}
}
Nota 1: LoadSolution
fa ancora uso msbuild sotto le coperte per analizzare i file .csproj e determinare i file/riferimenti/opzioni del compilatore.
Nota2: poiché Roslyn non è ancora completo, probabilmente ci saranno progetti che non vengono compilati correttamente quando si tenta di farlo.
fonte
2013-01-26 06:40:52
C'è un modo conveniente di determinare l'ordine di dipendenza (come 'sln.ProjectsInDependencyOrder') o si tratta di qualcosa che avrei dovuto implementare per conto mio? (Ad esempio, passare a riferimenti di progetto e creare un albero di dipendenza) – NobodysNightmare
Esiste un IProjectDependencyService con GetTopologicallySortedProjects(). Non ho un computer a portata di mano per controllare esattamente come ottenerlo, ma verrà aggiornato in seguito. –
Modificata la risposta per aggiungere del codice. –