将未经管理的本地库文件包含到Nuget输出目录中

4

未管理的共享对象(.so文件)没有复制到输出目录:

我有一个.NET Standard 2项目,它包装了一个C++库(我们称之为wrap.csproj)。该项目依赖于共享对象(libgdal.so)。

我想将此项目用作NuGet,因此引用我的NuGet的项目应在build/publish文件夹中具有wrap.dll和libgdal.so。

我将此项目打包为NuGet。但是引用此NuGet的项目(.NET Core)在build/published文件夹中只获得了wrap.dll文件,而没有libgdal.so文件,因此我遇到了运行时错误。

我向NuGet csproj添加了以下属性:

<ItemGroup>
<None Include="libgdal.so">
<Pack>true</Pack>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>

编辑:在@zivkan的帮助下,我进行了一些查看后成功了。

我所需要做的就是添加包路径,像这样:

<ItemGroup>
    <None Include="libgdal.so">
        <Pack>true</Pack>
        <PackagePath>runtimes/linux-x64/native</packagePath>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
</ItemGroup>

1
如果你只想支持SDK风格的项目,我建议你看一下libuv包并复制它的做法。如果你还想支持非SDK风格的项目(传统项目,“旧式”项目,或者你想怎么称呼都可以),我建议你复制sqlite包的做法。 - zivkan
@zivkan 谢谢!成功了。 - pixel
1个回答

7

我只需要像这样添加PackagePath:

<ItemGroup>
    <None Include="libgdal.so">
        <Pack>true</Pack>
        <PackagePath>runtimes/linux-x64/native</PackagePath>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
</ItemGroup>

我的运行时环境是 Linux-x64。


1
你可以将自己的答案标记为“已接受的答案”。它是在答案左侧的向下箭头下面的复选框! - Bruno Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接