多.NET框架项目引用Newtonsoft.Json致Bar.Desktop编译失败求助
看起来你遇到的是Newtonsoft.Json版本冲突和编译文件被锁定的复合问题,咱们一步步来解决:
一、先解决Newtonsoft.Json版本冲突警告
这个警告是因为Bar.Desktop引用的Bar.Core使用了适配net20的Newtonsoft.Json,而自身又安装了适配net45的版本,导致引用逻辑冲突,可通过以下方式解决:
添加绑定重定向(最常用方案)
打开Bar.Desktop项目的App.config文件,在<configuration>节点内添加绑定重定向配置,强制所有Newtonsoft.Json的引用都指向你指定的版本(建议用Bar.Desktop安装的net45版本,它兼容net20的功能):<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <!-- 把oldVersion范围改成你实际涉及的版本,newVersion填Bar.Desktop安装的版本号 --> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>注意:
publicKeyToken是Newtonsoft.Json的固定公钥,无需修改;版本号要替换成你实际安装的对应版本。统一NuGet包版本(根源解决)
右键解决方案 → 选择「管理解决方案的NuGet程序包」,搜索Newtonsoft.Json,尝试给两个项目安装同一个同时兼容net20和net45的版本(比如Newtonsoft.Json 12.0.3,它支持多框架),从根源避免版本冲突。启用自动绑定重定向
打开Bar.Desktop项目的属性 → 「应用程序」标签页,勾选「自动生成绑定重定向」,VS会自动帮你处理版本冲突的重定向配置。
二、解决“文件被锁定”的编译失败问题
这个错误一般是编译后的dll/exe被其他进程占用导致的,试试这些方法:
彻底清理后重建
先点击VS顶部菜单「生成」→「清理解决方案」,然后手动删除两个项目目录下的bin和obj文件夹(这一步比内置清理更彻底),最后再点击「生成解决方案」。结束占用进程
打开任务管理器,查找是否有Bar.Desktop.exe、Bar.Core.dll相关的进程,或者VS的调试宿主进程(比如vshost.exe),结束这些进程后再重新编译。禁用VS实时调试或扩展
某些VS扩展、实时调试功能可能会锁定编译文件:- 打开「工具」→「选项」→「调试」→「实时」,取消勾选所有实时调试选项;
- 暂时禁用所有第三方VS扩展,重启VS后再尝试编译。
更改输出目录
打开Bar.Desktop项目属性 →「生成」标签页,修改「输出路径」为一个新的文件夹(比如bin\Debug_new),避开之前被锁定的文件路径。
内容的提问来源于stack exchange,提问作者Eng1234

