1

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

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

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

谢谢

4

2 回答 2

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 的集成保持不变。特别是它使添加/删除/排序/检查属性表更容易(您正在使用它们来设置常见的配置选项,对吧?)。

于 2015-05-05T08:08:09.820 回答
1

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

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

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

以下是我听说为什么希望使用可能的替代方法进行这种“选择不同的文件”行为的原因:

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