‘无法加载文件或程序集’netstandard,Version = 2.0.0.0,…’。 不应加载引用程序集以执行

目标:从.NET 4.7控制台应用程序,使用Assembly.GetType()的reflection,我尝试从程序集X中提取netstandard 2.0类的类型。然后我想用Activator.CreateInstance()创建此类型的实例。

我想要做的是:但是,这个程序集X依赖于netstandard 2.0。 为了能够获取Type,必须将netstandard依赖项加载到AppDomain中。 这就是为什么当AppDomain通过AssemblyResolve事件请求netstandard程序集时,我只需加载这样的dll:

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); 

哪个投掷:

System.BadImageFormatException:’无法加载文件或程序集’文件:/// C:\ Users \ vincent.lerouvillois.nuget \ packages \ NETStandard.Library.2.0.0-preview1-25301-01 \ build \ netstandard2.0 \ ref \ netstandard.dll’或其依赖项之一。 不应加载引用程序集以执行。 它们只能在Reflection-only loader上下文中加载。 (HRESULTexception:0x80131058)’

内部exception:BadImageFormatException:无法加载引用程序集以执行。

我所知道的:我知道他们希望我们使用Assembly.ReflectionOnlyLoadFrom加载DLL。 但这样做会阻止我使用Activator.CreateInstance()实现类型。 请参阅Microsoft官方post

另外,我尝试在我的控制台应用程序中引用Nuget软件包NETStandard.Library 2.0.0-preview1-25301-01和NETStandard.Library.NETFramework 2.0.0-preview1-25305-02,这样它就会引用netstandard 2.0库,但是它没有改变任何东西。

问题:有没有人知道是否有正确的方法加载该DLL而没有错误,或者可能是否是一个bug,或者? 或者为什么这种DLL无法加载执行?

您无法加载参考assembly。

.NET Standard是必须由.NET Standard兼容实现提供的API集合。

引用程序集仅包含合同。 这意味着它不包含任何实现。 您尝试加载的程序集包含.NET Standard 2.0合同。

合同如下: https : //github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs

编辑: .NET Framework 4.7实现了.NET Standard 2.0,因此您不需要加载任何程序集来使用Activator.CreateInstance()来实例化.NET Standard类型。

您尝试加载的netstandard.dll是一个引用程序集,无法在.NET Framework上为运行时加载,如其他人所指出的那样。 但是,如果您需要解决该依赖关系,则需要运行时版本映射到您尝试运行的框架。

对于.NET Standard支持,我们将它们包含在VS附带的msbuild扩展中,因此您需要从那里获取netstandard.dll的版本。 根据您安装的VS2017的版本,它应该位于C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll或者从.NET Core 2.0 SDK中可以找到它C:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll

尝试在您的方案中使用其中一个版本。

NETStandard 2.0.0-preview1与net461和net47不兼容。

但是对于realese .NET Core SDK 2.0程序集(以及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); 

一切都好。

但如果你需要加载preview1库,也许你应该使用netstandard2.0而不是net471。

在netstandard.dll属性中将Copy Enbale设置为true。

  1. 打开Solution Explorer并右键单击netstandard.dll。
  2. Copy Enbale设置为true。

在此处输入图像描述