首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Roslyn编译C#解决方案?

如何使用Roslyn编译C#解决方案?
EN

Stack Overflow用户
提问于 2012-11-08 07:22:06
回答 1查看 15.1K关注 0票数 28

我有一个基于用户操作为C#项目生成代码的软件。我想创建一个GUI来自动编译解决方案,这样我就不必加载Visual Studio来触发重新编译。

我一直在寻找机会使用Roslyn,并决定尝试使用Roslyn而不是msbuild来实现这一点。不幸的是,我似乎找不到任何关于以这种方式使用Roslyn的好资源。

有谁能给我指个方向吗?

EN

回答 1

Stack Overflow用户

发布于 2013-01-26 14:40:53

您可以使用Roslyn.Services.Workspace.LoadSolution加载解决方案。完成此操作后,您需要按依赖关系顺序遍历每个项目,获取项目的Compilation并对其调用Emit

您可以使用如下代码按依赖关系顺序获取编译。(是的,我知道必须转换到IHaveWorkspaceServices是很糟糕的。在下一次公开发布时会更好,我保证)。

代码语言:javascript
复制
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还没有完成语言,所以当您尝试这样做时,可能会有一些项目无法成功编译。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13280008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档