.NET Core无法加载具有依赖项的.NET Standard类库

时间:2018-09-24 18:35:48

标签: .net .net-core .net-standard

项目结构

我有三个项目

  • “网站”:ASP.NET Core 2.0项目
  • “ LibA”:。NET Standard 2.0类库
  • “ LibB”:.Net Standard 2.0类库

LibA是从Web引用的(通过DLL引用)。 LibA被LibA引用(通过项目引用,因为LibA和LibB在同一个VS2017解决方案中)。

在实践中,有更多的项目和参考,但是我已经重现了这个问题。

我使用docker build映像中的命令发布Web项目:

dotnet publish -c Release -o /app 

依赖性问题

/ app文件夹通过检查正在构建的docker映像,同时包含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>

LibA:

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

1 个答案:

答案 0 :(得分:1)

我决定提出答案,因为它超出了注释的字符数限制。

我复制了那些项目文件,但仍然无法重现该问题。发布应用程序不会在已发布的输出文件夹中包含LibB.dll,只有LibA.dll存在。但我认为这是直接组装参考的预期行为。

  

与.deps.json文件有关吗?

如果您或您的构建管道不处理deps.json,则通常不会对这些问题产生任何影响,因为它已生成。内特·麦克马斯特(Nate McMaster)在这方面有个不错的blog post

您的替代方案是:

  • 参考LibB.dll也可以作为直接程序集参考,也可以通过msbuild手动将其复制到生成输出中。如果直接程序集引用的依赖关系树很平坦,那么这可能是一个解决方案。
  • 为LibA构建NuGet软件包,或者
    • 通过AppVeyor,VSTS / TFS,MyGet或任何其他私人提要提供商建立私人提要
    • 在本地计算机上的目录中建立“提要”,并将该目录用作其他NuGet程序包源。只需通过Visual Studio>工具>选项> NuGet软件包管理器>软件包源选择放置LibA.nupkg的目录。如果您是唯一在Web应用程序上工作的人,并且永远都是这样,那么这是一种解决方案。
  • 参考LibA作为项目参考,因为项目参考支持传递依赖项解析