为什么依赖库中的本机dll不包含在生成输出中?

时间:2019-05-15 22:00:08

标签: .net nuget csproj

我们正在使用IBM的DB2库从C#访问DB2 https://www.nuget.org/packages/IBM.Data.DB2.Core/

我们希望将IBM的库包装到我们自己的库中,从而向应用程序开发人员添加与DB2相关的功能。

问题在于IBM的库基于其软件包中包含的本机dll。但是,仅通过我们自己的DB2包装器库间接引用IBMs库时,这些本机dll不会复制到build输出文件夹中。

我怀疑我需要在我们自己的库中包含本机dll。只有我不确定该怎么做。

我们为包装器库创建的nuget包是从csproj文件创建的

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <Version>1.0.0</Version>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="IBM.Data.DB2.Core" Version="1.3.0.100" />
  </ItemGroup>

</Project>

1 个答案:

答案 0 :(得分:0)

这很复杂。 NuGet有两种使用程序包的方式,这两种方式的工作有些不同。原始方法是使用packages.config(PC),而新方法是使用PackageReference(PR)。

带有PC的NuGet没有运行时的概念,因此经常使用它们来实现,并且快速查看了该包,看来确实是这种情况,包作者将MSBuild道具和/或目标文件捆绑在包中,这些目标修改了构建以在构建时复制本机文件。使用PC的项目,在安装软件包时,还将安装所有依赖项,因此所有软件包都是项目的直接依赖项,并且软件包中的任何构建目标都将导入到项目中。

另一方面,将NuGet与PR结合使用的项目只能引用其直接依赖关系,而软件包的依赖关系是可传递的。 NuGet仅告诉MSBuild从直接依赖项而不是传递依赖项导入生成目标。这样就可以解释您所看到的行为。

在NuGet 5.0(随Visual Studio 2019一起发布,我不记得哪个版本的.NET Core SDK)中,我们添加了buildTransitive功能,该功能将从传递包中提取构建道具/目标。但是,它要求软件包作者重新授权其软件包才能使用它。

相关问题