C# ';无法加载文件或程序集';netstandard,版本=2.0.0.0,&';。不应加载引用程序集以执行

C# ';无法加载文件或程序集';netstandard,版本=2.0.0.0,&';。不应加载引用程序集以执行,c#,.net,dll,.net-assembly,.net-standard,C#,.net,Dll,.net Assembly,.net Standard,目标: 从.NET 4.7控制台应用程序中,使用带有Assembly.GetType()的反射,我试图从Assembly X中提取netstandard 2.0类的类型。然后我想使用Activator.CreateInstance()创建此类型的实例 我想做什么: 但是,此程序集X依赖于NetStandard2.0。要获得类型,必须将netstandard依赖项加载到AppDomain中。这就是为什么当AppDomain通过AssemblyResolve事件请求netstandard程序集时,我

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

我想做什么: 但是,此程序集X依赖于NetStandard2.0。要获得类型,必须将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:'无法加载文件或程序集 'file:///C:\Users\vincent.lerouvillois.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\NETStandard.dll' 或者它的一个依赖项。不应加载引用程序集 执行死刑。它们只能在仅反射加载程序中加载 上下文(HRESULT的例外:0x80131058)'

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

我所知道的: 我知道他们想让我们用Assembly.ReflectionOnlyLoadFrom加载DLL。但是这样做会阻止我使用Activator.CreateInstance()实例化该类型。看

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

问题:
是否有人知道是否有一种正确的方法来加载dll而不出错,或者这是一个bug,或者其他?或者为什么这种dll无法加载以执行?

NETStandard 2.0.0-preview1与net461和net47不兼容

但对于realese.NET核心SDK 2.0程序集(以及2.0.0-preview2)

一切都好


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

您不能加载引用程序集

.NET标准是API的集合,必须由兼容.NET标准的实现提供

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

合同如下所示:


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

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

对于.NET标准支持,我们将它们作为VS随附的msbuild扩展的一部分包含在内,因此您需要从中获取netstandard.dll的版本。根据您安装的VS2017版本,它应该类似于
C:\ProgramFiles(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.dll属性中将
Copy Enbale
设置为true

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

  • 从NuGet安装NetStandard.Library 2.0.0.0,它适合我。当我将.net framework 4.6.1降级到4.6.0时,请执行以下操作: 1-在服务器上安装了最新的.Net Framework。 2-更新了windows服务器和我的本地计算机。 3-转到管理Nuget软件包并更新了“更新”选项卡上的所有引用


    也许只有执行第3步才能解决您的问题。我只是花了几个小时跟踪“无法加载…netstandard”错误的原因

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

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


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

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

    在此场景中,我们需要使用最新更新更新服务器并确保.NET最新版本可用,或者使用IBM消息队列DLL的较低版本作为参考

    旧版本DLL-amqmdnet.DLL(IBM不会引入新功能,因为它不受支持)


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

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

    永远不要加载引用程序集,它们仅适用于构建您的程序。这出了问题,因为是你写的
     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);