同一解决方案中两个API项目如何各自引用对应版本的Ninject包以避免加载冲突
解决同一解决方案中两个API项目使用不同Ninject.Web.Common版本的冲突问题
这是典型的.NET程序集版本冲突问题——默认情况下.NET运行时会倾向于加载找到的最新版本程序集,再加上可能的输出目录重叠,导致Web Api B意外加载了Web Api A的3.3.2版本Ninject.Web.Common。以下是无需修改现有项目依赖版本的解决方案:
1. 为每个项目配置独立的程序集绑定重定向
程序集绑定重定向可以强制项目加载指定版本的程序集,你需要在两个项目的Web.config中分别添加配置:
对于Web Api B(使用3.2.3版本)
在Web.config的<runtime>节点下添加:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Ninject.Web.Common" publicKeyToken="c7192dc5380945e7" culture="neutral" /> <!-- 强制将所有旧版本请求重定向到3.2.3.0 --> <bindingRedirect oldVersion="0.0.0.0-3.3.2.0" newVersion="3.2.3.0" /> </dependentAssembly> </assemblyBinding>
对于Web Api A(使用3.3.2版本)
同样在Web.config的<runtime>节点下添加(如果已有类似配置,确保指向正确版本):
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Ninject.Web.Common" publicKeyToken="c7192dc5380945e7" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-3.3.2.0" newVersion="3.3.2.0" /> </dependentAssembly> </assemblyBinding>
2. 确保引用的Copy Local属性设置为True
右键每个项目中的Ninject.Web.Common引用 → 选择属性,将Copy Local设置为True。这样每个项目都会把自己依赖的版本dll复制到各自的输出目录,不会依赖全局或其他项目的dll。
3. 配置独立的输出目录(关键!)
如果两个项目的输出目录相同(比如默认都输出到bin\Debug\),新版本的dll会覆盖旧版本,这是导致冲突的常见原因。你需要为每个项目设置独立的输出路径:
- 右键Web Api A → 属性 → 生成 → 输出路径,改为类似
bin\Debug\ApiA\的路径 - 右键Web Api B → 属性 → 生成 → 输出路径,改为类似
bin\Debug\ApiB\的路径
4. 清理并重建解决方案
最后执行以下步骤确保所有修改生效:
- 右键解决方案 → 清理解决方案,删除所有旧的输出文件
- 右键解决方案 → 生成解决方案,让每个项目重新生成并复制自己的依赖dll到独立目录
这样处理后,两个项目会各自加载对应版本的Ninject.Web.Common,不会再出现类型加载错误。
内容的提问来源于stack exchange,提问作者845614720
相关产品推荐
相关产品推荐

