.net 是什么导致了mscorlib递归资源查找错误
以下屏幕截图中显示的错误偶尔出现: 应用程序本身是非托管C++,使用COM对象和.NET对象(通过C互操作)在C.*和VB中使用。 我们的代码中只有来自堆栈跟踪的两个函数 McWrapperControl.ControlHost.InvokeMethod.net 是什么导致了mscorlib递归资源查找错误,.net,com,com-interop,mscorlib,idispatch,.net,Com,Com Interop,Mscorlib,Idispatch,以下屏幕截图中显示的错误偶尔出现: 应用程序本身是非托管C++,使用COM对象和.NET对象(通过C互操作)在C.*和VB中使用。 我们的代码中只有来自堆栈跟踪的两个函数 McWrapperControl.ControlHost.InvokeMethod Public Sub InvokeMethod(ByVal Member As String, ByVal NumArgs As Integer, ByVal Args As Object) Try Dim ArgsType
Public Sub InvokeMethod(ByVal Member As String, ByVal NumArgs As Integer, ByVal Args As Object)
Try
Dim ArgsType As Type = Args.GetType()
Dim ArgsArray As Object
If NumArgs = 0 Then
ArgsArray = Nothing
ElseIf ArgsType.IsArray Then
ArgsArray = Args
Else
ArgsArray = {Args}
End If
InvokeMethod_ArgsArray(Member, ArgsArray)
Catch ex As Exception
ReportError.ShowErrorDialog(ex, "")
End Try
End Sub
和McWrapperControl.ControlHost.InvokeMethod_ArgsArray
Public Sub InvokeMethod_ArgsArray(ByVal Member As String, ByVal ArgsArray As Object)
Try
Dim Target As Object = ContainedControl()
If Target IsNot Nothing Then
Dim TargetType As Type = Target.GetType()
TargetType.InvokeMember(Member, BindingFlags.InvokeMethod, Nothing, Target, ArgsArray)
End If
Catch ex As MissingMethodException
'Ignore this error
Catch ex As Exception
ReportError.ShowErrorDialog(ex, "")
End Try
End Sub
在这种情况下,我相当确定正在发生MissingMethodException,但这应该被捕获并忽略。显然,在尝试调用命名方法之前,我可以通过检查命名方法是否存在来防止此错误
除此之外,有人能解释一下是什么导致了这种递归吗?它无法到达Catch子句,它仍在试图构造MissingMethodException对象。这需要资源查找来生成消息属性值。AppDomain似乎有点不对劲,它是如何递归回ControlHost.InvokeMethod()的非常神秘。正是这种递归产生了硬崩溃。但是定制托管CLR的重点通常是修补AppDomain程序集解析机制,在非托管代码中使用堆栈框架,我们看不到,在代码中看不到。首先,调用InvokeMethod的是什么?调用C++的方法是什么?什么时候调用?该函数是使用COM接口从另一个线程调用的,COM接口是使用CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream传递到线程的。(还记得吗?它是在上个世纪编程的。).NET对象是通过COM互操作创建的,它必须在后台创建AppDomain。我们没有显式地对AppDomain执行任何操作。为什么CLR会回调您的这个InvokeMethod方法?我假设这个InvokeMethod代码是在“something”启动时自动调用的(一个静态something(ctor)、一个lazy、一个线程、一个AppDomain等等)。因此,当第一个错误发生时,系统会初始化另一个再次调用该代码的东西。这可能是因为它不是递归的,而是工作线程在重复调用man线程吗?这意味着(1)工作线程不会等待线程间调用完成(我觉得有点奇怪)和(2)主线程在可以处理线程间调用的状态下阻塞(我猜这意味着泵送其消息循环)。