blog post image
Andrew Lock avatar

Andrew Lock

~5 min read

Fixing build warning NETSSDK1138 when building projects with end-of-life .NET frameworks

In this short post I describe how to get rid of the following build warning:

C:\Program Files\dotnet\sdk\5.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.EolTargetFrameworks.targets(28,5):
warning NETSDK1138: The target framework 'netcoreapp2.0' is out of support and will not receive security updates in the future. 
Please refer to https://aka.ms/dotnet-core-support for more information about the support policy.

This post shows how to remove the warning either by adding a property to your project file or by passing a property to the build commands.

tl;dr; Set the MSBuild property CheckEolTargetFramework to false, either by setting it in the project's .csproj file, or by passing /p:CheckEolTargetFramework=false when running commands with the .NET CLI

When do you see the warning?

This warning appears when you're building a project which uses a .NET Core version which was no longer supported when the .NET SDK version used to build the project was released.

For example, I was building a .NET Core 3.0 project (which went out of support March 3rd 2020, over a year ago), with the .NET 5 SDK, and saw the following warning:

C:\Program Files\dotnet\sdk\5.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.EolTargetFrameworks.targets(28,5):
warning NETSDK1138: The target framework 'netcoreapp3.0' is out of support and will not receive security updates in the future. 
Please refer to https://aka.ms/dotnet-core-support for more information about the support policy.

This warning is shown any time you restore or build the project, which can mean multiple warnings cluttering up your build logs.

Does the warning matter?

Well, it depends! If you're creating an app, then as the warning says, you should strongly consider updating to a .NET Core version that has support and is receiving patches!

If, on the other hand, you're a library author that still needs to support these end-of-life (EOL) projects, then the constant warnings can be an annoyance at best, and could break your build at worst.

If you're running your build with /warnaserror, so that you treat warnings as errors, then this warning from the SDK will break your build:

dotnet build /warnaserror 
Microsoft (R) Build Engine version 16.8.3+39993bd9d for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
C:\Program Files\dotnet\sdk\5.0.104\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.EolTargetFrameworks.targets(28,5): error NETSDK1138: The target framework 'netcoreapp3.0' is out of support and will not receive security updates in the future. Please refer to https://aka.ms/dotnet-core-support for more information about the support policy. [C:\repos\checkeol\checkeol.csproj]
C:\Program Files\dotnet\sdk\5.0.104\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.EolTargetFrameworks.targets(28,5): error NETSDK1138: The target framework 'netcoreapp3.0' is out of support and will not receive security updates in the future. Please refer to https://aka.ms/dotnet-core-support for more information about the support policy. [C:\repos\checkeol\checkeol.csproj]
  All projects are up-to-date for restore.

Build FAILED.

So if you know that you have to support the end of life project, how can you make this warning go away?

Setting <CheckEolTargetFramework> to remove the warning

The first option to remove the warning is to set the MSBuild property CheckEolTargetFramework. You can do this from your project file by adding a <PropertyGroup> setting that property, as shown below:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <!-- Set the CheckEolTargetFramework property to false to fix the warning -->
    <CheckEolTargetFramework>false</CheckEolTargetFramework>
  </PropertyGroup>

</Project>

Now when you restore or build, you won't get the warning about end of life frameworks:

dotnet build
Microsoft (R) Build Engine version 16.8.3+39993bd9d for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  checkeol -> C:\repos\checkeol\bin\Debug\netcoreapp3.0\checkeol.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.64

This approach sets an MSBuild property, so if you don't want to modify your project files, you can also set it at runtime, as I show in the next section

Passing CheckEolTargetFramework from the command line

The .NET CLI calls into the MSBuild build system to run NuGet restore and builds, so you can pass MSBuild properties via the command line. To set an MSBuild property when calling a dotnet command, use the /p:PROPERTY=VALUE syntax. So, to set CheckEolTargetFramework=false, use

dotnet restore /p:CheckEolTargetFramework=false

or

dotnet build /p:CheckEolTargetFramework=false

This sets the property to false, ensuring that all projects built with the dotnet build command ignore EOL target frameworks.

This approach means that MSBuild doesn't generate the warning for EOL frameworks but there's another option—generate the warning, but ignore it.

Ignore the specific warning

MSBuild allows you to ignore specific warnings when you build using the /nowarn flag. We can use that mechanism to ignore our EOL warnings in MSBuild by using /nowarn:netsdk1138

dotnet restore /nowarn:netsdk1138

This approach gives the same end functionality as the previous approaches, but it works slightly differently. In the previous approaches, we don't check for EOL .NET Core versions. With the /nowarn approach, the check is still made, you just won't see the warning generated. You can see this in action if you run the above command, with detailed logging enabled:

> dotnet restore /nowarn:netsdk1138 -v:detailed

...
>Target "_CheckForUnsupportedNETCoreVersion" in file "C:\Program Files\dotnet\sdk\5.0.104\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.TargetFrameworkInference.targets" from project "C:\repos\checkeol\checkeol.csproj" (target "CollectPackageReferences" depends on it):
       Task "NETSdkError" skipped, due to false condition; ('$(_TargetFrameworkVersionWithoutV)' > '$(NETCoreAppMaximumVersion)') was evaluated as ('3.0' > '5.0').
   1:5>Done building target "_CheckForUnsupportedNETCoreVersion" in project "checkeol.csproj".
   1:5>Target "_CheckForEolTargetFrameworks" in file "C:\Program Files\dotnet\sdk\5.0.104\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.EolTargetFrameworks.targets" from project "C:\repos\checkeol\checkeol.csproj" (target "CollectPackageReferences" depends on it):
       Using "NETSdkWarning" task from assembly "C:\Program Files\dotnet\sdk\5.0.104\Sdks\Microsoft.NET.Sdk\targets\..\tools\net5.0/Microsoft.NET.Build.Tasks.dll".
       Task "NETSdkWarning"
       C:\Program Files\dotnet\sdk\5.0.104\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.EolTargetFrameworks.targets(28,5): message NETSDK1138: The target framework 'netcoreapp3.0' is out of support and will not receive security updates in the future. Please refer to https://aka.ms/dotnet-core-support for more information about the support policy. [C:\repos\checkeol\checkeol.csproj]
       Done executing task "NETSdkWarning".
   1:5>Done building target "_CheckForEolTargetFrameworks" in project "checkeol.csproj".
...

The logs show that the _CheckForUnsupportedNETCoreVersion target was executed as part of the build, and the warning was emitted, but we just don't see it.

In contrast, if you run dotnet restore /p:CheckEolTargetFramework=false -v:detailed you'll see that the _CheckForUnsupportedNETCoreVersion target is skipped entirely:

> dotnet restore /p:CheckEolTargetFramework=false -v:detailed

1>Done building target "_CheckForUnsupportedNETCoreVersion" in project "checkeol.csproj".
       Target "_CheckForEolTargetFrameworks" skipped, due to false condition; ('@(_EolNetCoreTargetFrameworkVersions->AnyHaveMetadataValue('Identity', '$(_TargetFrameworkVersionWithoutV)'))' and '$(TargetFrameworkIdentifier)' == '.NETCoreApp' and '$(CheckEolTargetFramework)' == 'true') was evaluated as ('true' and '.NETCoreApp' == '.NETCoreApp' and 'false' == 'true').

Based on that, it makes most sense to set the CheckEolTargetFramework property to skip the task entirely.

Summary

In this post, I showed how to stop your .NET Core application generating warnings on build and restore when you're targeting a .NET Core framework that is no longer supported. You can do this by setting the <CheckEolTargetFramework> property to false in your project's .csproj file or by passing /p:CheckEolTargetFramework=false when running commands with the dotnet CLI or msbuild. Alternatively, you can ignore the warning generated by using /nowarn:netsdk1138 in your CLI commands.

Andrew Lock | .Net Escapades
Want an email when
there's new posts?