使用 CodeAnalysis.Compilation.Emit 编译时复制 App.config
copy App.config when compiling with CodeAnalysis.Compilation.Emit
我正在使用 Roslyn CodeAnalysis APIs 编译一个 C# 项目,如以下代码片段所示:
...
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 路径并自己发出它?我似乎找不到任何关于此的信息,并且项目 class 似乎不包含任何关于配置文件的信息(除非我遗漏了什么)。
我需要使用一些特定的 API 来实现上述目标吗?任何指向可用的现有代码的指针?
非常感谢!
Roslyn 不是构建系统,而是编译器。它可以仅 将代码转换为程序集(和 PDB)。当您在 Visual Studio 中编译 .csproj
时,MSBuild 会读取项目文件中的所有属性和项,并将它们转换为一系列步骤,其中包括调用 Roslyn 编译器、复制 App.config
文件到输出目录,复制引用等
虽然 Roslyn 确实可以读取 MSBuild 项目文件,但它仅将此信息用于编译目的,例如定位引用。
因此,如果您要动态编译程序集,则必须自己复制 App.config
文件(注意 - VS 不会发出此文件 - 它只是复制并重命名它)。
我正在使用 Roslyn CodeAnalysis APIs 编译一个 C# 项目,如以下代码片段所示:
...
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 路径并自己发出它?我似乎找不到任何关于此的信息,并且项目 class 似乎不包含任何关于配置文件的信息(除非我遗漏了什么)。
我需要使用一些特定的 API 来实现上述目标吗?任何指向可用的现有代码的指针?
非常感谢!
Roslyn 不是构建系统,而是编译器。它可以仅 将代码转换为程序集(和 PDB)。当您在 Visual Studio 中编译 .csproj
时,MSBuild 会读取项目文件中的所有属性和项,并将它们转换为一系列步骤,其中包括调用 Roslyn 编译器、复制 App.config
文件到输出目录,复制引用等
虽然 Roslyn 确实可以读取 MSBuild 项目文件,但它仅将此信息用于编译目的,例如定位引用。
因此,如果您要动态编译程序集,则必须自己复制 App.config
文件(注意 - VS 不会发出此文件 - 它只是复制并重命名它)。