You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将依赖原生C++的托管C++库打包为NuGet包(.NET 4.7.2)

托管C++库打包为NuGet包(.NET Framework 4.7.2)流程

一、准备构建产物

  • 确保原生C库和托管C库已完成Release模式下的多平台(如x86、x64)构建,拿到以下关键文件:
    • 托管C++库:YourManagedLib.dll、YourManagedLib.pdb(可选符号文件)
    • 原生C++库:YourNativeLib.dll、YourNativeLib.pdb(可选符号文件)

二、修改托管C++项目文件(.vcxproj)

直接编辑托管C++项目的.vcxproj文件,添加NuGet打包所需配置:

1. 添加NuGet元数据

在项目文件的<PropertyGroup>节点中加入以下属性(按需修改值):

<PackageId>YourManagedLib.Package</PackageId>
<PackageVersion>1.0.0</PackageVersion>
<PackageAuthors>YourName</PackageAuthors>
<PackageDescription>依赖原生C++库的托管C++组件,目标.NET Framework 4.7.2</PackageDescription>
<PackageOutputPath>$(SolutionDir)NuGetPackages</PackageOutputPath>
<TargetFramework>net472</TargetFramework>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <!-- 按需设置是否构建时自动打包 -->

2. 配置打包文件路径

添加<ItemGroup>节点,指定文件在NuGet包中的存放位置:

<!-- 托管库:放入lib/net472目录,供.NET项目直接引用 -->
<None Include="$(OutDir)YourManagedLib.dll" Pack="true" PackagePath="lib\net472" />
<None Include="$(OutDir)YourManagedLib.pdb" Pack="true" PackagePath="lib\net472" Condition="Exists('$(OutDir)YourManagedLib.pdb')" />

<!-- 原生库:按平台放入runtimes/{platform}/native目录,NuGet会自动复制到项目输出目录 -->
<!-- x64平台 -->
<None Include="$(SolutionDir)YourNativeLib\x64\Release\YourNativeLib.dll" Pack="true" PackagePath="runtimes\x64\native" />
<None Include="$(SolutionDir)YourNativeLib\x64\Release\YourNativeLib.pdb" Pack="true" PackagePath="runtimes\x64\native" Condition="Exists('$(SolutionDir)YourNativeLib\x64\Release\YourNativeLib.pdb')" />
<!-- x86平台 -->
<None Include="$(SolutionDir)YourNativeLib\x86\Release\YourNativeLib.dll" Pack="true" PackagePath="runtimes\x86\native" />
<None Include="$(SolutionDir)YourNativeLib\x86\Release\YourNativeLib.pdb" Pack="true" PackagePath="runtimes\x86\native" Condition="Exists('$(SolutionDir)YourNativeLib\x86\Release\YourNativeLib.pdb')" />

路径需根据你的项目实际结构调整,$(OutDir)为托管库输出目录,$(SolutionDir)为解决方案根目录。

三、使用MSBuild命令行打包

打开命令提示符/PowerShell,切换到解决方案根目录,执行对应平台的打包命令:

打包x64平台

msbuild YourManagedLib.vcxproj /t:Pack /p:Configuration=Release /p:Platform=x64 /p:PackageVersion=1.0.0

打包x86平台

msbuild YourManagedLib.vcxproj /t:Pack /p:Configuration=Release /p:Platform=x86 /p:PackageVersion=1.0.0

若需生成包含多平台的单个NuGet包,确保项目文件已配置所有平台的文件路径,直接执行打包命令即可自动整合。

四、验证NuGet包

  1. 找到生成的.nupkg文件(默认在$(SolutionDir)NuGetPackages或项目输出目录)
  2. 解压文件,检查目录结构是否符合预期:
    • lib/net472/:存放托管C++库文件
    • runtimes/x64/native/、runtimes/x86/native/:存放对应平台的原生C++库文件
  3. 在测试.NET Framework 4.7.2项目中安装该包,验证是否能正常调用托管库,且原生库被自动复制到项目输出目录。

五、集成到GitHub工作流示例

若要在GitHub Actions中自动打包,可添加以下步骤到工作流文件(.github/workflows/pack.yml):

jobs:
  pack:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup MSBuild
        uses: microsoft/setup-msbuild@v2
      - name: Build Native Library (x64)
        run: msbuild YourNativeLib.vcxproj /t:Build /p:Configuration=Release /p:Platform=x64
      - name: Build Native Library (x86)
        run: msbuild YourNativeLib.vcxproj /t:Build /p:Configuration=Release /p:Platform=x86
      - name: Pack Managed Library
        run: msbuild YourManagedLib.vcxproj /t:Pack /p:Configuration=Release /p:Platform=AnyCPU /p:PackageVersion=1.0.0-${{ github.run_number }}
      - name: Upload NuGet Package
        uses: actions/upload-artifact@v4
        with:
          name: nuget-packages
          path: NuGetPackages/*.nupkg

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:55:25