如何通过.csproj变量同时构建多个C#项目配置
如何通过.csproj变量同时构建多个C#项目配置
咱们先看个实际场景——你有一个专门针对IEEE754数值类型做了优化的数学类库,代码里会用预处理器常量来切换不同的精度类型,比如这样:
#if F16 global using Scalar = System.Half; #elif F32 global using Scalar = System.Single; #elif F64 global using Scalar = System.Double; #endif // ... 后续所有依赖Scalar类型的业务代码
或者,你可能会针对不同精度单独实现高度优化的方法:
#if F32 public static float HighlyOptimizedMethod(float a, float b, float c) { /* 针对float的专属优化逻辑 */ }; #elif F64 public static double HighlyOptimizedMethod(double a, double b, double c) { /* 针对double的专属优化逻辑 */ }; #endif
之前你可能是在.csproj里手动注释/取消注释来切换精度常量,大概是这样的:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <!-- 手动切换不同的精度配置 --> <!--<Scalar>F16</Scalar>--> <!--<Scalar>F32</Scalar>--> <Scalar>F64</Scalar> </PropertyGroup> </Project>
但如果想要一次构建出所有精度版本的库,不用反复手动切换编译,咱们可以在.csproj里配置多个构建配置,每个配置对应一个精度常量,具体步骤如下:
- 第一步:在.csproj里声明所有需要构建的配置,然后为每个配置绑定对应的预处理器常量、输出路径甚至程序集名称,避免不同版本互相覆盖:
<Project Sdk="Microsoft.NET.Sdk"> <!-- 声明所有要支持的构建配置 --> <PropertyGroup> <Configurations>Debug;Release;DebugF16;ReleaseF16;DebugF32;ReleaseF32;DebugF64;ReleaseF64</Configurations> </PropertyGroup> <!-- 为16位精度的配置设置专属属性 --> <PropertyGroup Condition="'$(Configuration)' == 'DebugF16' Or '$(Configuration)' == 'ReleaseF16'"> <DefineConstants>F16;$(DefineConstants)</DefineConstants> <OutputPath>bin\$(Configuration)\</OutputPath> <AssemblyName>MathLibrary.F16</AssemblyName> </PropertyGroup> <!-- 为32位精度的配置设置专属属性 --> <PropertyGroup Condition="'$(Configuration)' == 'DebugF32' Or '$(Configuration)' == 'ReleaseF32'"> <DefineConstants>F32;$(DefineConstants)</DefineConstants> <OutputPath>bin\$(Configuration)\</OutputPath> <AssemblyName>MathLibrary.F32</AssemblyName> </PropertyGroup> <!-- 为64位精度的配置设置专属属性 --> <PropertyGroup Condition="'$(Configuration)' == 'DebugF64' Or '$(Configuration)' == 'ReleaseF64'"> <DefineConstants>F64;$(DefineConstants)</DefineConstants> <OutputPath>bin\$(Configuration)\</OutputPath> <AssemblyName>MathLibrary.F64</AssemblyName> </PropertyGroup> <!-- 项目的基础配置 --> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <!-- 其他通用属性,比如Nullable、LangVersion等 --> </PropertyGroup> </Project>
- 第二步:构建项目。你可以在Visual Studio的「配置管理器」里选择单个配置构建,也可以用命令行一次性构建所有精度版本:
dotnet build -c "DebugF16;ReleaseF16;DebugF32;ReleaseF32;DebugF64;ReleaseF64"
如果想简化命令,也可以用通配符匹配(前提是你的shell支持):
dotnet build -c "*F16;*F32;*F64"
这么配置之后,每个精度版本都会生成独立的程序集,输出到各自的目录,完全不用再手动修改.csproj里的注释来回切换,效率提升不少~
备注:内容来源于stack exchange,提问作者unknown6656
相关产品推荐
相关产品推荐

