Referencing .NET Standard Assemblies from both .NET Core and .NET Framework
I like getting great questions in email but I LOVE getting great questions in email with a complete and clear code repro (reproduction) that's in a git somewhere. Then I can just clone, build (many many bonus points for a clean build) and check out the bug.
I got a great .NET Core question and repro here https://github.com/ScarlettCode/Example. I forked it, fixed it, and submitted a PR. Here's the question and issue and today's fix.
The project has a C# library project (an assembly) that is written to the .NET Standard 2.0. You'll recall that the .NET Standard isn't a runtime or a library in itself, but rather an interface. They are saying that this library will work anywhere that the .NET Standard is supported, like Linux, Mac, and Windows.
Here's that main .NET Standard Library called "Example.Data" written in C#.
Then he had:
- Windows Forms (WinForms) application in VB.NET using .NET "full" Framework 4.6
- Console Application also using .NET Framework 4.6
- Console Application using .NET Core 2.0
Each of these apps is referring to the Example.Data library. The Example.Data library then pulls in a database access library in the form of Microsoft.EntityFrameworkCore.InMemory via NuGet.
WinForms app -> Data Access library -> Some other library. A->B->C where B and C are packages from NuGet.
The .NET Core console builds and runs great. However, when the other projects are run you get this error:
Could not load file or assembly
or one of its dependencies. The system cannot find
the file specified.
Pretty low level error, right? First thing is to check the bin folder (the results of the compile) for a project that doesn't run. Looks like there's no Microsoft.EntityFrameworkCore there. Why not? It's assembly "C" downstream of "A" and "B". EntityFramework's assembly is referred to by the Example.Data assembly...but why didn't it get copied in?
The "full" Framework projects are using the older .csproj format and by default, they use package.config to manage dependencies. The newer projects can reference Packages as first-class references. So we need to tell ALL projects in this solution to manage and restore their packages as "PackageReferences."
I can open up the .csproj file for the Framework projects and add this line within the first <PropertyGroup> like this to change the restore style:
As Oren wisely says:
"Using .NET Standard requires you to use
PackageReferenceto eliminate the pain of “lots of packages” as well as properly handle transitive dependencies. While you may be able to use .NET Standard without
PackageReference, I wouldn’t recommend it."
I can also change the default within VS's Package Management options here in this dialog.
Hope this helps.