Çözümü Roslyn.Services.Workspace.LoadSolution
kullanarak yükleyebilirsiniz. Bunu yaptıktan sonra, her bir projeye bağımlılık sırasına girmeniz, proje için Compilation
numarasını almanız ve üzerinde Emit
numarasını aramanız gerekir.
Derlemeleri bağımlılık sırasına göre aşağıdaki gibi bir kodla alabilirsiniz. (Evet, IHaveWorkspaceServices'ın yayınlanması gerekeceğini biliyorum. Bir sonraki kamu yayınında daha iyi olacak, söz veriyorum).
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);
}
}
}
}
Not 1: LoadSolution
hala .Csproj dosyalarını ayrıştırmak ve dosya/referanslar/derleyici seçeneklerini belirlemek için yorganın altında kullanılması msbuild yapar.
Not2: Roslyn henüz dil tamamlanmadığı için, bunu denediğinizde başarıyla derleme olmayan projeler olacaktır.
(sln.ProjectsInDependencyOrder' 'gibi) bağımlılık sırasının belirlenmesi uygun bir yolu var mı yoksa başıma uygulamak zorunda kalacak bu bir şeydir? (ör. Proje başvurularından geçme ve bağımlılık ağacı oluşturma) – NobodysNightmare
GetTopologicallySortedProjects() içeren bir IProjectDependencyService vardır. Tam olarak nasıl alınacağını kontrol etmek için kullanışlı bir bilgisayarım yok, ancak daha sonra güncellenir. –
Bazı kod eklemek için cevabı düzenleyin. –