【问题标题】:How can I include a NuGet package with native dlls in my new CSPROJ Class Library?如何在我的新 CSPROJ 类库中包含带有本机 dll 的 NuGet 包?
【发布时间】:2017-12-25 19:44:30
【问题描述】:

我有一个类库,我刚刚迁移到新的 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>

【问题讨论】:

    标签: c# .net msbuild nuget csproj


    【解决方案1】:

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

    要改变这种行为,请将您的 PackageReference 编辑为:

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

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

    更多详情请见Controlling dependency assets

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多