一、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 版本</ |
---|