簡體   English   中英

'無法加載文件或程序集 'netstandard,版本 = 2.0.0.0,...'。 不應加載引用程序集以執行

[英]'Could not load file or assembly 'netstandard, Version=2.0.0.0, ...'. Reference assemblies should not be loaded for execution

目標:從 .NET 4.7 控制台應用程序,通過 Assembly.GetType() 使用反射,我嘗試從 Assembly 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);

哪個拋出:

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,或者這是否是一個錯誤,或者其他? 或者為什么這種dll無法加載執行?

您嘗試加載的 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

嘗試在您的場景中使用其中一個版本。

哇。 我只是花了幾個小時來跟蹤這個“無法加載... netstandard”錯誤的原因。

對我來說,問題在於我的 .NET Framework 項目(引用 .NET Framework 和 .NET Standard 庫)是使用 .NET Framework 4.7.2 構建的,而我部署和運行它的系統沒有 4.7.2安裝。

部署一個具有相同基本結構和引用的非常小的控制台項目,並在命令窗口中執行該項目,最終在彈出窗口中顯示了正確的錯誤,即缺少 .NET Framework 4.7.2。

如果您遇到這個特定錯誤,請確保安裝了必要的 .NET Framework。

在 netstandard.dll 屬性中將Copy Local設置為 true。

  1. 打開解決方案資源管理器並右鍵單擊 netstandard.dll。
  2. Copy Local設置為 true。

在此處輸入圖像描述

您無法加載參考程序集。

.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 類型。

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。

對我來說解決了以下問題: 1 - 在服務器上安裝了 latest.Net Framework。 2 - 更新了 windows 服務器和我的本地機器。 3 - 去管理 Nuget 包並更新更新選項卡上的所有引用。

也許只做第 3 步就可以解決你的問題

如果項目解決方案中使用了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)

從 NuGet 安裝 NetStandard.Library 2.0.0.0,它對我有用。 當我將 .net framework 4.6.1 降級到 4.6.0 時

如果您的項目曾經有效,請嘗試刪除binobj文件夾,因為緩存也可能導致此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM