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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

我有一个软件,它根据用户操作为C#项目生成代码。我希望创建一个GUI来自动编译解决方案,这样我就不必仅仅为了触发重新编译而加载VisualStudio。

提问于
用户回答回答于

代码

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Emit;
using Microsoft.CodeAnalysis.MSBuild;

namespace Roslyn.TryItOut
{
    class Program
    {
        static void Main(string[] args)
        {
            string solutionUrl = "C:\\Dev\\Roslyn.TryItOut\\Roslyn.TryItOut.sln";
            string outputDir = "C:\\Dev\\Roslyn.TryItOut\\output";

            if (!Directory.Exists(outputDir))
            {
                Directory.CreateDirectory(outputDir);
            }

            bool success = CompileSolution(solutionUrl, outputDir);

            if (success)
            {
                Console.WriteLine("Compilation completed successfully.");
                Console.WriteLine("Output directory:");
                Console.WriteLine(outputDir);
            }
            else
            {
                Console.WriteLine("Compilation failed.");
            }

            Console.WriteLine("Press the any key to exit.");
            Console.ReadKey();
        }

        private static bool CompileSolution(string solutionUrl, string outputDir)
        {
            bool success = true;

            MSBuildWorkspace workspace = MSBuildWorkspace.Create();
            Solution solution = workspace.OpenSolutionAsync(solutionUrl).Result;
            ProjectDependencyGraph projectGraph = solution.GetProjectDependencyGraph();
            Dictionary<string, Stream> assemblies = new Dictionary<string, Stream>();

            foreach (ProjectId projectId in projectGraph.GetTopologicallySortedProjects())
            {
                Compilation projectCompilation = solution.GetProject(projectId).GetCompilationAsync().Result;
                if (null != projectCompilation && !string.IsNullOrEmpty(projectCompilation.AssemblyName))
                {
                    using (var stream = new MemoryStream())
                    {
                        EmitResult result = projectCompilation.Emit(stream);
                        if (result.Success)
                        {
                            string fileName = string.Format("{0}.dll", projectCompilation.AssemblyName);

                            using (FileStream file = File.Create(outputDir + '\\' + fileName))
                            {
                                stream.Seek(0, SeekOrigin.Begin);
                                stream.CopyTo(file);
                            }
                        }
                        else
                        {
                            success = false;
                        }
                    }
                }
                else
                {
                    success = false;
                }
            }

            return success;
        }
    }
}

热门问答

腾讯云广州一区DNS变更,需要怎么操作?

思潮澎湃轻描淡写的生活,但思潮澎湃
推荐
我也收到相关的通知了,这里分享下~ 2019年1月31日,腾讯云将对广州地区旧的基础网络DNS服务器(10.225.30.181、10.225.30.223)进行下线。在此期间,腾讯云提供最新的DNS服务器供您更新使用。 我们建议您尽快将DNS服务器配置进行更新,并且我们为您提供...... 展开详请

看到 API 网关已支持前端类型为 WebSocket,有无相关文档?

Masonlu

腾讯 · 产品经理 (已认证)

推荐已采纳
websocket的demo模板已经上了前台,今天会全网发布,相关文档也在审核当中,我这里先把它贴到附件里,供参考。 Websocket 原理介绍.pdf Websocket 使用方法.pdf 届时,可以通过控制台选择demo直接创建ws的云函数。... 展开详请

一个用户加入多个群组,发现不同群组间消息互窜,怎么解决?

LemonLu

社区 · 运营 (已认证)

Less is more
推荐

在解析的时候需要根据群组ID处理,因为不同的群组消息有不同的群组ID的。

COS Javascript 上传图片putObject成功后没有返回ETag?

许金泉

腾讯 · 高级工程师 (已认证)

腾讯云COS前端开发
推荐

腾讯云通讯能做类似qq微信的语音通话的效果吗?

推荐

腾讯云通信IM只支持发送语音功能

如果需要实现语音通话功能可以集成实时音视频来实现

详情请参考https://cloud.tencent.com/product/trtc

腾讯云50G系统盘,购买的数据盘在挂载后没有D盘符只有E盘符,如何设置D盘符?

推荐
已购买数据盘的用户,需要格式化数据盘才可使用。 格式化数据盘 1. 登录 Windows 云服务器。 2. 单击【开始】-【服务器管理器】-【工具】-【计算机管理】-【存储】-【磁盘管理】。 3. 在磁盘 1 上右键单击,选择【联机】: 📷 4. 右键单击,选择【初始化磁盘】:...... 展开详请

所属标签

扫码关注云+社区