In a large solution with 52 projects (all net462), the latest version of some of our dependencies are now only built for NET standard. Therefore they depend on the NuGet package NETStandard.Library
which in turn drags in a lot of other 4.3.x version of System.*
packages which are normally in the .NET Framework itself.
As a result, some projects reference System.*
libraries from the packages folder, while others reference System.*
libraries from the .NET Framework.
This causes the well-known runtime issue, f.e.:
Message: System.IO.FileLoadException : Could not load file or assembly 'System.Net.Http, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Digging into the dependencies of the NETStandard.Library
packages, we can see that the same issue also exists in these packages:
Normally this is fixed by installing the same package in the other projects, but we're dealing with a lot of projects and a lot of packages here and I don't want to blindly add all of those dependencies to all 52 projects.
This made me wonder whether anyone knows of an easy way to recover from this situation and to make all projects reference the correct package/DLL from the NuGet packages folder if they currently use the NET Framework internal one.
A simple VS-solution for net462 and net471 demonstrating the problem can be found here
NET standard 2.0 types and members are all packet in a single assemblies netstandard. dll v2. 0 that can be found under C:\Program Files\dotnet\sdk\NuGetFallbackFolder\netstandard.
You cannot consume a . Net Standard 2.1 assembly in any . Net Framework Version because the . NET Framework (even the last ever version, 4.8) does not implement .
Net Standard is a specification which dictates what the Base Class Libraries of different . Net platforms should implement to unify the Base Class Libraries of different . Net Platforms. Here, Platform means full .
It can be installed on linux/mac/windows. NET Standard is a set of interfaces that help to guarantee cross-compatibility no matter whether you are running NET Framework or NET 5/6/7. Targeting Netstandard 2.0 or lower means you'll be able to run on NET 5/6/7 or NET Framework 4.
In the default project template System.Net.Http
is added to the project as a reference, not as a nuget package.
In both of your solutions (4.6.1 and 4.7.1):
Project ClassLibrary
has a dependency on System.Net.Http
as a nuget package.
Project ConsoleApp1
has a dependency on System.Net.Http
as a simple reference from .NET Framework
So, the issue is not related to Target Framework version.
To fix the issue add the same version of
System.Net.Http
as a nuget package to all projects (where it is used).
Right-click the solution in Solution Explorer and choose Manage NuGet Packages for Solution...
Switch to Installed
tab
Find System.Net.Http
in the list, select it.
Check current state:
Install the same version of the package (4.3.0 in your case) to ConsoleApp1
project.
Check the result:
Done.
Also, it's good practice to have package versions consolidated in your solution. Instead, you could have version conflicts during build time. Or, which is worse, runtime error like MethodNotFound
because of binding redirect to another version of the dependency.
The reason for the problem with System.Net.Http
is described here: Broken System.Net.Http 4.1.1-4.3.0 post-mortem in section How to prevent such situation in future? 2.1
As a result we identified 2 problematic OOB packages, which are not leaf-nodes in the platform itself, and have dependency from the platform on them - System.Net.Http and System.IO.Compression.
It means that the same System.Net.Http
library is shipped within .NET Framework and as OOB (out-of-band) nuget package. And some nuget packages could reference nuget version of it. And here it comes the problem that I described at the very beginning.
So, you don't have to fix references to all System.*
libraries. Only for these two: System.Net.Http
and System.IO.Compression
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With