使用 .csproj 变量同时构建多个 C# 项目配置

问题描述 投票:0回答:1

想象一下有一个数学库,它提供了一些针对 IEEE754 数字类型优化的功能。该代码可能包含以下内容:

#if F16
    global using Scalar = System.Half;
#elif F32
    global using Scalar = System.Single;
#elif F32
    global using Scalar = System.Double;
#endif

// ...

#if F32
    public static float HighlyOptimizedMethod(float a, float b, float c) { ... };
#elif F64
    public static double HighlyOptimizedMethod(double a, double b, double c) { ... };
#endif

我现在在我的

F16
项目文件中定义这些预处理器常量
F32
F64
.csproj
,如下所示:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <!-- change the following for different precisions. -->
        <!--<Scalar>F16</Scalar>-->
        <!--<Scalar>F32</Scalar>-->
        <Scalar>F64</Scalar>

        <DefineConstants>$(DefineConstants);$(Scalar)</DefineConstants>
    </PropertyGroup>
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>

        <AssemblyName Condition="'$(Scalar)' != ''">mylibrary.$(Scalar)</AssemblyName>
        <AssemblyName Condition="'$(Scalar)' == ''">mylibrary</AssemblyName>
    
        ...
    </PropertyGroup>
</Project>

我的问题

是否可以让 VisualStudio/dotnet/MSBuild 在构建项目时同时创建所有三种配置的程序集?即是否可以运行“编译”,然后在

bin/
目录中包含以下文件列表?

  • 我的库.F16.dll
  • 我的库.F32.dll
  • 我的库.F64.dll

我尝试摆弄这样的东西:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <!-- change the following for different precisions. if all are commented out, every configuration will be built. -->
   
        <!--<Scalar>F16</Scalar>-->
        <!--<Scalar>F32</Scalar>-->
        <Scalar>F64</Scalar>

        <DefineConstants>$(DefineConstants);$(Scalar)</DefineConstants>
    </PropertyGroup>
    <Target Name="BuildOthers" BeforeTargets="CoreBuild" Condition="'$(Scalar)' == ''">
        <MSBuild Projects="$(MSBuildProjectFile)" Properties="Configuration=$(Configuration);Scalar=F16" />
        <MSBuild Projects="$(MSBuildProjectFile)" Properties="Configuration=$(Configuration);Scalar=F32" />
        <MSBuild Projects="$(MSBuildProjectFile)" Properties="Configuration=$(Configuration);Scalar=F64" />
    </Target>
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>

        ...

但它并没有让它发挥作用。 有人可以帮助我和/或指出我正确的方向吗?

谢谢。

c# .net visual-studio msbuild csproj
1个回答
0
投票

是否可以运行“compile”,然后在 bin/ 目录中出现以下文件列表?

是的。您可以像这样检查以下内容:

<PropertyGroup>
 <Scalar>''</Scalar>
 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PropertyGroup>
    <MSBuild Projects="$(MSBuildProjectFile)" Properties="Configuration=$(Configuration);Scalar=F16" />
    <Copy
       SourceFiles="\obj\Debug\net8.0\mylibrary.F16.dll"
       DestinationFolder="bin\$(Configuration)\Resources"
    />
    <MSBuild Projects="$(MSBuildProjectFile)" Properties="Configuration=$(Configuration);Scalar=F32" />
    <Copy
       SourceFiles="\obj\Debug\net8.0\mylibrary.F32.dll"
       DestinationFolder="bin\$(Configuration)\Resources"
    />
    <MSBuild Projects="$(MSBuildProjectFile)" Properties="Configuration=$(Configuration);Scalar=F64" />
    <Copy
       SourceFiles="\obj\Debug\net8.0\mylibrary.F64.dll"
       DestinationFolder="bin\$(Configuration)\Resources"
    />
</Target>

但它没有让它工作(目标BuildOthers)

根据我的测试,我发现

mylibrary.F12.dll
mylibrary.F32.dll
被目标
IncrementalClean
删除了。

1.生成

mylibrary.F12.dll
后删除
mylibrary.F32.dll
remove mylibrary.F12.dll

2.生成

mylibrary.F32.dll
后删除
mylibrary.F64.dll
remove mylibrary.F32.dll

众所周知,

IncrementalClean
将删除先前版本中生成的文件。在此模式下,运行 msbuild 时不可能在
bin
文件夹中包含这三个 .dll 文件。为了防止在增量构建过程中删除文件,您可以添加
<copy>
任务将
.dll
文件复制到
bin
文件夹。

您也可以尝试禁用增量构建。有关更多信息,请阅读文档:--no-incremental

此外,作为实现它的最简单方法,您可以尝试@Jonathan建议。 这里有一张类似的票你可以参考:

如何使用msbuild为一个项目创建多个依赖于Constants值的资源(dll)?

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.