Full .NET references .NET Standard class library: FileNotFoundException - c#

I've just created 2 projects with Visual Studio 2019 (16.3.3):
class library (netstandard2.0)
+Microsoft.EntityFrameworkCore, Version 2.2.4
+custom Repository class to hide DbContext class
WPF project (v4.7.1)
+reference to the class library above
+some code to use the Repository:
var r = new Repository(#"Server=(localdb)\MsSqlLocalDB; Database=EfCore2Wpf; Trusted_Connection=True;");
DataContext = r.GetItems(); // FileNotFoundException here.
Here's the complete exception:
System.IO.FileNotFoundException: 'Could not load file or assembly "Microsoft.EntityFrameworkCore, Version=2.2.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60" or one of its dependencies. The specified module could not be found.'
That's right! There's no Microsoft.EntityFrameworkCore.dll inside \WpfApp\bin\Debug folder.
But why?
(I have some legacy solutions with the same project types and they work. What's wrong here?)
For your information:
1) Including a single .NET Core package like Microsoft.EntityFrameworkCore.SqlServer cause a Million <Reference Include="..."><HintPath>..\packages\...dll</HintPath></Reference> entries. That's no option.
2) As far as I remember I had to migrate my legacy WPF projects to pass indirect .NET Core references: https://learn.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference. But currently I don't need any NuGet package in my WPF project so there's no package.config. And without a package.config file I cannot migrate!

It's a bug and not fixed because nobody cares: https://developercommunity.visualstudio.com/content/problem/769172/a-full-net-project-is-not-in-packagereference-form.html
Workaround:
Add an arbitrary NuGet Package (e.g. NLog, AutoMapper, MvvmLightLibs or whatever).
Right-click on the new packages.config file → "Migrate packages.config to PackageReference..." (you might not need this step if "PackageReference" is your "Default package management format", check Tools → NuGet Package Manager)
Works!
Or even faster: Add to your *.csproj
<ItemGroup>
<PackageReference Include="NLog" Version="4.6.7" />
</ItemGroup>
Warning: Use tool support like ReSharper's "Optimize References..." with caution! It would remove the unused reference. :-(

Related

Possibility to avoid adding nuget package reference in favor of assembly reference incl. dependencies?

is there a way to avoid nuget package references to ease development on a developers machine?
we are currently about to move some of our projects in our "shared" solution to the new csproj file structure (using <Project Sdk="Microsoft.NET.Sdk">) and using <TargetFramework>netstandard2.0</TargetFramework>.
By doing so we had to include <PackageReference Include="System.Text.Encodings.Web" Version="4.7.0" /> and changing some of our code in project "S" of our shared solution.
Within another solution backend we are having multiple projects. Some of them are referencing the assembly of project S by using assembly reference to S.dll like so:
<Reference Include="ournamespace.S">
<HintPath>..\..\artifacts\Shared\ournamespace.S\ournamespace.S.dll</HintPath>
</Reference>
When we build every works fine. However when running our web application W from backend solution we get this exception:
System.IO.FileNotFoundException: Could not load file or assembly 'System.Text.Encodings.Web, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.
Before we have migrated our shared projects to the "new SDK" project file format, before using .netstandard2.0 (we were using .net framework 4.7.2) and before we switched the package reference to System.Text.Encodings.Web (we were using <PackageReference Include="AntiXSS" Version="4.3.0" />) we have not received any error.
The only way i can think of is that we would need to switch from assembly reference for S.dll to use nuget - to get S dependencies.
However using nuget packages for our shared solutions projects and developing in backend projects would become a nightmare as we would need to create a new nuget package (and publishing it) on every change of S and would need to increase the version number in the package references in backend projects all the time. Also this would become very impractical as our developers are using various git feature branches too (thinking about versioning conflicts; having to release unfinished packages and maybe using version suffix "alpha_"+{branchName} to distinct the branch that this version is coming from).
How to develop on localhost? Is there a way to avoid nuget (but getting its dependencies resolved correctly!)?
I was already reading about having assembly references for local development while using nuget package references for CI builds by using conditionals in the csproj file (however this is also not working very well with VS2017; also this would not resolve our problem with the dependency problem written above on localhost)
What other possibilities are there? Is there a best way on how to handle this?
Thanks in advance!
P.S. I dont want to include S's dependencies to every project that references S by using package references there as well. This would not be a solution and becomes more cumbersome when S might get new dependencies for whatever reason.
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
solved my problems (see How to get .NET Core projects to copy NuGet references to build output? for details)

.NET Framework dll Could not load file or assembly 'Newtonsoft.Json....'

I am creating a c# .net framework library (.dll) that will act as a plugin for another piece of software. I want to use the Newtonsoft.json library but when the I call the json library I get the classic "FileNotFoundException":
Could not load file or assembly 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified.
The .dll is definitely being copied to the directory I am trying to run the plugin from. A lot of others have had this issue and I have tried everything I've seen (updating, reinstalling, etc.) but no luck yet. Because this is a class library I do not have an "app.config" file to play with binding redirects, so I haven't been able to try that.
I have very basic code right now, this package is the only external reference I am using. I've only been working on this today, only ever trying with Newtonsoft.Json version 12.0.2. It is weird to me that it appears VS is looking for 12.0.0.0, however. This is not an option to download. Similarly, I've tried downgrading to version 11.0.2, and then it gives me the same error saying it can't find version 11.0.0.0.
Even though your project may not have an .app config, you can still view the package references by unloading your project and viewing the .csproj file.
To try and force a direct reference to Newtonsoft.Json 12.0.2, you can add this snippet
<ItemGroup>
<PackageReference Include="Newtonsoft.Json">
<Version>12.0.2</Version>
</PackageReference>
</ItemGroup>
I would recommend removing any other references in your .csproj for Newtonsoft.Json as well

Why does my .NET Standard 2.0 (multi-targetting) project has a warning on one of the dependent assemblies?

I have a project that is currently targetting NetStandard1.4.
I'm trying to make it multi-target-frameworks for:
net461
netstandard14
netstandard20
the rational is for a particular framework (an app targets), only pull down the minimum number of assemblies. So in the example above, ns14 has a min framework of 461, but an app that is targeting net461 pulls down some core stuff which people are saying adds extra noise, when those assemblies are not getting used.
When I try and target those 3 frameworks, I get some warning in the NetStandard2.0 version.
I try hovering the mouse over that assembly in Visual Studio but no tool-tip displays. Also, the errorlist or output (build) window has no explanation there.
Is there a way I can see what the warning is? Maybe even via CLI?
You are referencing System.Net.Http in .netStandard projects. This reference is already present in NetStandard.Library, so you don't need to add it. Most of the time, you should only reference projects or NuGet package.
On my computer, dotnet build does fail with the following warning:
C:\Program Files\dotnet\sdk\2.1.100-preview-007326\Microsoft.Common.CurrentVersion.targets(2051,5): warning MSB3245: Could not resolve this reference. Could not locate the assembly "System.Net.Http". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
If you don't want to add a reference to NetStandard.Library, the solution is to add reference only to the net461 version using the Condition attribute:
<PropertyGroup>
<TargetFrameworks>net461;netstandard1.4;netstandard2.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net461'">
<Reference Include="System.Net.Http" />
</ItemGroup>

How do I add assembly references in Visual Studio Code?

So I've come across a similar issue twice now while working on my first project in C#. When trying to add either using System.Data; or using System.Timers;, I get the following error:
The type or namespace name 'x' doesn't exist in the namespace 'System' (are you missing an assembly reference?).
I have tried beginning a new project and running restore to see if I had accidentally removed something in the dependencies, but upon generating a new project I still receive the same error. I have tried to research the question and have seen answers referring to the 'solutions explorer', but as far as I can see there doesn't seem to be such a feature by this name in Visual Studio Code 1.8.
Can anyone point me in the right direction for how to get these working, perhaps by manually adding into the dependencies?
.csproj Project file
The following topic applies to .csproj project file and : .NET Core 1.x SDK, .NET Core 2.x SDK
Adds a package reference to a project file.
dotnet add package
Example
Add Newtonsoft.Json NuGet package to a project:
dotnet add package Newtonsoft.Json
.json Project file
The following topic applies to .json project file:
This guide walks you through the process of adding any assembly reference in Visual Studio Code. In this example, we are adding the assembly reference System.Data.SqlClient into .NET Core C# console application.
Note
At step #6, enter the assembly reference that you want.
Some assembly reference is applicable to .NET Framework and it will gives you error(s).
OleDb is not available in .NET Core, probably because it's not cross platform.
Prerequisites
Install Visual Studio Code
Install .NET Core SDK (Preview 2 version)
Install NuGet Package Manager from the Visual Studio Code Extension Marketplace
Install C# extension from Visual Studio Code Extension Marketplace
Steps
Launch Visual Studio Code
Open your project folder
Launch VS Code Command Palette by pressing F1 or Ctrl+Shift+P or Menu Bar > View > Command Palette
In Command Palette box, type nu
Click on NuGet Package Manager: Add Package
Enter package filter e.g. system.data (Enter your assembly reference here)
Press Enter
Click on System.Data.SqlClient
The following prompt pops up
Click on Restore
The following Output panel pops up
In the Explorer panel, click on project.json to open it
In the Editor panel, it shows the assembly reference added into project.json file
Assembly reference, System.Data.SqlClient used in Program.cs
Use the command dotnet add package to add a package reference to your project. For example: dotnet add package Newtonsoft.Json, which adds the package reference to the *.csproj project file:
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
and now you can run the command dotnet restore to restores the dependencies of your project.
Reference: dotnet add package
drag the dll file and drop it into the bin folder
Above answer from ikolim doesnt work as indicated by someone else too, there is no, Nuget: Install/Reference command. There is only Add Package! So the answer in the below link solved my problem. Manually editing the Myproject.csproj file.
Duplicate of this thread
I've stored the files in a project folder named "dlls" and added the reference files in my .csproj file like this:
<ItemGroup>
<Reference Include="Microsoft.Office.Client.Policy.Portable">
<HintPath>dlls\Microsoft.Office.Client.Policy.Portable.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Office.Client.TranslationServices.Portable">
<HintPath>dlls\Microsoft.Office.Client.TranslationServices.Portable.dll</HintPath>
</Reference>
</ItemGroup>
In case of extisting .dll reference,
Right click project
Add existing item > select path to .dll
After added dll in project,right click .dll
build-action = Content, Copy-to-output-dir = Always/ or if newer

Add project.json package references to a VSIX

When trying to add references to a VSIX, it normally pulls it from the references in the .csproj. However, if the references are not in the .csproj, because they now are in a project.json file, then they don't get pulled to the vsix. The solution then may compile, but then the extension fails with "file not found" errors when installed into Visual Studio (since the assemblies where not copied to the VSIX).
I tried with the section of the manifest like so:
<Asset Type="Microsoft.VisualStudio.Assembly" d:Source="Project" d:ProjectName="*PROJECTNAME*" Path="|*ASSEMBLYNAME*|" AssemblyName="|*ASSEMBLYNAME*;AssemblyName|" />
But it does not work, as it does not recognize the package references.
After some research I saw a similar issue with a PCL, however, without an answer and not the same type of problem: MEF With Portable Class library using Microsoft Composition MEF2 throws file not found exception
In the same note, this seems like an acceptable workaround: VSIX with Project Templates and NuGet Packages however, as far as I understood, it implies using the package during the installation. Besides that, it doesn't work for our case as they need to specify the package version and we are using project.json so we can use floating versions (ie: 2.0.*)
Is there a way to reference this project.json references that we are missing? Maybe a workaround? The solutions I have found seem to all require to "paste" de DLL somewhere, which for floating versions is not that convenient.
Thanks in advance for any help or input.
Edit/Update: Since VSIX automatically pushes any assembly referenced in the CSPROJ (and not the project itself), trying to get the DLLs at a project level seems unlikely. After many tries, I think that a valid workaround would be to get the assemblies from the Output Folder. However, to my knowledge, VSIX does not have a way of doing this, or does it?
I'm not sure I'm understanding your question correctly, but if you're trying to install a Project Template via a VSIX and you want the project template to include all it's nuget packages when you use it you could do something like this.
Edit your Project Template's xproj file and add the following lines:
<ItemGroup>
<None Include="project.json"/>
<None Include="project.lock.json"/>
</ItemGroup>
Edit your Project Template's vstemplate file and add the following lines in the Project node:
<ProjectItem ReplaceParameters="true" TargetFileName="project.json">project.json</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="project.lock.json">project.lock.json</ProjectItem>
That should be all you need to do. Now when you install the project template, then create a new project using that template it should include all the nuget packages that were in the project.json file.

Categories

Resources