即使没有对包的引用,Nuget 包也是必需的

Ste*_*Pak 3 .net c# visual-studio nuget

在我的解决方案中,我有一个顶级项目和一堆依赖项目。依赖项目之一需要引用 Nest nuget 包。因此,在解决方案的 nuget 包配置中,我仅将 Nest 安装在引用它的项目上。

顶级项目有对此依赖项目的引用,但没有对 Nest 命名空间的引用。它构建时没有警告或错误,但是,在运行时,我有一个问题说

Could not load file or assembly 'Nest, Version=7.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d' or one of its dependencies. The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)

当我在顶级项目上手动安装 Nest 包时,它成功且没有问题。

为什么会出现这种情况?在依赖项目上安装 Nest 包不应该解决此依赖关系吗?

Lan*_*SFT 8

依赖项目之一需要引用 Nest nuget 包。

你在依赖项目中调用了Nest的函数吗?如果VS发现依赖项目实际上并不在代码中调用(需要)程序集,则不会将依赖项目的程序集复制到顶级项目中。

为什么会出现这种情况?在依赖项目上安装 Nest 包不应该解决此依赖关系吗?

我不确定问题中提供的信息的原因,许多因素可能会导致奇怪的行为,有时 VS 版本也会影响它......

假设您有一个顶级项目A,并且它取决于B使用Project Reference.

1.如果它们都针对.net framework,请确保它们使用相同的方式来管理nuget包。(都使用packages.config或都使用PackageReference

2.如果A.net framework项目,同时B.net standard项目,请确保A也使用PackageReference格式来管理nuget包。

因为.net standard(新的SDK格式)使用PackageReference包,如果A使用Packages.config和引用B,构建系统将在构建过程中对不同的nuget格式感到困惑。我们不会找到Nest.dllB's输出文件夹复制到A's输出文件夹的内容。

对于这种情况,尝试添加<RestoreProjectStyle>PackageReference</RestoreProjectStyle>到顶级A的项目文件(xx.csproj)中,这样可以确保A和B都可以恢复为PackageReference样式。

3.如果A.net frameworkpackageReferenceB.net frameworkPackages.config右键单击packages.config并选择Migrate Package.config to PackageReference按钮。您也可以从此文档中获得一些帮助。

4.如果你的顶级项目是.net core,B项目目标是.net standard,在VS2017中,nest.dll不会被复制到A的输出文件夹中,你可以尝试添加到<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>你的A.csproj来解决这个问题。类似的问题请参见此处。(VS2019 16.3.8已经修复了这个问题,这个问题大多出现在VS2017中)

并且此行为也受VS版本的影响,如果您使用的是VS2017,请将其更新到最新15.9.17以获得更好的体验。如果您使用的是VS2019,请将其更新到16.3.8。

希望能帮助到你 :)