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

5sxhfpxr  于 2023-03-09  发布在  .NET
关注(0)|答案(9)|浏览(1304)

**目标:**从一个.NET 4.7控制台应用程序,使用带有Assembly.GetType()的反射,我尝试从程序集X提取netstandard 2.0类的类型。然后我想使用Activator.CreateInstance()创建此类型的示例。
**我正在尝试做的事情:**但是,这个程序集X对netstandard 2.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);

它抛出:
系统错误图像格式异常:'未能加载文件或程序集“file:///C:\Users\vincent.lerouvillois.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll”或它的某个依赖项。不应加载引用程序集以供执行。只能在仅反射加载程序上下文中加载它们。(HRESULT异常:0x80131058)'
内部异常:错误图像格式异常:无法加载要执行的引用程序集。

**我所知道的:**我知道他们希望我们使用Assembly. ReflectionOnlyLoadFrom加载DLL。但是这样做会阻止我使用Activator.CreateInstance()示例化该类型。请参见Microsoft official post

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

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

vuktfyat

vuktfyat1#

您尝试加载的netstandard.dll是引用程序集,正如其他人所指出的,无法在.NET Framework上加载该程序集以用于运行时。但是,如果您需要解决该依赖项,则需要Map到您尝试运行的Framework的运行时版本。
对于.NET标准支持,我们将其作为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
尝试在您的场景中使用其中一个版本。

ctehm74n

ctehm74n2#

哇。我刚刚花了几个小时跟踪这个“无法加载... netstandard”错误的原因。
对我来说,问题是我的.NET Framework项目(同时引用.NET Framework和.NET标准库)是用.NET Framework 4.7.2构建的,而我部署和运行它的系统没有安装4.7.2。
部署一个具有相同基本结构和引用的非常小的控制台项目,并在命令窗口中执行该项目,最终在弹出窗口中显示了正确的错误,即缺少.NET Framework 4.7.2。
如果您遇到此特定错误,请确保已安装必要的.NET Framework。

e7arh2l6

e7arh2l63#

在netstandard.dll属性中将Copy Local设置为true。
1.打开解决方案资源管理器并右键单击netstandard.dll。
1.将Copy Local设置为真。

km0tfn4u

km0tfn4u4#

无法加载引用程序集。
.NET标准是API的集合,必须由.NET标准兼容实现提供。
引用程序集只包含协定。这意味着它不包含实现。您尝试加载的程序集包含.NET Standard 2.0协定。

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

uxh89sit

uxh89sit5#

NET标准2.0.0-预览1与net 461和net 47不兼容。
但对于真正的.NET核心SDK 2.0程序集(以及2.0.0-preview 2)

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

一切都好。
但是如果你需要加载preview 1库,也许你应该使用netstandard2.0而不是net 471。

8yoxcaq7

8yoxcaq76#

对我来说,解决做以下:1 -在服务器上安装了最新的.Net框架。2 -更新了windows服务器和我的本地计算机。3 -转到管理Nuget包并更新了更新选项卡上的所有引用。
也许只有执行步骤3才能解决您的情况

nle07wnf

nle07wnf7#

如果项目解决方案中使用了IBM Message Queue引用,则此异常指示用于引用MQ类的DLL与安装的主机(服务器).NET版本不兼容。
在这种情况下,我们需要使用最新的更新来更新服务器,并确保.NET最新版本可用,或者使用较低版本的IBM Message queue DLL作为参考。
旧版本DLL -amqmdnet.dll(由于不受支持,IBM不会引入任何新功能)
最新版本DLL -amqmdnetstd.dll(要运行.NET标准的IBM MQ类,必须安装Microsoft .NET核心)

t5zmwmid

t5zmwmid8#

安装NetStandard.Library2.0.0.0从NuGet,它为我工作。当我降级.net framework 4.6.1到4.6.0

j8ag8udp

j8ag8udp9#

如果您的项目曾经有过这样的问题,请尝试删除binobj文件夹,因为缓存也会导致这种情况。

相关问题