'无法加载文件或程序集'netstandard,Version = 2.0.0.0,...'.不应加载引用程序集以执行

Vin*_*ois 18 .net c# 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);
Run Code Online (Sandbox Code Playgroud)

哪个投掷:

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上下文中加载.(HRESULT异常:0x80131058)'

内部异常:BadImageFormatException:无法加载引用程序集以执行.

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

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

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

Wes*_*ard 13

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

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


Mik*_*keZ 7

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

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

部署一个非常小的控制台项目,具有相同的基本结构和引用,并在命令窗口中执行,最终发现了正确的错误,在弹出窗口中,缺少 .NET Framework 4.7.2。

如果您正在为这个特定错误而苦苦挣扎,请确保您已安装必要的 .NET Framework。

  • 对我来说,当我开始使用 C#7 和 C#8 功能时,也出现了同样的问题。我所有的项目都以 .NET 4.6.1 为目标,并且它在我的机器上编译得很好(安装了 .NET 4.8)。然而,一旦部署到服务器上(没有 .NET 4.8),它就无法运行,给我带来了很多奇怪的错误,包括这个。我花了 1.5 天才意识到我需要在服务器上运行 4.8 运行时,尽管我的项目并没有专门针对它。另外,对于使用 UnityContainer 的人来说,您可能会收到“当前类型是一个接口,无法构造”的提示。您是否缺少类型映射?错误,也与此有关。 (2认同)

小智 6

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

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

在此处输入图片说明


pav*_*kin 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);
Run Code Online (Sandbox Code Playgroud)

一切都好。

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