说服 Visual Studio C# 项目将本机库复制到构建目录

问题描述 投票:0回答:1

我编写了一个 .NET7 库,它使用 P/Invoke 来执行两个第三方库中的支持功能,在本例中为

.so
文件,因为消费产品将仅部署到 Linux。

我已使用以下项目定义成功将这些文件打包到 Nuget 文件中:

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

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
    <PackageId>my.library.name</PackageId>
    <Title>My Library</Title>
    <Authors>Me</Authors>
    <Company>My Company</Company>
    <Product>The Library</Product>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="../res/liblib1.so" Pack="true" PackagePath="contentFiles/any/any">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <PackageCopyToOutput>True</PackageCopyToOutput>
    </Content>
    <Content Include="../res/liblib2.so" Pack="true" PackagePath="contentFiles/any/any">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <PackageCopyToOutput>True</PackageCopyToOutput>
    </Content>
  </ItemGroup>

</Project>

但是,当构建并发布 consuming 项目时,.so 文件就看不到了。 这个答案中详细介绍的解决方案没有让我得到任何帮助,并且该项目中定义的 PackagePath 是阅读 learn.microsoft.com 关于跨版本兼容性的文章的结果(尽管这两个项目都使用 .NET7) .

我希望 .so 文件出现在可执行文件及其关联的 DLL 附近,或者最坏的情况是出现在子文件夹中,因此我必须调整构建脚本来重新定位它们。 相反,它们不会被复制到all

我通过解压 nuget 包确认这些文件存在于

contentfiles/any/any
中,正如
PackagePath
元素所预期的那样,但它们没有包含在使用项目的构建产品中。

(我使用 Visual Studio 2022 作为 IDE 和编译器。)

c# linux visual-studio nuget pinvoke
1个回答
0
投票

如果您想将内容文件包含在使用项目的构建产品中,您可以直接从Nuget包中复制文件。

1.为

<GeneratePathProperty>true</GeneratePathProperty>
(my.library.name) 添加
PackageReference
生成独占属性 $(Pkgmy.library.name) 来获取 nupkg 内容的路径。

 <PackageReference Include="TestLibrary" Version="1.0.0" >
  <GeneratePathProperty>true</GeneratePathProperty>
 </PackageReference>

2.添加CopyFiles目标。这会将文件复制到“$(ProjectDir

© www.soinside.com 2019 - 2024. All rights reserved.