.net 是什么导致了mscorlib递归资源查找错误

.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

以下屏幕截图中显示的错误偶尔出现:

应用程序本身是非托管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 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)主线程在可以处理线程间调用的状态下阻塞(我猜这意味着泵送其消息循环)。