如何在我的新 CSPROJ Class 库中包含带有本机 dll 的 NuGet 包?

How can I include a NuGet package with native dlls in my new CSPROJ Class Library?

我有一个 class 库,我刚刚迁移到新的 csproj 格式,它依赖于 SQLite.Core.

SQLite 具有本机依赖项 x64/SQLite.Interop.dllx86/SQLite.Interoop.dll,它们过去常常被复制到添加我的包的任何项目的输出文件夹。 NuGet 通过在旧 csproj 文件中自动包含以下导入来解决此问题:

<Import Project="..\packages\System.Data.SQLite.Core.1.0.106\build\net451\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.106\build\net451\System.Data.SQLite.Core.targets')" />

迁移到新的 csproj 后,我可以将我的库构建为 NuGet 包,其中正确包含 SQLite.Core 作为依赖关系但是使用我的 NuGet 库的人不会将本机依赖关系复制到输出文件夹。

另一方面,如果消费者先添加 SQLite.Core 然后添加我的包一切正常。

知道如何恢复迁移前的行为吗?下面是迁移后的 csproj:

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

  <PropertyGroup>
    <PackageId>My.Library</PackageId>
    <Description>Some Library.</Description>        
  </PropertyGroup>

  <PropertyGroup>
    <TargetFramework>net452</TargetFramework>    
    <AssemblyName>My Library</AssemblyName>    
  </PropertyGroup>

  <ItemGroup>    
    <PackageReference Include="System.Data.SQLite.Core" Version="1.0.106" />
  </ItemGroup>

    <ItemGroup>
      <Reference Include="Microsoft.CSharp" />
    </ItemGroup>    

</Project>

由于 System.Data.SQLite.Core 使用构建时逻辑将包包含到内容中,如果您构建引用该包的库,PackageReference 的默认依赖项设置不适合。默认情况下,PackageReference 不会转发内容文件、构建资产和分析器以供传递引用。

要更改该行为,请将您的 PackageReference 编辑为:

<PackageReference Include="System.Data.SQLite.Core" Version="1.0.106" PrivateAssets="none"/>

这将确保包在直接引用或通过您的库传递引用时表现完全相同。在您的具体情况下,PrivateAssets 也可以是 contentFiles;analyzers,因为只需要转发 build,但由于包裹只包含 build 资产,所以没关系。

有关详细信息,请参阅 Controlling dependency assets