Możesz załadować rozwiązanie za pomocą Roslyn.Services.Workspace.LoadSolution
. Gdy to zrobisz, musisz przejść przez każdy z projektów w kolejności zależności, uzyskać Compilation
dla projektu i zadzwonić pod numer Emit
.
Możesz pobrać kompilacje w kolejności zależności z kodem jak poniżej. (Tak, wiem, że trzeba rzucić na IHaveWorkspaceServices, to będzie lepiej w następnym wydaniu publicznym, obiecuję).
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);
}
}
}
}
Note1: LoadSolution
nadal używa msbuild pod kołdrą do analizowania plików .csproj i determinują pliki/Referencje/opcje kompilatora.
Uwaga2: ponieważ Roslyn nie jest jeszcze językiem kompletnym, najprawdopodobniej będą projekty, które nie będą się skutecznie kompilować podczas próby.
Czy jest to wygodny sposób ustalania kolejności zależność (jak 'sln.ProjectsInDependencyOrder') czy jest to coś, co muszę wdrożyć na własną rękę? (Na przykład Przechodzenie przez referencje do projektu i budowanie drzewa zależności) – NobodysNightmare
Istnieje usługa IProjectDependencyService, która ma funkcję GetTopologicallySortedProjects(). Nie mam pod ręką komputera, aby dokładnie sprawdzić, jak go zdobyć, ale zaktualizuję go później. –
Edytowano odpowiedź, aby dodać kod. –