IMethodCallMessage Args.Get () - FatalExecutionEngineError или AccessViolationException - PullRequest
1 голос
/ 01 декабря 2011

Эта строка кода вызывает исключения, показанные ниже:

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-взаимодействия или PInvoke, которые могут повредить стек.

Или иногда это исключение:

AccessViolationException: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Это происходит на нескольких машинах.

В стеке вызовов, когда я показываю внешний код, это вверху: mscorlib.dll! System.Runtime.Remoting.Messaging.Message.Args.get () + 0x5 байт.

Есть идеи, почему это происходит, или как это исправить?

Примечание. Код, вызывающий этот метод, имеет блокировку вокруг него, поэтому он не должен быть проблемой потоков / синхронизации.

1 Ответ

0 голосов
/ 19 января 2012

Это скорее обходной путь, чем реальное исправление, но он подходит для этой ситуации. Проблема возникает только тогда, когда выполняется асинхронным способом. Код, запустивший процесс, обернулся вокруг него:

Task.Factory.StartNew(() =>

Когда я удалил это и просто обработал вещи синхронно, проблема ушла.

...