Sie können die Lösung laden, indem Sie Roslyn.Services.Workspace.LoadSolution
verwenden. Sobald Sie dies getan haben, müssen Sie jedes der Projekte in Abhängigkeitsreihenfolge durchlaufen, erhalten Sie die Compilation
für das Projekt und rufen Sie Emit
darauf.
Sie können die Compilations in Abhängigkeitsreihenfolge mit Code wie unten erhalten. (Ja, ich weiß, dass das Ignorieren von IHaveWorkspaceServices zum Scheitern verurteilt ist. Es wird besser in der nächsten öffentlichen Version sein, das verspreche ich).
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);
}
}
}
}
Hinweis 1: LoadSolution
tut immer noch Verwendung msbuild unter der Decke der CSPROJ Dateien zu analysieren und die Dateien/references/Compiler-Optionen zu bestimmen.
Hinweis2: Da Roslyn noch nicht vollständig ist, gibt es wahrscheinlich Projekte, die nicht erfolgreich kompiliert werden, wenn Sie dies versuchen.
Gibt es eine bequeme Möglichkeit, die Abhängigkeit der Reihenfolge der Bestimmung (wie 'sln.ProjectsInDependencyOrder') oder ist dies etwas, was ich würde in meinem eigenen implementieren? (z. B. Durchlaufen von Projektreferenzen und Erstellen einer Abhängigkeitsstruktur) – NobodysNightmare
Es gibt einen IProjectDependencyService mit GetTopologicSortedProjects(). Ich habe keinen Computer zur Hand, um genau zu prüfen, wie ich ihn bekomme, aber ich werde ihn später aktualisieren. –
Bearbeitete die Antwort, um etwas Code hinzuzufügen. –