C# 使用Roslyn编译的嵌入式文件

C# 使用Roslyn编译的嵌入式文件,c#,roslyn,embedded-resource,C#,Roslyn,Embedded Resource,我正在寻找一个如何使用Roslyn编译项目的示例。下面的代码是我在……中找到的一个示例,这个示例不包括嵌入式文件。可能吗 public class MyTask : Task { public override bool Execute() { var projectFileName = this.BuildEngine.ProjectFileOfTaskNode; var project = ProjectCollection.Globa

我正在寻找一个如何使用Roslyn编译项目的示例。下面的代码是我在……中找到的一个示例,这个示例不包括嵌入式文件。可能吗

public class MyTask : Task {
    public override bool Execute() {
          var projectFileName = this.BuildEngine.ProjectFileOfTaskNode;
              var project = ProjectCollection.GlobalProjectCollection.
                            GetLoadedProjects(projectFileName).Single();
              var compilation = CSharpCompilation.Create(
                                    project.GetPropertyValue("AssemblyName"),
                                    syntaxTrees: project.GetItems("Compile").Select(
                                      c => SyntaxFactory.ParseCompilationUnit(
                                               c.EvaluatedInclude).SyntaxTree),
                                    references: project.GetItems("Reference")
                                                       .Select(          
                                      r => new MetadataFileReference
                                                   (r.EvaluatedInclude)));
             // Now work with compilation ...
    }
}

是的,可以使用Roslyn将资源嵌入到结果程序集中

要生成结果,程序集类型有一个
Emit
方法。这种方法有很多参数。其中一个是
manifestResources
,它负责添加嵌入式资源。您可以指定任意数量的资源。下面的代码演示如何使用此参数将具有嵌入资源的程序集发送到
peStream
。它创建一个名为“resourceName”的资源,其内容位于“资源路径”路径

不要忘记检查
EmitResult.Success
属性以确保编译成功完成。还应确保编译后正确处理
peStream

void ProduceAssembly(CSharpCompilation compilation, Stream peStream)
{
    ResourceDescription[] resources =
    {
        new ResourceDescription(
            "resourceName",
            () => File.OpenRead("path-to-resource"),
            isPublic: true
        )
    };
    var result = compilation.Emit(peStream, manifestResources: resources);
    if (!result.Success)
    {
        var diagnostics = string.Join(Environment.NewLine, result.Diagnostics);
        throw new Exception($"Compilation failed with: {diagnostics}");
    }
}