У меня есть простой тестовый код, подобный этому -
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);
Но я понятия не имею, почему.Может кто-нибудь помочь объяснить это?