'无法加载文件或程序集“netstandard”,版本= 2.0.0.0,...'。不应加载引用程序集以执行

时间:2017-07-10 21:32:30

标签: c# .net dll .net-assembly .net-standard

目标: 从.NET 4.7控制台应用程序,使用Assembly.GetType()的反射,我尝试从程序集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:\用户\ vincent.lerouvillois.nuget \包\ NETStandard.Library.2.0.0-preview1-25301-01 \构建\ netstandard2.0 \ REF \ netstandard.dll'   或其中一个依赖项。不应加载参考装配   执行。它们只能加载到仅反射加载器中   上下文。 (HRESULT异常:0x80131058)'

     

内部异常:BadImageFormatException:无法加载引用   装配执行。

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

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

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

9 个答案:

答案 0 :(得分:11)

您尝试加载的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

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

答案 1 :(得分:5)

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

  1. 打开解决方案资源管理器,然后右键单击netstandard.dll。
  2. Copy Enbale设置为true。

enter image description here

答案 2 :(得分:3)

您无法加载参考装配。

.NET Standard是一组API,必须由.NET Standard兼容的实现提供。

参考程序集仅包含合同。这意味着它不包含任何实现。您尝试加载的程序集包含.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类型。

答案 3 :(得分:2)

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。

答案 4 :(得分:0)

从NuGet安装NetStandard.Library 2.0.0.0,它对我有用。当我将.net Framework 4.6.1降级到4.6.0

答案 5 :(得分:0)

对我来说,解决了以下问题: 1-在服务器上安装了最新的.Net Framework。 2-更新了Windows Server和我的本地计算机。 3-去管理Nuget软件包并更新了更新选项卡上的所有引用。

也许只有执行步骤3才能解决您的情况

答案 6 :(得分:0)

哇。我只是花了几个小时来跟踪此“无法加载... netstandard”错误的原因。

对我来说,问题是我的.NET Framework项目(同时引用.NET Framework和.NET Standard库)是使用.NET Framework 4.7.2构建的,而我用于部署和运行它的系统没有已安装4.7.2。

部署一个具有相同基本结构和引用的非常小的Console项目并在Command窗口中执行它,最终在弹出窗口中显示出.NET Framework 4.7.2丢失的正确错误。

如果您遇到此特定错误,请确保已安装必要的.NET Framework。

答案 7 :(得分:0)

如果在项目解决方案中使用了 IBM Message Queue 引用,则此异常表示用于引用MQ类的DLL与所安装的主机(服务器).NET版本不兼容。

在这种情况下,我们需要使用最新更新来更新服务器并确保.NET最新版本可用,或者使用较低版本的IBM Message queue DLL作为参考。

旧版本DLL- amqmdnet.dll (IBM不会引入不支持的新功能)

最新版本的DLL- amqmdnetstd.dll (要为.NET Standard运行IBM MQ类,必须安装Microsoft .NET Core)

答案 8 :(得分:0)

如果您在以前可以工作的项目中遇到此问题,请尝试删除 binobj 文件夹,因为缓存也会导致此问题。