VisualStudio C#项目文件知识点整理

一、C#项目中链接文件

1、通过项目文件引入单个文件

在项目文件中,我们可以通过 Compile 标签来引入单个文件。比如我们想要引入 AssemblyInfo.cs 文件,我们可以这样做:

<Project>
    <ItemGroup>
        <Compile Include="../Shared/AssemblyInfo.cs">
            <Link>AssemblyInfo.cs</Link>
        </Compile>
    </ItemGroup>
</Project>

这样我们就可以在项目中使用 AssemblyInfo.cs 文件中的代码了。

2、通过项目文件引入文件夹下的所有文件

如果想要引入多个文件,我们可以使用通配符来引入文件夹下的所有文件。比如我们想要引入 Shared 文件夹下的所有文件,我们可以这样做:

<Project>
    <ItemGroup>
        <Compile Include="..\Shared\**\*.cs">
            <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
        </Compile>
    </ItemGroup>
</Project>

使用%(RecursiveDir) 来指定代替路径中通配符的部分。

3、使用使用 Directory.Build.props 文件

上面的方法都是在项目文件中引入文件的,但是如果我们有很多项目,那么我们就需要在每个项目文件中都引入这些文件。这样会让我们的项目文件变得很乱,我们可以通过使用 Directory.Build.props 文件来解决这个问题。

我们可以在解决文件夹下创建一个 Directory.Build.props 文件,然后在这个文件中引入文件夹下的所有文件。比如我们想要引入 Shared 文件夹下的所有文件,我们可以这样做:

<Project>
    <ItemGroup>
        <Compile Include="..\Shared\**\*.cs">
            <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
        </Compile>
    </ItemGroup>
</Project>

二、目标框架指定

1、指定单个目标框架

指定单个目标框架,使用TargetFramework元素。以下是在控制台应用程序项目文件指定.NET Core 3.0目标框架的示例:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>
</Project>
2、指定多个目标框架

当指定多个目标框架时,TargetFramework更改为复数TargetFrameworks,多个框架间用分号分隔:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.4;net40;net45</TargetFrameworks>
  </PropertyGroup>
</Project>

这个时候,TargetFramework 是编译时自动指定的。

之后就可以在库或应用程序中根据编写条件代码以针对每个目标框架进行编译:

static void Main()
{
#if NET40
    Console.WriteLine("Target framework: .NET Framework 4.0");
#elif NET45  
    Console.WriteLine("Target framework: .NET Framework 4.5");
#else
    Console.WriteLine("Target framework: .NET Standard 1.4");
#endif
}

如果多开发框架中包含了低版本的 .NET Framework,例如 4.0/4.5 等,由于这些版本的 .NET Framework 与 .NET Standard 的第三方库差异较大,我们需要来解决其第三方库引用的差异。这时需要在 csproj 文件中指定包含条件。例如:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net471;netcoreapp2.0</TargetFrameworks>
    <OutputType Condition="'$(TargetFramework)'!='netcoreapp2.0'">Exe</OutputType>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <!-- 这里的引用是二者共有的 -->
  <ItemGroup>
    <PackageReference Include="MSTest.TestAdapter" Version="1.2.0" />
    <PackageReference Include="MSTest.TestFramework" Version="1.2.0" />
  </ItemGroup>

  <!-- 这里的引用用于非 .NET Core 框架 -->
  <ItemGroup Condition="'$(TargetFramework)'!='netcoreapp2.0'">
    <PackageReference Include="Xxx" Version="1.0.*" />
  </ItemGroup>

  <!-- 这里的引用用于 .NET Core 框架 -->
  <ItemGroup Condition="'$(TargetFramework)'=='netcoreapp2.0'">
    <PackageReference Include="Yyy" Version="1.0.*" />
  </ItemGroup>
</Project>
3、目标框架预定义处理符号
目标框架 符号 其他符号(在 .NET 5+ SDK 中可用)
.NET Framework

NETFRAMEWORK, 

NET48, NET472,

NET471, NET47, 

NET462, NET461, 

NET46, NET452, 

NET451, NET45, 

NET40, NET35, NET20

NET48_OR_GREATER, NET472_OR_GREATER, 

NET471_OR_GREATER, NET47_OR_GREATER, 

NET462_OR_GREATER, NET461_OR_GREATER, 

NET46_OR_GREATER, NET452_OR_GREATER, 

NET451_OR_GREATER, NET45_OR_GREATER, 

NET40_OR_GREATER, NET35_OR_GREATER, 

NET20_OR_GREATER

.NET Standard

NETSTANDARD,

NETSTANDARD2_1, 

NETSTANDARD2_0, 

NETSTANDARD1_6, 

NETSTANDARD1_5, 

NETSTANDARD1_4, 

NETSTANDARD1_3, 

NETSTANDARD1_2, 

NETSTANDARD1_1, 

NETSTANDARD1_0

NETSTANDARD2_1_OR_GREATER, 

NETSTANDARD2_0_OR_GREATER, 

NETSTANDARD1_6_OR_GREATER, 

NETSTANDARD1_5_OR_GREATER, 

NETSTANDARD1_4_OR_GREATER, 

NETSTANDARD1_3_OR_GREATER, 

NETSTANDARD1_2_OR_GREATER, 

NETSTANDARD1_1_OR_GREATER, 

NETSTANDARD1_0_OR_GREATER

.NET 5 及更高版本(和 .NET Core)

NET, NET9_0, NET8_0,

NET7_0, NET6_0,

NET5_0, NETCOREAPP, NETCOREAPP3_1,

NETCOREAPP3_0, 

NETCOREAPP2_2, 

NETCOREAPP2_1, 

NETCOREAPP2_0, 

NETCOREAPP1_1, 

NETCOREAPP1_0

NET8_0_OR_GREATER,

NET7_0_OR_GREATER, 

NET6_0_OR_GREATER, 

NET5_0_OR_GREATER, 

NETCOREAPP3_1_OR_GREATER, 

NETCOREAPP3_0_OR_GREATER, 

NETCOREAPP2_2_OR_GREATER, 

NETCOREAPP2_1_OR_GREATER, 

NETCOREAPP2_0_OR_GREATER, 

NETCOREAPP1_1_OR_GREATER, 

NETCOREAPP1_0_OR_GREATER

常见目标框架及实现的 .NET Standard 版本:

目标框架 最新
稳定版本
目标框架名字对象 (TFM) 已实现
.NET Standard 版本</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值