簡體   English   中英

在 .NET Core 應用程序中引用 DLL 時出現 FileNotFoundException

[英]FileNotFoundException when referencing DLL in .NET Core Application

我有一個 .NET Core 控制台應用程序和一個 .NET Core 類庫。 兩者都是非常簡單的單類項目。 兩者都是全新構建的,全新安裝了最新的 .NET Core。 兩者都針對 .NET Core 1.1。

每當我在應用程序中包含 .NET Core 類庫時,都會在運行時發生此錯誤:

System.IO.FileNotFoundException: '無法加載文件或程序集 'NAME,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null'。 系統找不到指定的文件。

構建任何一個項目都很好,並且 Intellisense 在包含using...語句后向我展示了類庫的內容。 使用參考和代碼編寫,編譯時沒有問題。

我已將控制台應用程序中引用的程序集的Copy Local設置為Yes 運行時引用的 DLL 存在於控制台應用程序的bin文件夾中。

這是csproj參考:

<Reference Include="NAME">
  <HintPath>path\bin\Debug\netcoreapp1.1\NAME.dll</HintPath>
  <Private>true</Private>
  <SpecificVersion>false</SpecificVersion>
</Reference>

這僅發生在 .NET Core DLL 中,我對 .NET Framework 4.5.* 及更高版本絕對沒有問題。

有人可以對這個問題有所了解嗎? 我發現的任何關於此的 SO/MSDN 頁面都是特定問題,例如針對 DLL 的錯誤版本,這無濟於事。

使用 2.0 之前的工具不支持在 .NET Core 應用程序中引用 DLL 文件。

原因是依賴關系圖( deps.json文件)生成不包括這些文件,並且很可能無論如何都不會工作,因為它無論如何都無法合並引用的 DLL 的引用/依賴關系。

對於即將發布的 2.0 版本,只要您還引用原始程序包正在使用的所有 DLL/程序包,此方案就應該有效。 語法是:

<Reference Include="path/to/my.dll" />

.NET Core 2.0 還將支持以這種方式引用為 .NET 4.6.1 構建的程序集,但如果 DLL 使用不受支持的 API 調用,它可能會在運行時失敗。

經過大量挖掘,我找到了適合我的 .NET Core 2.0 解決方案。

核心問題:我通過Visual Studio 2017添加了項目引用。在我的web應用中,我引用了兩個.NET Core庫; 當一切都編譯時,在運行時,我得到一個指向兩個 DLL 之一的 FileNotFound 異常。

對我有用的解決方案:

  • 關閉 Visual Studio
  • 打開包含引用的.csproj 刪除對項目的引用。
  • 從終端, cd進入項目文件夾並手動dotnet add reference ..\\..\\foo\\bar.csproj ,使用dotnet add reference ..\\..\\foo\\bar.csproj
  • 啟動 Visual Studio,構建並運行您的(Web)應用程序

對我來說,這解決了這個問題。

不確定這是否算作修復,但至少是一種解決方法。

我沒有引用 DLL,而是簡單地將類庫的項目添加到控制台應用程序,在控制台應用程序中包含對類庫項目的依賴項引用並清理/重建。 工作正常。

顯然,這不是專有 DLL 的修復程序,但它可能會有所幫助。

不確定正確與否; 但我的經驗:

如果我的任何類庫項目(作為對 Web API 項目的引用添加)引用 DLL/程序集(從本地路徑)而不是通過 NuGet 添加,那么我還必須將所有這些 DLL 的引用添加到 Web API 項目,即使並不需要。

除了以上:
如果 Web API 項目中沒有引用單個 DLL/程序集,那么即使不向 Web API 項目添加程序集引用,一切都可以正常工作。 但是,如果添加了任何單個程序集引用,那么我必須添加所有引用。

不確定這是否是預期的。 決定分享經驗,因為這里沒有任何答案對我有用。

暫無
暫無

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

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