一些来自NuGet包的DLL文件未被复制到/bin目录下。

17

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

我有以下项目

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

项目A在可视化工具中引用了项目B。我在项目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文件复制到Project A的bin文件夹中,而不是复制Client和Core文件? 感谢任何帮助或解释!


ProjectA和ProjectB的目标框架是哪些? - Ufuk Hacıoğulları
两者都在使用版本4.5。 - Erik Pettersson
尝试使用其他框架配置,但仍遇到相同的问题。这是否与文件已经存在于gac中有关? - Erik Pettersson
也许吧。让我在我的机器上创建一个解决方案,看看是否会发生相同的情况。 - Ufuk Hacıoğulları
4个回答

12
为了准确回答您的问题,我们需要了解一些事情。
一个解释取决于项目A中的引用。例如,除了引用项目B之外,项目A还可能包括其他引用,其中包括"Microsoft.ApplicationServer.Caching.Client"和"Microsoft.ApplicationServer.Caching.Core",也许选项"Copy local"设置为"false",但不包括"log4net"。在这种情况下,前两者的副本只会出现在项目B中。
另一个可能的解释取决于项目A和项目B中代码对引用的使用方式。MSBuild进程不会自动复制实际上未在项目中使用的引用程序集。
最后,如果您依赖于构建事件来复制引用,请查看输出面板,以确保尽管编译成功,但没有错误。
无论如何,为了确保所有NuGet包都被复制,我发现编辑".csproj"文件并在""标签中添加以下内容很有用:
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

文档中:

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

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

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

这并非解决所有问题的万能方法,即如果错误出现在上述第三种情况中,它就无法解决。


你没有说明要将<CopyLocalLockFileAssemblies>添加到哪个项目中。是A项目、B项目还是两个项目都要添加? - Deantwo
1
根据其文档,<CopyLocalLockFileAssemblies> 将任何明确链接的 NuGet 依赖项复制到项目的输出目录中。自然而然地,如果您希望项目 A 在其输出目录中有一个 NuGet dll 的副本,但是该项目没有复制它,因为例如它符合答案中概述的情况之一,那么可以选择以下选项:1)在项目 A 中添加对所需包的明确 NuGet 引用(在其中安装它);2)在项目 A 中添加 <CopyLocalLockFileAssemblies> - alelom

7

我曾经遇到过一个比较复杂的依赖项图的问题。

  1. 进入“参考属性”,将“拷贝本地”设置为True。
  2. 编译并检查程序集是否已被复制到bin文件夹中。
  3. 如果这不能解决您的问题,请参考以下答案:https://dev59.com/8mIk5IYBdhLWcg3wKLSd#19889803

4

我认为这与NuGet无关,而应该与Visual Studio或MSBuild中引用的工作方式有关。如果你只在ProjectB中引用一个库,它不会出现在ProjectA的bin文件夹中。但是,当你使用来自已引用库的某个类型时,它才会出现在bin文件夹中。


0

我之前也遇到了与上述问题完全相同的问题。结果发现是因为我重命名了包的程序集名称(因为进行了 .net 升级,原始开发人员将框架名称放在项目名称中),并且只安装到了 A 项目中而没有安装到 B 项目中。这就意味着该包未能被复制到 B 项目的 bin 文件夹中,因为提示路径已更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接