想象一下有一个数学库,它提供了一些针对 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/
目录中包含以下文件列表?
我尝试摆弄这样的东西:
<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>
...
但它并没有让它发挥作用。 有人可以帮助我和/或指出我正确的方向吗?
谢谢。
是否可以运行“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
2.生成
mylibrary.F32.dll
后删除mylibrary.F64.dll
众所周知,
IncrementalClean
将删除先前版本中生成的文件。在此模式下,运行 msbuild 时不可能在 bin
文件夹中包含这三个 .dll 文件。为了防止在增量构建过程中删除文件,您可以添加 <copy>
任务将 .dll
文件复制到 bin
文件夹。
您也可以尝试禁用增量构建。有关更多信息,请阅读文档:--no-incremental
此外,作为实现它的最简单方法,您可以尝试@Jonathan建议。 这里有一张类似的票你可以参考: