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

如何在单个NuGet包中包含x86、x64及AnyCPU不同目标版本构建产物

如何在单个NuGet包中包含x86、x64及AnyCPU构建产物

我之前在解决这个问题时踩了不少坑,NuGet官方文档对这类高级用法的说明零散混乱,整理了一套可行的方案,分两种场景参考:

方案1:SDK风格项目直接配置(推荐)

现在大多数.NET项目都是SDK风格,直接在.csproj里配置即可,无需手写nuspec:

  1. 配置多架构构建输出路径
    在项目文件里添加不同平台的输出目录规则,确保每个架构的产物分开存放:

    <PropertyGroup>
      <TargetFramework>net6.0</TargetFramework> <!-- 可替换为你的目标框架,如net48;net7.0 -->
      <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <!-- 构建时自动生成NuGet包 -->
    </PropertyGroup>
    
    <!-- 配置各平台输出路径 -->
    <PropertyGroup Condition="'$(Platform)' == 'x86'">
      <OutputPath>bin\$(Configuration)\$(TargetFramework)\x86</OutputPath>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Platform)' == 'x64'">
      <OutputPath>bin\$(Configuration)\$(TargetFramework)\x64</OutputPath>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Platform)' == 'AnyCPU'">
      <OutputPath>bin\$(Configuration)\$(TargetFramework)\AnyCPU</OutputPath>
    </PropertyGroup>
    
  2. 配置打包时的文件映射
    添加ItemGroup节点,指定每个架构的文件打包到NuGet包的对应目录:

    <ItemGroup>
      <!-- AnyCPU版本:放在lib根目录,作为无匹配平台时的 fallback -->
      <None Include="bin\$(Configuration)\$(TargetFramework)\AnyCPU\*.dll" Pack="true" PackagePath="lib\$(TargetFramework)" />
      <None Include="bin\$(Configuration)\$(TargetFramework)\AnyCPU\*.pdb" Pack="true" PackagePath="lib\$(TargetFramework)" />
    
      <!-- x86版本:打包到lib下的x86子目录 -->
      <None Include="bin\$(Configuration)\$(TargetFramework)\x86\*.dll" Pack="true" PackagePath="lib\$(TargetFramework)\x86" />
      <None Include="bin\$(Configuration)\$(TargetFramework)\x86\*.pdb" Pack="true" PackagePath="lib\$(TargetFramework)\x86" />
    
      <!-- x64版本:打包到lib下的x64子目录 -->
      <None Include="bin\$(Configuration)\$(TargetFramework)\x64\*.dll" Pack="true" PackagePath="lib\$(TargetFramework)\x64" />
      <None Include="bin\$(Configuration)\$(TargetFramework)\x64\*.pdb" Pack="true" PackagePath="lib\$(TargetFramework)\x64" />
    </ItemGroup>
    

    配置完成后,分别构建x86、x64、AnyCPU三个平台,然后触发打包(比如右键项目选择“打包”),就能生成包含所有架构的NuGet包。

方案2:手动编写.nuspec文件(适合传统项目/精细控制)

如果是旧版非SDK项目,或者需要更灵活的打包规则,可以手动创建.nuspec文件:

  1. 创建nuspec文件
    在项目根目录新建YourPackageName.nuspec,内容如下:

    <?xml version="1.0"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
      <metadata>
        <id>YourPackageId</id>
        <version>1.0.0</version>
        <authors>YourName</authors>
        <description>包含x86、x64、AnyCPU版本的NuGet包</description>
        <dependencies>
          <group targetFramework="net6.0" /> <!-- 对应你的目标框架 -->
        </dependencies>
      </metadata>
      <files>
        <!-- AnyCPU版本 -->
        <file src="bin\Release\net6.0\AnyCPU\*.dll" target="lib\net6.0" />
        <file src="bin\Release\net6.0\AnyCPU\*.pdb" target="lib\net6.0" />
    
        <!-- x86版本 -->
        <file src="bin\Release\net6.0\x86\*.dll" target="lib\net6.0\x86" />
        <file src="bin\Release\net6.0\x86\*.pdb" target="lib\net6.0\x86" />
    
        <!-- x64版本 -->
        <file src="bin\Release\net6.0\x64\*.dll" target="lib\net6.0\x64" />
        <file src="bin\Release\net6.0\x64\*.pdb" target="lib\net6.0\x64" />
      </files>
    </package>
    
  2. 执行打包命令
    先确保已经构建了所有三个平台的产物,然后打开命令行,进入项目根目录,执行:

    nuget pack YourPackageName.nuspec -Properties Configuration=Release
    

关键注意事项

  • 原生代码处理:如果你的程序集包含非托管代码(比如C++/CLI、原生DLL),不要用lib目录,改用runtimes结构,比如runtimes/win-x86/lib/net6.0,NuGet会根据操作系统+架构自动匹配。
  • 版本一致性:所有架构的程序集版本必须完全一致,否则会导致引用冲突。
  • 测试验证:打包完成后,创建x86、x64、AnyCPU三个测试项目,引用该包,检查VS是否自动加载对应架构的程序集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:39:57