使用CodeAnalysis.Compilation.Emit进行编译时复制App.config

时间:2016-07-22 16:52:57

标签: c# roslyn

我正在使用Roslyn CodeAnalysis API编译C#项目,如下面的snipet:

...
EmitResult emitResult = null;
using (FileStream outputFileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
  emitResult = compilation.Emit(outputFileStream, null);
}
...

这完美无缺。但是,当我想编译包含App.Config文件的可执行项目时,此文件不会在输出目录中发出(类似于通过Visual Studio编译时的方式),如果要解析某些文件,则会出现问题在运行时从该文件配置。

我意识到它不应该默认发出,但是我可能需要启用一些选项,或以某种方式从Project对象中提取App.Config路径并自己发出它?我似乎无法找到任何有关此信息的信息,Project类似乎不包含任何有关配置文件的信息(除非我遗漏了某些内容)。

我是否需要使用某些特定的API来实现上述目标?是否有指向现有代码的指针?

非常感谢!

1 个答案:

答案 0 :(得分:5)

Roslyn不是一个构建系统,它是一个编译器。它只能 将代码转换为程序集(和PDB)。在Visual Studio中编译.csproj时,MSBuild会读取项目文件中的所有属性和项目,并将它们转换为一系列步骤,其中包括调用Roslyn编译器,复制App.config个文件到输出目录,复制引用等

虽然Roslyn可以读取MSBuild项目文件,但它仅将此信息用于编译目的,例如查找引用。

因此,如果您正在动态编译程序集,则必须自己复制App.config文件(注意 - VS不会发出此文件 - 它只是复制并重命名它)。