我有一个像这样的简单测试代码 -
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错误 -
检测到FatalExecutionEngineError
消息:运行时遇到了 致命错误。错误的地址 线程为0x2354,位于0x5ba46832。 错误代码是0xc0000005。这个 错误可能是CLR或中的错误 不安全或不可核实的部分 用户代码这个的常见来源 错误包括用户编组错误 COM-interop或PInvoke,可能 腐败堆栈。
这只发生在.NET 4.0中运行时。代码在.NET 2.0中运行得很好。
我可以通过替换
解决问题Marshal.QueryInterface(_pObject, ref iUnknownGuid, out _pIUnknown);
与
_pIUnknown = Marshal.GetIUnknownForObject(_pObject);
但我不明白为什么。有人可以帮忙解释一下吗?