nuget 包中的某些 dll 未复制到 /bin

问题描述 投票:0回答:4

我知道这是一个以前讨论过的问题,但我有一个我不明白的情况。

我有以下项目

  • 项目A
    • B项目
      • NuGet 包“log4net”
      • NuGet 包“ServerAppFabric.Client”

项目 A 有一个对项目 B 的 Visual Studio 引用。我在项目 B 的代码中使用这两个包,并且正在调试模式下构建。项目 B 配置如下所示。

<Reference Include="log4net">
  <HintPath>..\packages\log4net.2.0.0\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationServer.Caching.Client">
  <HintPath>..\packages\ServerAppFabric.Client.1.1.2106\lib\Microsoft.ApplicationServer.Caching.Client.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationServer.Caching.Core">
  <HintPath>..\packages\ServerAppFabric.Client.1.1.2106\lib\Microsoft.ApplicationServer.Caching.Core.dll</HintPath>
</Reference>

*为什么只有 log4net 中的 dll 文件复制到项目 A 的 bin 文件夹中,而不复制 Client 和 Core 文件?任何帮助或解释表示赞赏! *

visual-studio-2012 nuget
4个回答
10
投票

为了准确回答您的问题,我们需要了解一些事情。

一种解释取决于您在项目 A 中拥有哪些参考资料。例如,项目 A 除了引用项目 B 之外,还可能包含其他引用,其中有

Microsoft.ApplicationServer.Caching.Client
Microsoft.ApplicationServer.Caching.Core
,可能将选项
Copy local
设置为
false
- 但不是
log4net 
。在这种情况下,前两者的复制只会发生在项目 B 中。

另一种可能的解释取决于 您的代码如何处理项目 A 和项目 B 中的引用。MSBuild 进程不会自动复制项目中实际未使用的引用程序集。

最后,如果您依赖构建事件来复制引用,请查看“输出”面板,以确保尽管编译成功但没有错误。

无论如何,为了确保复制所有 NuGet 包,我发现编辑

.csproj
文件并在
<PropertyGroup>
标签中添加以下内容很有用:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

来自文档

如果将此

CopyLocalLockFileAssemblies
设置为 true,则任何 NuGet 包依赖项都会复制到输出目录。这意味着您可以使用 dotnet build 的输出在任何计算机上运行您的插件。

根据其文档,

<CopyLocalLockFileAssemblies>
将任何显式链接的 NuGet 依赖项复制到项目的输出目录中。自然地,如果您希望项目 A 在其输出目录中拥有 NuGet dll 的副本,但项目 A 不会复制它,因为例如它属于上述第一种或第二种情况,那么选项可以是:

  1. 确保项目A中已安装NuGet包;
  2. 在项目 A 的 csproj 文件中添加
    <CopyLocalLockFileAssemblies>

这不是灵丹妙药,即如果错误在于例如上面概述的第三种情况。


7
投票

我也遇到了同样的问题,有一个复杂的依赖图。

  1. 转到参考属性并设置 Copy Local=True。
  2. 编译并检查程序集是否复制到bin文件夹中。
  3. 如果这不能解决您的问题,请尝试以下答案:https://stackoverflow.com/a/19889803/1074245

3
投票

我认为这与 NuGet 无关。它应该与引用在 Visual Studio 或 MSBuild 中的工作方式相关。如果您只是引用 ProjectB 中的库,它不会显示在 ProjectA 的 bin 文件夹中。但是,当您使用引用库中的某种类型时,只有这样它才会显示在 bin 文件夹中。


0
投票

我来到这里正是遇到了上面提到的问题。结果我重命名了包的程序集名称(因为网络升级,原始开发人员将框架名称放在项目名称中),并且仅将其安装到项目 A 而不是项目 B 中,这意味着该包没有被复制到项目 B 的 bin 文件夹,因为提示路径已更改

© www.soinside.com 2019 - 2024. All rights reserved.