Bạn có thể tải giải pháp bằng cách sử dụng Roslyn.Services.Workspace.LoadSolution
. Một khi bạn đã làm như vậy, bạn cần phải đi qua từng dự án theo thứ tự phụ thuộc, nhận được Compilation
cho dự án và gọi Emit
trên đó.
Bạn có thể nhận được bộ sưu tập theo thứ tự phụ thuộc với mã như dưới đây. (Vâng, tôi biết rằng phải bỏ qua IHaveWorkspaceServices. Nó sẽ tốt hơn trong bản phát hành công khai tiếp theo, tôi hứa).
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);
}
}
}
}
Lưu ý1: LoadSolution
vẫn sử dụng msbuild dưới bìa để phân tích cú pháp tệp .csproj và xác định tùy chọn tệp/tham chiếu/trình biên dịch.
Lưu ý2: Vì Roslyn chưa hoàn thành ngôn ngữ, có thể sẽ có các dự án không biên dịch thành công khi bạn thử.
Nguồn
2013-01-26 06:40:52
Có một cách thuận tiện để xác định thứ tự phụ thuộc (như 'sln.ProjectsInDependencyOrder') hoặc là một cái gì đó này, tôi sẽ phải thực hiện trên của riêng tôi? (ví dụ: Đi qua tham chiếu dự án và xây dựng cây phụ thuộc) – NobodysNightmare
Có một IProjectDependencyService có GetTopologicallySortedProjects(). Tôi không có máy tính tiện dụng để kiểm tra chính xác cách nhận, nhưng sẽ cập nhật sau. –
Đã chỉnh sửa câu trả lời để thêm một số mã. –