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

如何解决NuGet包循环引用 优先加载本地构建程序集版本

问题场景
  • 现有两套独立解决方案:
    • Main解决方案:构建产物为Main.DomainTypes.dll,最终以NuGet包形式发布
    • External解决方案:构建产物为External.EventTypes.dll,最终同样以NuGet包形式发布
  • 初始依赖关系:External.EventTypes.dll已通过NuGet包依赖引用Main.DomainTypes.dll,后续Main解决方案新增功能需要引用External.EventTypes包,形成双向循环依赖
  • 运行异常:启动Main解决方案时抛出FileNotFound异常,运行时尝试加载External.EventTypes依赖的1.0.123版本Main.DomainTypes(来自NuGet包),而非本地构建的1.0.0版本,因本地输出目录无对应高版本文件导致加载失败
    根因说明:.NET运行时默认按照依赖清单声明的精确版本匹配程序集,不会自动做版本降级,本地输出目录仅存在1.0.0版本产物,无法满足版本匹配要求,并非运行时优先选择高版本加载。
  • 排除方案:不采用在External项目中重复定义DomainTypes类型的解耦方式。
可落地配置方案

方案1:配置程序集绑定重定向(改造成本最低,全版本兼容)

强制所有对Main.DomainTypes的加载请求,无论声明依赖的版本号是多少,都指向本地构建的1.0.0版本。

  • 针对.NET Framework项目:修改启动项目的App.config/Web.config文件,在<runtime>节点下添加如下配置:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Main.DomainTypes" publicKeyToken="替换为程序集实际公钥令牌,无签名则填null" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-1.0.123" newVersion="1.0.0" />
  </dependentAssembly>
</assemblyBinding>
  • 针对.NET Core/.NET 5+项目:可直接在启动项目的.csproj文件中开启自动绑定重定向,构建时SDK会自动生成版本映射规则:
<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

方案2:对齐本地构建版本号(无额外配置,长期稳定)

直接修改Main解决方案中Main.DomainTypes项目的版本配置,将本地构建版本号调整为和External.EventTypes依赖的NuGet版本一致(即1.0.123),构建后本地输出的dll版本与依赖声明版本完全匹配,运行时会直接加载本地输出目录的程序集,不会触发NuGet缓存目录的版本查找。
操作方式:修改Main.DomainTypes项目的.csproj文件,添加或修改版本相关属性:

<PropertyGroup>
  <Version>1.0.123</Version>
  <AssemblyVersion>1.0.123</AssemblyVersion>
  <FileVersion>1.0.123</FileVersion>
</PropertyGroup>

方案3:调整依赖引用方式,提升本地项目优先级

如果允许调整解决方案结构,直接将External解决方案的External.EventTypes项目添加到Main解决方案中,用项目引用替代原有的NuGet包引用,构建时MSBuild会自动处理项目间的依赖优先级,优先输出两个项目的本地构建产物,不会从NuGet缓存拉取依赖版本。
如果不方便直接添加项目引用,可在Main解决方案根目录新建NuGet.Config文件,将本地程序集输出目录配置为优先级最高的包源,配合方案2的版本对齐设置,NuGet解析时会优先从本地源拉取对应版本的Main.DomainTypes,不会触发远程源或全局缓存的版本查找。

补充说明:MSBuild本身支持双向项目引用,只要两个项目不存在互相要求前置构建的嵌套依赖,就可以正常完成编译,不需要强行拆分共享类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:24:22