【发布时间】: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