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

本文介绍了如何在项目中使用TargetFrameworks配置来确保代码在多个.NET框架版本和操作系统上运行,包括.netstandard、netcoreapp、net4系列以及WindowsForms的特定版本。同时,详细解释了.props和.targets文件的作用以及它们在MSBuild构建过程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【背景】

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

比如:希望项目在以下环境都可以运行:
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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值