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