2017-10-17 145 views
0

我需要将任何C#或VB.NET项目编译为.NetModule。我有下面的示例代码,其中发出DLL,需要一些帮助来修改以下从.csproj得到.NetModules与Roslyn编译模块

在此先感谢。

// 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."); 
      } 
     } 

回答

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); 

现在,你应该能够得到一个编译和发射为你通常会。

0

下列固定的问题

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();