如何将依赖原生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++库:
二、修改托管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包
- 找到生成的
.nupkg文件(默认在$(SolutionDir)NuGetPackages或项目输出目录) - 解压文件,检查目录结构是否符合预期:
lib/net472/:存放托管C++库文件runtimes/x64/native/、runtimes/x86/native/:存放对应平台的原生C++库文件
- 在测试.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
相关产品推荐
相关产品推荐

