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

时间:2017-12-25 19:44:30

标签: c# .net msbuild nuget csproj

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

1 个答案:

答案 0 :(得分:2)

由于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资产,因此无关紧要。< / p>

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