将我自己的 C# 项目配置添加到 MSBuild / Visual Studio

Posted

技术标签:

【中文标题】将我自己的 C# 项目配置添加到 MSBuild / Visual Studio【英文标题】:Adding my own configuration for a C# project into MSBuild / Visual Studio 【发布时间】:2015-07-14 15:12:22 【问题描述】:

我可能会破解一些愚蠢的解决方案来解决我的问题,但我很想把它做对,以免自己将来头疼。我可以编写简单的 .vcxproj 文件,但它们通常最终会非常像初学者并且质量很差。

我有一个大型项目,我想用两个选项来构建它。这两个选项的不同之处仅在于选择了一个特定的源文件 (.cs)。源目录包含两个源文件,每个文件都有自己唯一的文件名。配置需要构建,然后在运行时初始化正确的文件。两个版本分开建没问题,但开关一定要干净。我真的不关心初始化函数是否具有相同的名称或不同的名称。

我很想获得有关如何制定该项目的 vcxproj 文件的建议,以便我可以轻松地在构建项目的一个版本或另一个版本之间切换。

谢谢

【问题讨论】:

您是否考虑#if 或者可能同时编译两个文件并在运行时启用一个作为选项? 是的,我确实认为这是一个有效的实现想法/选项(比我原来的混合物更好)。不过,我希望有更优雅或更惯用的东西。 【参考方案1】:

使用 MsBuild 的 Condition,您可以基于 Configuration 等属性启用/禁用编译。这可能适合您的情况:假设您现在有 'Debug' 和 'Release' 配置,您可以添加 'Debug_OptionB' 和 'Release_OptionB' 配置。在项目文件中,您创建一个布尔属性,如果配置包含“OptionB”字符串,则该属性为真:

<PropertyGroup>
  <CompilingWithOptionB>$(Configuration.Contains('_OptionB'))</CompilingWithOptionB>
</PropertyGroup>

现在使用这个属性进行条件编译:

<ClCompile Condition="'$(CompilingWithOptionB)'!='True'" Include="src_a.cpp" />
<ClCompile Condition="'$(CompilingWithOptionB)'=='True'" Include="src_b.cpp" />

如果要包含/排除多个源文件,您可以将它们放在一个单独的 ItemGroup 中,该 ItemGroup 然后具有条件,甚至在单独的属性表中。

 I can write simple .vcxproj files, but they usually end up being quite beginner-like and poor quality

我建议不要自己编写它们,而是让 VS 为您创建它们然后添加修改。这更容易,也可以确保与 VS 的集成保持不变。特别是它使添加/删除/排序/检查属性表更容易(您正在使用它们来设置常见的配置选项,对吧?)。

【讨论】:

【参考方案2】:

如果您没有充分的理由包含/排除文件,请考虑将所有文件编译成一组二进制文件并使用feature toggles 或其他配置机制(如 DI 容器配置)来启用/禁用特定功能。

Stijn's answer 提供了实现条件包含的良好步骤 - 基于配置名称或更好的条件符号(如“DEBUG”)设置条件,并启用/禁用项目文件中具有 Condition=.... 属性的单个项目或组。

但是要做好准备,许多 VS 工具和插件对于条件包含的代码来说至少是无用的(有时会很困惑)。在 VS 中测试此类代码也会更加困难,因为您当时只能针对单一风格的二进制文件运行测试,这可能会使其他文件集未经测试。

以下是我听说人们希望通过可能的替代方法实现这种“选择不同文件”行为的原因:

拥有“完整”/“有限”版本的软件 - 这可能是这样做的唯一真正原因。请注意,C#/.Net 通常不受逆向工程的保护,无论如何通过复制完整版本来克服这种限制可能太容易了。确保权衡测试/支持多个版本的复杂性 仅调试代码/跟踪/... - #if 和条件属性可能涵盖大多数情况,因此可以始终包含文件,并且可以使用常规条件符号启用/禁用代码(甚至可能是默认的 DEBUG build配置就够了)。所有跟踪/日志库都带有足够的配置设置,因此不需要此类文件级排除 风味特定库的包装器 - 例如 32/64 位互操作。这可以由运行时包含的单独程序集和/或在运行时选择正确实现的精心设计的类来处理。

【讨论】:

+1 基本上我们需要知道 OP 使用的是什么实际条件,以及是否可以使用预处理器解决它,这通常是最轻松的方法

以上是关于将我自己的 C# 项目配置添加到 MSBuild / Visual Studio的主要内容,如果未能解决你的问题,请参考以下文章

如何将我自己的 XML 配置文件添加到 Windows 服务 C#

MsBuild 找不到发布配置文件

msbuild 包中不包含 C# 孙项目 DLL

msbuild怎么添加 到环境变量

msbuild 中动态生成的 C# 文件的问题

如何将msbuild升级到C#6?