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

2024-05-08

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

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

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

我怀疑我需要将本机 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>

情况很复杂。 NuGet 有两种使用包的方法,并且这两种方法的工作方式有些不同。原来的方式是与packages.config(PC),新方法是PackageReference (PR).

PC 上的 NuGet 没有运行时的概念,因此它们经常实现它,快速查看一下包,情况似乎就是这样,包作者将 MSBuild 属性和/或目标文件捆绑在包中,并且这些目标修改构建以复制构建上的本机文件。使用 PC 的项目,当安装包时,所有依赖项也会安装,因此所有包都是项目的直接依赖项,包中的任何构建目标都会导入到项目中。

另一方面,使用 NuGet 和 PR 的项目只能引用它们的直接依赖项,但包的依赖项是可传递的。 NuGet 仅告诉 MSBuild 从直接依赖项导入构建目标,而不是传递依赖项。这解释了您所看到的行为。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么依赖库中的本机 dll 不包含在构建输出中? 的相关文章

随机推荐