簡體   English   中英

.NET Core無法加載具有依賴項的.NET Standard類庫

[英].NET Core unable to load .NET Standard class library with dependencies

項目結構

我有三個項目

  • “網絡”:ASP.NET Core 2.0項目
  • “ LibA”:.NET Standard 2.0類庫
  • “ LibB”:.Net Standard 2.0類庫

LibA是從Web引用的(通過DLL引用)。 LibA被LibA引用(通過項目引用,因為LibA和LibB在同一個VS2017解決方案中)。

在實踐中,有更多的項目和參考,但是我已經重現了這個問題。

我在Docker構建映像中使用命令發布了Web項目:

dotnet publish -c Release -o /app 

依賴問題

通過檢查正在構建的docker映像,/ app文件夾同時包含LibA.dll和LibB.dll,因為它隱式確定需要包含LibB.dll才能使“網絡”工作。 到現在為止還挺好。

但是,當我嘗試運行docker容器時,即使兩個DLL與Web應用程序/ app位於同一文件夾中,我也會收到此錯誤:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'LibB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.

另一方面,如果我從Web明確引用了LibA和LibB,則可以運行該項目而不會出現錯誤。

來自.NET Framework世界,通常程序集位於同一文件夾中就足夠了,但是顯然我需要做其他事情才能使依賴項的依賴項起作用?

項目文件

網站:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.2" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.2" />
  </ItemGroup>


  <ItemGroup>
    <Reference Include="LibA">
      <HintPath>..\lib\LibA.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

力霸:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\LibB\ClassLibraryB.csproj" />
  </ItemGroup>
</Project>

LibB:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
</Project>

我決定提出答案,因為它超出了注釋的字符數限制。

我復制了這些項目文件,但仍然無法重現該問題。 發布應用程序不會在已發布的輸出文件夾中包含LibB.dll,只有LibA.dll存在。 但是我認為這是直接組裝參考的預期行為。

它與.deps.json文件有關嗎?

如果您或您的構建管道不處理deps.json,則通常不會對這些問題產生影響,因為它會生成。 Nate McMaster在這方面有一篇不錯的博客文章

您的替代方法是:

  • 參考LibB.dll也可以作為直接程序集參考,也可以通過msbuild手動將其復制到生成輸出中。 如果直接程序集引用的依賴關系樹相當平坦,那么這可以作為解決方案。
  • 為LibA構建NuGet軟件包,或者
    • 通過AppVeyor,VSTS / TFS,MyGet或任何其他私人提要提供商建立一個私人提要
    • 在本地計算機上的目錄中建立“提要”,並將該目錄用作其他NuGet軟件包源。 只需通過Visual Studio>工具>選項> NuGet軟件包管理器>軟件包源選擇放置LibA.nupkg的目錄。 如果您是唯一正在使用Web應用程序的人,這將是一個解決方案。
  • 參考LibA作為項目參考,因為項目參考支持傳遞依賴項解析

暫無
暫無

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

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