如何找到 MT2002 Offending DLL?

How to find MT2002 Offending DLL?

在尝试使用 VSTS 构建我的 Xamarin.iOS 项目时,我不断收到此错误:

MTOUCH: error MT2002: Failed to resolve "System.Configuration.ConfigurationException" reference from "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

我明白这意味着某些 DLL 引用不正确。但是,当我通过模拟器进行调试时,它工作正常。当我加载一个类似的项目时,它工作正常(并通过 VSTS 构建)。有没有一种简单的方法来 identify/find 有问题的 file/reference 以便我可以尝试修复它?

在 IDE 中,您可以使用程序集浏览器查看解决方案中的哪个 .dll) 引用了 System, Version=4.0.0.0 这不是 XI 提供的版本(也不是 PCL).请注意,可能有多个程序集引用了该程序集(和类型)。

从命令行您可以使用 grep(至少在 macOS 上,我不记得 Windows 特定工具)来查找哪个 .dll 包含字符串 ConfigurationException.

旁注:

  • 它在模拟器中工作的原因是使用了 JIT(所以任何丢失的东西都会在运行时抛出,而不是构建时)并且默认情况下,托管链接器被禁用(并且它需要能够解析符号以重写任何代码)。

  • 如果如果不存在到达缺失符号的依赖项,则不同的解决方案可能会起作用。在这种情况下,链接器只会删除代码(而不是解析它)。但是,如果 ConfigurationException 可访问(通过静态分析),则链接器需要存在它才能重写程序集。 IOW 链接器可以接受 bad 程序集(或引用),只要最终应用程序代码不需要它。

对于那些需要保持依赖性的人,我更改了 iOS 构建属性中的链接器行为,我可以在浪费几个小时后 运行 我的设备上的应用程序。

在我的例子中,问题出现在从 PCL 迁移到 NET Standard 2.0 之后。我应该将 System.Net.Http.Formatting.Extension nuget 包添加到平台项目并且问题消失了。