.Net跨平台配置:解决同一套代码跨平台的问题

2023-12-14 11:53:24

【背景】

希望项目在多种环境都可以运行,以解决同一套代码跨平台的问题。

比如:希望项目在以下环境都可以运行:
netstandard2.0;netstandard2.1;net462;net7.0;net462;net48;net7.0-windows;
那么我们可以:

在该项目的(projectName).csproj里设置这个配置节:
<TargetFrameworks>netstandard2.0;netstandard2.1;net462;net48;net7.0;net462;net7.0-windows</TargetFrameworks>

这样,该项目生成的dll等或项目引用就可以在上述环境下使用。

有时,我们可能需要对一些配置做条件设定,比如可以这样:
<TargetFrameworks>netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net462;</TargetFrameworks>
<TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">$(TargetFrameworks);net5.0-windows;net6.0-windows;</TargetFrameworks>
<UseWindowsForms Condition="'$(TargetFramework)' == 'net5.0-windows' or '$(TargetFramework)' == 'net6.0-windows'">true</UseWindowsForms>

也可以类似这样指定net4开头的条件设定,这样net462, net48就符合:
<PropertyGroup Condition="$(TargetFramework.StartsWith('net4'))">
? <!-- //这里是满足条件的配置 -->
</PropertyGroup>

我们还可以使用:
<TargetFrameworks>$(AllTargetFrameworks)</TargetFrameworks>
其中:
AllTargetFrameworks这个变量可以在.props文件或.targets文件中配置:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
? <PropertyGroup>
? ? <AllTargetFrameworks>netstandard2.0;netcoreapp3.1;net5.0</AllTargetFrameworks>
? </PropertyGroup>
</Project>

.props和.targets文件都是MSBuild文件,它们用于定义和配置构建过程。这两种文件的主要区别在于它们被导入项目文件的时间点。
?? ?.props文件:这是属性文件,通常用于定义一些全局属性,这些属性在项目文件的其他地方可能会被使用。.props文件通常在项目文件的顶部导入,这意味着它们的设置可以被项目文件中后续的设置覆盖。
?? ?.targets文件:这是目标文件,通常用于定义构建过程中的任务和目标。.targets文件通常在项目文件的底部导入,这意味着它们可以访问并可能覆盖项目文件中先前定义的所有属性和项。
总的来说,.props文件和.targets文件都是用于组织和复用MSBuild代码的方式,它们使得构建配置可以在多个项目之间共享。

实际上,我们还可以这样“连环套”方式配置
? <PropertyGroup>
? ? <BasicTargetFrameworksCurrent>netstandard2.0;netstandard2.1;net462;$(TFMCurrent)</BasicTargetFrameworksCurrent>
? ? <PlatformTargetFrameworksCurrent Condition="!$(IsLinux)">$(TFMCurrent)-ios;$(TFMCurrent)-maccatalyst;$(TFMCurrent)-android</PlatformTargetFrameworksCurrent>
?? <PropertyGroup>
? ? <BasicTargetFrameworks>$(BasicTargetFrameworksCurrent);$(BasicTargetFrameworksNext)</BasicTargetFrameworks>
? ? <PlatformTargetFrameworks>$(PlatformTargetFrameworksCurrent);</PlatformTargetFrameworks>
? ? <AllTargetFrameworks>$(BasicTargetFrameworks);</AllTargetFrameworks>
? </PropertyGroup>

文章来源:https://blog.csdn.net/johnsuna/article/details/134988560
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。