我正在从另一个程序集中的 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
根据ThirdParty
VS2008 和 ProcExp,DLL 从多个位置加载——一次从参考路径加载,一次从构建目录加载。DLL 的 MD5 摘要匹配。
如果我将所有内容复制到一个新目录中,确保只有一个ThirdParty
DLL 副本,则程序可以正常工作。
ThirdParty
关闭“复制本地”的所有引用。然而,一个副本正坐在FirstParty\bin\Debug
.
我还应该检查什么?MissingMethodException
除了复制构建产品的构建后脚本之外,我如何在调试期间进行预防?