项目结构
我有三个项目
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>
答案 0 :(得分:1)
我决定提出答案,因为它超出了注释的字符数限制。
我复制了那些项目文件,但仍然无法重现该问题。发布应用程序不会在已发布的输出文件夹中包含LibB.dll,只有LibA.dll存在。但我认为这是直接组装参考的预期行为。
与.deps.json文件有关吗?
如果您或您的构建管道不处理deps.json,则通常不会对这些问题产生任何影响,因为它已生成。内特·麦克马斯特(Nate McMaster)在这方面有个不错的blog post。
您的替代方案是: