在调试时我应该采取什么下一步来修复MissingMethodException?

时间:2009-05-20 13:17:23

标签: .net missingmethodexception

我在一个程序集中调用一些VB.NET代码来自另一个程序集中的C#代码。代码构建正常,但是当我拨打电话时我得到MissingMethodException

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

我已经确认:

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

最强的导致是重复加载包含“缺失”方法签名中使用的类型的程序集。它来自SecondParty(我引用)和FirstParty(其中有本地副本设置)。

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

详情:

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

FirstParty中失败的调用代码看起来像这样:

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

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

SecondPartyFirstParty目标代码似乎无法在运行时找到:

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

我发生了很多这样的事情,人们硬编码他们的版本号(1.0.0.0),然后在他们的机器上有5个不同的DLL副本(本地目录,共享文件夹,GAC等)

答案 2 :(得分:0)

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