【问题标题】:What next step should I take to fix MissingMethodException while debugging?在调试时我应该采取什么下一步来修复 MissingMethodException?
【发布时间】:2014-10-03 15:20:54
【问题描述】:

我正在从另一个程序集中的 C# 代码调用一个程序集中的一些 VB.NET 代码。代码构建良好,但我在拨打电话时收到MissingMethodException

通常,根据我读过的 MethodMissingException 的 Stack Overflow 和 Google 搜索结果,这是由于您正在构建的 DLL 与您正在运行的 DLL 之间的不匹配。没有一个结果提到第三个 DLL。更多关于下面的内容。

我已经确认:

  • 目标 DLL 的路径与引用的路径匹配,根据调试时的 VS2008 输出窗口
  • 根据 ProcExp,这是系统上加载的目标 DLL 的唯一版本
  • 根据代码存在“缺失”方法
  • 根据生成的 XML 文档存在“缺失”方法
  • 根据 Reflector 存在“缺失”方法

最大的优势是重复加载包含“缺失”方法签名中使用的类型的程序集。它来自SecondParty(我参考)和FirstParty(已关闭本地复制)。

手动将所有内容复制到新目录可以解决此问题。但是,这使得调试变得棘手:我喜欢直接点击绿色三角形。

详情:

我有第三个带有强类型 ADO.NET 数据集的程序集。我们将类型称为ThirdParty.PortableData。我的FirstParty 正在用数据填充它并将其传递给SecondParty

FirstParty 中失败的调用代码如下所示:

ThirdParty.PortableData data = GetPortableData()
SecondParty instance = new SecondParty()
instance.Data = data

MissingMethodException 是从调用包含此代码的方法的行中抛出的。)

FirstParty 在运行时似乎找不到的SecondParty 中的目标代码如下所示:

Public Property Data() As ThirdParty.PortableData
    Get
        ' ...
    End Get

    Set(ByVal value As ThirdParty.PortableData)
        ' ...
    End Set
End Property

我也试过了,调用代码略有不同:

Public Sub SetData(ByVal value as ThirdParty.PortableData) 
    ' ...
End Sub

根据 VS2008 和 ProcExp,ThirdParty DLL 正在从多个位置加载——一次从参考路径加载,一次从构建目录加载。 DLL 的 MD5 摘要匹配。

如果我将所有内容复制到一个新目录中,确保只有一个 ThirdParty DLL 副本,则程序可以正常工作。

所有对ThirdParty 的引用都关闭了“复制本地”。然而,一份副本位于FirstParty\bin\Debug

我还应该检查什么?除了复制构建产品的构建后脚本之外,我如何在调试期间防止MissingMethodException

【问题讨论】:

  • 尝试重命名 dll。我能想到一些有帮助的情况,但我真的怀疑它会不会。但值得一试。
  • 布莱恩,如果你觉得有用的话,我会试着挥动一只死鸡。 :)

标签: .net missingmethodexception


【解决方案1】:

我在使用gacutil /i 注册到 GAC 的程序集时遇到了这个问题。 在调试时,Visual Studio 没有使用本地副本,而是使用了 GAC 的副本(版本号相同,但方法声明不同),导致缺少方法异常。

我的解决方案是使用 gacutil /l >myassemblies.txt 从 GAC 列出所有程序集,然后使用 gacutil /u 从 GAC 卸载特定程序集。

【讨论】:

    【解决方案2】:

    将所有文件复制到新的干净机器上。散列所有这些文件以确保每个 dll 都有唯一的值,不要相信版本号。看看问题是否存在。我的猜测是您的问题将在干净的机器上得到解决。

    如果可行,则返回您的计算机,对每个 DLL 进行全局搜索并在其上运行哈希,并确保它与您期望的 EXACT 文件相同。

    我经常发生这种情况,人们对其版本号 (1.0.0.0) 进行硬编码,然后在他们的机器上拥有 5 个不同的 DLL 副本(本地目录、共享文件夹、GAC 等)

    【讨论】:

    • Jason,所有的 DLL 都匹配。然而,一个 DLL 被加载了两次——这导致了 MethodMissingException。强名称会有帮助吗?
    • 强命名将解决问题,并且始终是一个好主意。我认为您的应用必须通过 Vista 认证。但是,如果您遇到该异常,我非常强烈怀疑您被加载两次的 DLL 在某种程度上有所不同。我知道你认为它是一样的,但是当你解决这个问题时,我相信解决方案中会涉及到不一样的文件......
    【解决方案3】:

    您需要的工具是Fusion Log Viewer。它会告诉您 CLR 在尝试找到要加载的正确程序集时所采取的确切步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多