我正在从另一个程序集中的 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除了复制构建产品的构建后脚本之外,我如何在调试期间进行预防?