IMethodCallMessage Args.Get() - FatalExecutionEngineError或AccessViolationException

时间:2011-11-30 20:58:44

标签: c# reflection remoting

这行代码会导致以下异常:

object arg = methodCallMessage.Args[i];

private static List<ParameterInformation> GetParameterInfoList( IMethodCallMessage methodCallMessage )
{
    List<ParameterInformation> parameterInformationList = new List<ParameterInformation>();

    // Note: This works even if a parameter's value is null.
    for( int i = 0 ; i < methodCallMessage.ArgCount ; i++ )
    {
        string argName           = methodCallMessage.GetArgName(i);
        object arg               = methodCallMessage.Args[i];
        var parameterInformation = new ParameterInformation(argName, arg);

        parameterInformationList.Add(parameterInformation);
    }

    return parameterInformationList;
}

例外: FatalExecutionEngineError:运行时遇到致命错误。错误的地址位于0x71b97e8d,位于线程0x2ef4上。错误代码是0xc0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会损坏堆栈。

或者有时这个例外:

AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

这发生在多台机器上。

在调用堆栈中,当我显示外部代码时,它位于顶部: mscorlib.dll!System.Runtime.Remoting.Messaging.Message.Args.get()+ 0x5 bytes。

为什么会发生这种情况,或者如何解决这个问题?

注意:调用此方法的代码周围有一个锁,因此它不应该是线程/计时问题。

1 个答案:

答案 0 :(得分:0)

这更像是一种解决方法,而不是实际修复,但它适用于这种情况。只有在以异步方式完成时才会出现此问题。启动该过程的代码包含了它:

Task.Factory.StartNew(() =>

当我删除它并且只是同步处理时,问题就消失了。