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

如何创建包含运行时特定托管程序集的多目标NuGet包?

如何创建包含运行时特定托管程序集的多目标NuGet包?

嘿,我之前也碰到过一模一样的问题!用nuspec加自定义MSBuild目标做带运行时特定程序集的NuGet包,最容易踩的就是路径和配置不规范的坑,给你梳理下正确的操作方法:

  • 先搞对NuGet包的核心结构
    这是最关键的一步,NuGet对ref和runtimes文件夹的路径有严格要求:

    • ref文件夹:专门放编译时用的"瘦"程序集,路径要按目标框架划分,比如ref/net6.0/YourAssembly.dll,这些程序集只包含类型定义,不含具体运行时实现,用于编译时的引用检查
    • runtimes文件夹:放对应运行时的完整实现程序集,路径必须遵循runtimes/{运行时标识符}/lib/{目标框架}/YourAssembly.dll的格式,比如runtimes/win-x64/lib/net6.0/YourAssembly.dll、runtimes/linux-x64/lib/net6.0/YourAssembly.dll,NuGet会自动根据项目的运行时标识符(RID)匹配加载对应的程序集
  • Nuspec文件要正确配置文件包含规则
    你得在nuspec的<files>节点里明确指定要打包的文件,不能靠自动发现,举个例子:

    <files>
      <!-- 加入编译引用的程序集 -->
      <file src="bin/Release/net6.0/ref/YourAssembly.dll" target="ref/net6.0/YourAssembly.dll" />
      <!-- 加入Windows x64的运行时程序集 -->
      <file src="bin/Release/net6.0/win-x64/YourAssembly.dll" target="runtimes/win-x64/lib/net6.0/YourAssembly.dll" />
      <!-- 加入Linux x64的运行时程序集 -->
      <file src="bin/Release/net6.0/linux-x64/YourAssembly.dll" target="runtimes/linux-x64/lib/net6.0/YourAssembly.dll" />
    </files>
    

    一定要注意路径的对应关系,目标框架和运行时标识符的拼写不能错,比如win-x64不能写成win64,不然NuGet识别不出来

  • 自定义MSBuild目标别乱改默认逻辑
    很多人踩坑是因为自定义的MSBuild目标覆盖了NuGet默认的运行时程序集解析规则。如果不是必须,尽量不要修改RuntimeAssemblyFiles、ReferenceAssemblyPaths这些核心属性;如果一定要加额外逻辑,要确保是在NuGet默认逻辑之后执行,别破坏原有的匹配机制

  • 测试项目要配对运行时标识符
    测试项目得明确指定运行时标识符(RID),要么在csproj里加<RuntimeIdentifier>win-x64</RuntimeIdentifier>,要么在编译/运行的时候用命令行参数指定,比如dotnet run -r win-x64。另外测试项目的目标框架要和你的NuGet包目标框架一致,不然也会出现加载问题

备注:内容来源于stack exchange,提问作者Fa鸽

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:23:02