我在一个程序集中调用一些VB.NET代码来自另一个程序集中的C#代码。代码构建正常,但是当我拨打电话时我得到MissingMethodException
。
通常情况下,根据我阅读的MethodMissingException
的Stack Overflow和Google搜索结果,这是由于您构建的DLL与您正在运行的DLL之间不匹配。结果都没有提到第三个DLL。更多关于以下内容。
我已经确认:
最强的导致是重复加载包含“缺失”方法签名中使用的类型的程序集。它来自SecondParty
(我引用)和FirstParty
(其中有本地副本设置)。
手动将所有内容复制到新目录可以解决问题。但这使得调试变得棘手:我喜欢只打绿色三角形。
详情:
我有一个带有强类型ADO.NET DataSet的第三个程序集。我们称之为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
根据VS2008和ProcExp从一个以上的地方加载ThirdParty
DLL - 一次来自参考路径,一次来自构建目录。 DLL的MD5摘要匹配。
如果我将所有内容复制到一个新目录中,确保只有ThirdParty
DLL的一个副本,程序运行正常。
对ThirdParty
的所有引用均已关闭“复制本地”。然而,副本位于FirstParty\bin\Debug
。
我还应该检查什么?除了复制构建产品的构建后脚本之外,如何在调试期间阻止MissingMethodException
?
答案 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在尝试找到要加载的正确程序集时所采取的确切步骤。