如何在我的新 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.dll
和 x86/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。
我有一个 class 库,我刚刚迁移到新的 csproj 格式,它依赖于 SQLite.Core.
SQLite 具有本机依赖项 x64/SQLite.Interop.dll
和 x86/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。