MissingMethodException:如何确定.NET尝试查找的B.dll程序集版本?
确定.NET查找方法时对应的目标程序集版本
当程序集"A.dll"因依赖的"B.dll"中"Do()"方法缺失抛出MissingMethodException时,可通过以下几种可靠方式定位.NET实际尝试加载的"B.dll"具体版本:
1. 提取异常的完整细节
默认的MissingMethodException消息通常会包含目标方法的完整签名及期望的程序集强名称信息,例如:
未找到方法“Void B.Do()”,该方法属于程序集“B, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxx”。
若默认消息信息不足,可在代码中捕获异常后调用Exception.ToString(),输出的完整堆栈会明确标注.NET尝试查找的程序集版本、公钥令牌等关键标识。
2. 使用程序集绑定日志查看器(Fuslogvw.exe)
这是.NET官方自带的程序集绑定跟踪工具,操作步骤如下:
- 以管理员权限打开命令提示符,运行
fuslogvw.exe; - 点击界面中的「设置」,选择「记录所有绑定失败」或「记录所有绑定」;
- 重新运行触发异常的应用程序;
- 回到工具界面刷新列表,找到对应"B.dll"的绑定记录,查看详情即可获取.NET尝试加载的版本、查找路径及绑定失败原因。
3. 订阅程序集加载事件输出日志
通过代码订阅AppDomain的程序集加载事件,实时输出.NET尝试加载的程序集信息:
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { Console.WriteLine($"尝试加载程序集: {args.Name}"); // 返回null让默认加载逻辑继续执行 return null; };
触发异常后,查看控制台输出即可找到.NET尝试加载的"B.dll"完整标识(含版本、公钥令牌等)。
4. 检查应用配置文件的版本重定向规则
查看app.config或web.config中的<assemblyBinding>节点,确认是否存在对"B.dll"的版本重定向配置:
<dependentAssembly> <assemblyIdentity name="B" publicKeyToken="xxxxxx" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly>
若存在重定向规则,结合异常信息即可确认.NET实际尝试加载的目标版本。
内容的提问来源于stack exchange,提问作者Vladimir Gulyaev
相关产品推荐
相关产品推荐

