VB.Net项目JsonConvert未声明及Newtonsoft.Json版本冲突问题求助
问题描述
我正在处理一个使用Visual Studio 2019开发的VB.Net网站项目,项目中某类包含以下代码:
Dim asfPaymentInstalmentRequestJson As String = JsonConvert.SerializeObject(asfPaymentInstalmentRequest)
代码中JsonConvert被红色下划线标记,编译时抛出错误:
BC30451 'JsonConvert' is not declared. It may be inaccessible due to its protection level.
根据文档,JsonConvert属于Newtonsoft.Json库,我已安装13.0.1版本的NuGet包,并添加了导入语句:
Imports Newtonsoft.Json
项目同时引用了WorldpayNewtonsoft.Json 2.0.0.0,怀疑是版本冲突导致问题。
更新:手动将Newtonsoft.Json.dll复制到bin目录后,出现新的编译错误:
error BC30560: 'JsonPropertyAttribute' is ambiguous in the namespace 'Newtonsoft.Json'
error BC30661: Field or property 'PropertyName' is not found
显然两个版本的Newtonsoft.Json不兼容,但该项目在UAT环境可正常运行,需要解决本地开发环境的冲突问题。
解决方法
1. 清理并重新还原NuGet包
- 右键项目 → 清理,删除bin和obj目录下的所有文件
- 右键项目 → 管理NuGet程序包,确认Newtonsoft.Json 13.0.1已安装,卸载后重新安装
- 打开工具 → NuGet包管理器 → 程序包管理器控制台,运行命令:
让NuGet自动将正确版本的dll复制到bin目录,避免手动复制引发的版本不匹配。Update-Package -reinstall Newtonsoft.Json
2. 添加程序集绑定重定向
在项目的web.config文件的<runtime>节点下添加绑定重定向,强制项目使用指定版本的Newtonsoft.Json:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.1.0" /> </dependentAssembly> <!-- 若UAT环境有WorldpayNewtonsoft.Json的重定向规则,同步添加 --> </assemblyBinding> </runtime>
绑定重定向会让CLR忽略旧版本引用,统一使用指定的13.0.1版本。
3. 调整引用优先级与别名设置
- 右键项目中的WorldpayNewtonsoft.Json引用 → 属性,将复制本地设为
False(如果UAT环境未部署该dll,或依赖已包含在Worldpay相关组件中) - 为Newtonsoft.Json设置别名:右键Newtonsoft.Json引用 → 属性,在别名字段填写自定义名称(比如
NewtonsoftMain) - 在代码文件顶部使用别名明确指定程序集:
后续代码中使用Imports NewtonsoftMain = Newtonsoft.JsonNewtonsoftMain.JsonConvert代替JsonConvert,避免命名空间歧义。
4. 对比UAT环境配置
- 查看UAT环境的web.config文件,确认是否存在相同的绑定重定向规则
- 检查UAT服务器bin目录下的dll版本,确保本地开发环境的dll版本与UAT完全一致
- 确认UAT环境中是否同时存在两个版本的Newtonsoft.Json,以及它们的加载顺序
5. 排查间接依赖
在NuGet包管理器的已安装标签中,查看是否有其他依赖包间接引入了WorldpayNewtonsoft.Json,尝试更新这些依赖包到兼容Newtonsoft.Json 13.0.1的版本。
内容的提问来源于stack exchange,提问作者Colin Plater
相关产品推荐
相关产品推荐

