Запрос IUnknown с помощью Marshal.QueryInterface вызвал FatalExecutionEngineError и вызвал сбой QTAgent32.exe - PullRequest
1 голос
/ 10 июня 2011

У меня есть простой тестовый код, подобный этому -

public void GetHashCodeTest1()
{
    MyComPointer target = new MyComPointer();
    MyComPointerAccessor privateTarget = new MyComPointerAccessor(target);

    privateTarget._pObject = new IntPtr(1);   
    int i = target.GetHashCode();
}

, чтобы проверить это -

    public override int GetHashCode()
    {
        if (IsEmpty)
            return 0;

        if (_pIUnknown == IntPtr.Zero)
        {
            Guid iUnknownGuid = new Guid("00000000-0000-0000-C000-000000000046");
            Marshal.QueryInterface(_pObject, ref iUnknownGuid, out _pIUnknown); //<--CRASH HERE
        }
        return (int)_pIUnknown;
    }

И он вызвал ошибку при вызове Marshal.QueryInterface и вызвал ошибку FEEE --

Обнаружена ошибка FatalExecutionEngineEr *

Сообщение: во время выполнения обнаружена фатальная ошибка.Адрес ошибки был 0x5ba46832, в потоке 0x2354.Код ошибки 0xc0000005.Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях пользовательского кода.Распространенными источниками этой ошибки являются ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke, которые могут повредить стек.

Это происходило только при запуске его в .NET 4.0.Код прекрасно работает в .NET 2.0.

Я могу решить эту проблему, заменив

Marshal.QueryInterface(_pObject, ref iUnknownGuid, out _pIUnknown);

на

_pIUnknown = Marshal.GetIUnknownForObject(_pObject);

Но я понятия не имею, почему.Может кто-нибудь помочь объяснить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...