2

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

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

我已经确认:

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

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

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

细节:

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

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

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

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

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

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

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

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

ThirdParty关闭“复制本地”的所有引用。然而,一个副本正坐在FirstParty\bin\Debug.

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

4

3 回答 3

1

我在使用gacutil /i. 在调试时,Visual Studio 没有使用本地副本,而是使用了来自 GAC 的副本(版本号相同但方法声明不同),导致缺少方法异常。

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

于 2014-10-03T07:20:54.000 回答
0

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

于 2009-05-22T00:14:06.883 回答
0

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

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

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

于 2009-05-20T19:29:26.230 回答