使用Marshal.QueryInterface查询IUnknown导致FatalExecutionEngineError并崩溃QTAgent32.exe

时间:2011-06-09 20:18:40

标签: c# .net visual-studio-2010 c#-4.0 interop

我有一个像这样的简单测试代码 -

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);

但我不明白为什么。有人可以帮忙解释一下吗?

0 个答案:

没有答案