将我自己的 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的主要内容,如果未能解决你的问题,请参考以下文章