我有一个基于用户操作为C#项目生成代码的软件。我想创建一个GUI来自动编译解决方案,这样我就不必加载Visual Studio来触发重新编译。
我一直在寻找机会使用Roslyn,并决定尝试使用Roslyn而不是msbuild来实现这一点。不幸的是,我似乎找不到任何关于以这种方式使用Roslyn的好资源。
有谁能给我指个方向吗?
发布于 2013-01-26 14:40:53
您可以使用Roslyn.Services.Workspace.LoadSolution
加载解决方案。完成此操作后,您需要按依赖关系顺序遍历每个项目,获取项目的Compilation
并对其调用Emit
。
您可以使用如下代码按依赖关系顺序获取编译。(是的,我知道必须转换到IHaveWorkspaceServices是很糟糕的。在下一次公开发布时会更好,我保证)。
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
仍然在幕后使用msbuild来解析.csproj文件并确定文件/引用/编译器选项。
Note2:由于Roslyn还没有完成语言,所以当您尝试这样做时,可能会有一些项目无法成功编译。
https://stackoverflow.com/questions/13280008
复制相似问题