【问题标题】:Compile to module with Roslyn使用 Roslyn 编译为模块
【发布时间】:2018-03-29 10:21:48
【问题描述】:

我需要将任何 C# 或 VB.NET 项目编译为 .NetModule。我有以下发出 DLL 的示例代码,需要一些帮助来修改以下内容以从 .csproj 中获取 .NetModules

提前致谢。

// Required Microsoft.CodeAnalysis 1.3.0    
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //Please copy provide a path to a .csproj
                CompileProject(@"C:\WebGoat\WebGoat.NET.csproj", @"C:\tempout").Wait();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }

        async static Task<string> CompileProject(string projectFilePath, string outputFolderPath)
        {
            using (var workspace = MSBuildWorkspace.Create())
            {
                var project = workspace.OpenProjectAsync(projectFilePath).Result;
                await Emit(project, outputFolderPath);
                return Path.GetFileName(project.OutputFilePath);
            }
        }

        async static Task Emit(Project project, string outputFolderPath)
        {
            Directory.CreateDirectory(outputFolderPath);
            var compilation = await project.GetCompilationAsync();
            var outputFilePath = Path.Combine(outputFolderPath, Path.GetFileName(project.OutputFilePath));
            var pdbFilePath = Path.ChangeExtension(outputFilePath, "pdb");
            var compilationStatus = compilation.Emit(outputFilePath, pdbPath: pdbFilePath);

            if (!compilationStatus.Success)
            {
                Console.WriteLine("Failed.");
            }
            else
            {
                Console.WriteLine("Pass.");
            }
        }

【问题讨论】:

    标签: roslyn roslyn-code-analysis


    【解决方案1】:

    我相信您正在寻找CompilationOptions.OutputKind,特别是OutputKind.NetModule

    类似以下的东西应该可以工作:

    var project = workspace.OpenProjectAsync(projectFilePath).Result;
    var options = project.CompilationOptions;
    var netModuleOptions = options.WithOutputKind(OutputKind.NetModule);
    var projectWithOptions = project.WithCompilationOptions(netModuleOptions);
    

    现在您应该能够像往常一样获得编译并发出它。

    【讨论】:

      【解决方案2】:

      解决了这个问题

         var project = workspace.OpenProjectAsync(projectFilePath).Result;
         var options = project.CompilationOptions;
         options = options.WithOutputKind(OutputKind.NetModule).WithPlatform(Platform.AnyCpu);
      
         project = project.WithCompilationOptions(options);
         var moduleCompilation = await project.GetCompilationAsync();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多