'Could not load file or assembly 'netstandard, Version=2.0.0.0, ...'. Reference assemblies should not be loaded for execution

28

Goal: From a .NET 4.7 console app, using reflection with Assembly.GetType(), I am trying extract the Type of a netstandard 2.0 class from Assembly X. Then I want to create an instance of this Type with Activator.CreateInstance().

What I am trying to do: However, this assembly X has a dependency to netstandard 2.0. To be able to get the Type, netstandard dependency has to be loaded into the AppDomain. That's why when the AppDomain is requesting the netstandard assembly through the AssemblyResolve event, I simply load the dll like this :

var netStandardDllPath = @"C:\Users\xxx\.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll";

return Assembly.LoadFrom(netStandardDllPath);

Which throws:

System.BadImageFormatException: 'Could not load file or assembly 'file:///C:\Users\vincent.lerouvillois.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll' or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)'

Inner Exception: BadImageFormatException: Cannot load a reference assembly for execution.

What I know: I know that they want us to load the DLL with Assembly.ReflectionOnlyLoadFrom. But doing that will prevent me from instanciate the type with Activator.CreateInstance(). See Microsoft official post

Also, I tried referencing the Nuget packages NETStandard.Library 2.0.0-preview1-25301-01 and NETStandard.Library.NETFramework 2.0.0-preview1-25305-02 in my console app so it would have the netstandard 2.0 libraries referenced, but it didn't change anything.

Question: Does anyone would know if there is a proper way to load that dll without error, or maybe if this is a bug, or else? Or why this kind of dll is not able to load for execution?

c#
.net
dll
.net-assembly
.net-standard
asked on Stack Overflow Jul 10, 2017 by Vincent Lerouvillois • edited Jan 10, 2018 by Athari

9 Answers

21

The netstandard.dll you are trying to load is a reference assembly that which cannot be loaded for runtime on .NET Framework as pointed out by others. However if you need to resolve that dependency you will need to runtime version that maps to the framework you are trying to run on.

For .NET Standard support we are including them as part of the msbuild extensions that ship with VS so you will want to get the version of netstandard.dll from there. Depending on which version of VS2017 you have installed it should be somewhere like C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll or from the .NET Core 2.0 SDK you can find it C:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll

Try using one of those versions in your scenario.

answered on Stack Overflow Aug 25, 2017 by Wes Haggard
10

Set Copy Enbale to true in netstandard.dll properties.

  1. Open Solution Explorer and right click on netstandard.dll.
  2. Set Copy Enbale to true.

enter image description here

answered on Stack Overflow Sep 13, 2018 by Armaan
6

Wow. I just spent several hours tracking the cause of this "could not load ... netstandard" error down.

For me, the problem was that my .NET Framework project (which references both .NET Framework and .NET Standard libraries) was built with .NET Framework 4.7.2 and the system where I was deploying and running it did not have 4.7.2 installed.

Deploying a very small Console project with the same basic structure and references and executing that in a Command window finally revealed the correct error, in a pop-up, that .NET Framework 4.7.2 was missing.

If you're struggling with this particular error, make sure you have the necessary .NET Framework installed.

answered on Stack Overflow Jun 21, 2019 by MikeZ
3

You can't load a reference assembly.

.NET Standard is a collection of APIs that must be provided by .NET Standard compatible implementations.

A reference assembly only contains contracts. This means that it contains no implementation. The assembly you are trying to load contains the .NET Standard 2.0 contracts.

A contract looks like this: https://github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs

EDIT: .NET Framework 4.7 implements .NET Standard 2.0, so you shouldn't need to load any assembly to use Activator.CreateInstance() to instantiate a .NET Standard type.

answered on Stack Overflow Aug 20, 2017 by José Pedro
2

NETStandard 2.0.0-preview1 in not compatibility with net461 and net47.

but for realese .NET Core SDK 2.0 assemblies (as well as 2.0.0-preview2)

 var netStandardDllPath = @"c:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\netstandard.dll";
 Console.WriteLine(Assembly.LoadFrom(netStandardDllPath).FullName);

all is ok.

But if you steel need to load preview1 libraries, maybe you should to use netstandard2.0 instead net471.

answered on Stack Overflow Aug 17, 2017 by pavel.smolkin
1

For me solved doing the following: 1 - Installed latest .Net Framework on server. 2 - Updated windows server and my local machine. 3 - Went to Manage Nuget Package and updated all references on the update tab.

Perhaps only doing step 3 can solve in your case

answered on Stack Overflow Mar 29, 2019 by VINICIUS SIN
1

In case if IBM Message Queue references are used in the project solution, this exception indicates that the DLL used for refering MQ classes are incompatible with the host(server) .NET version installed.

In this scenario, either we need to update server with latest update and make sure .NET latest version is available or use lower version of IBM Message queue DLL as reference.

Old version DLL - amqmdnet.dll (no new features will be introduced by IBM as not in support)

Latest version DLL - amqmdnetstd.dll (to run IBM MQ classes for .NET Standard, you must install Microsoft .NET Core)

answered on Stack Overflow Jun 11, 2020 by Clinton Joshi
0

Install NetStandard.Library 2.0.0.0 from NuGet , It works for me. when I downgrade .net framework 4.6.1 to 4.6.0

answered on Stack Overflow Feb 12, 2019 by R Riteshk
0

If you are having this issue for a project that used to work, try deleting the bin and obj folders since caching can cause this, too.

answered on Stack Overflow Dec 22, 2020 by havij

User contributions licensed under CC BY-SA 3.0