使用Roslyn编译到模块
我需要将任何C#或VB.NET项目编译为.NetModule。我有以下发出DLL的示例代码,需要一些帮助来修改以下代码,以便从.csproj中获得.NetModules 提前谢谢使用Roslyn编译到模块,roslyn,roslyn-code-analysis,Roslyn,Roslyn Code Analysis,我需要将任何C#或VB.NET项目编译为.NetModule。我有以下发出DLL的示例代码,需要一些帮助来修改以下代码,以便从.csproj中获得.NetModules 提前谢谢 // Required Microsoft.CodeAnalysis 1.3.0 class Program { static void Main(string[] args) { try {
// 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.");
}
}
//必需的Microsoft.CodeAnalysis 1.3.0
班级计划
{
静态void Main(字符串[]参数)
{
尝试
{
//请复制并提供指向.csproj的路径
CompileProject(@“C:\WebGoat\WebGoat.NET.csproj”,@“C:\tempout”).Wait();
}
捕获(例外情况除外)
{
控制台写入线(ex);
}
}
异步静态任务CompileProject(string projectFilePath、string outputFolderPath)
{
使用(var workspace=MSBuildWorkspace.Create())
{
var project=workspace.OpenProjectAsync(projectFilePath).Result;
等待发射(项目,outputFolderPath);
返回Path.GetFileName(project.OutputFilePath);
}
}
异步静态任务发出(项目,字符串outputFolderPath)
{
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);
如果(!compilestatus.Success)
{
Console.WriteLine(“失败”);
}
其他的
{
控制台。写线(“通过”);
}
}
我相信您正在寻找,而且特别是
类似于以下内容的操作应该可以工作:
var project = workspace.OpenProjectAsync(projectFilePath).Result;
var options = project.CompilationOptions;
var netModuleOptions = options.WithOutputKind(OutputKind.NetModule);
var projectWithOptions = project.WithCompilationOptions(netModuleOptions);
现在,您应该能够像平常一样获得编译并发出它。下面解决了这个问题
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();