C# 使用Marshal.QueryInterface查询IUnknown导致FatalExecutionEngineer错误并导致QTAgent32.exe崩溃

C# 使用Marshal.QueryInterface查询IUnknown导致FatalExecutionEngineer错误并导致QTAgent32.exe崩溃,c#,.net,visual-studio-2010,c#-4.0,interop,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 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;
    }


但我不知道为什么。有人能解释一下吗?

QueryInterface的第一个参数必须是指向COM接口的指针。IntPtr1不是有效的指针。这是一个测试代码,所以IntPtr1被传递给QI。我同意它在实际的产品代码中可能不起作用,但此测试代码在.NET2.0中通过,没有使QTAgent32.exe崩溃。同样的代码在4.0中崩溃了。你是说VS2010“修复”了这个问题,所以它不再工作了吗?当然,.NET4中的COM互操作管道发生了变化。CLR现在支持进程中自身的多个实例,特别是为了解决COM版本注入问题。是的,请随意将其解释为“修复”。
Marshal.QueryInterface(_pObject, ref iUnknownGuid, out _pIUnknown);
_pIUnknown = Marshal.GetIUnknownForObject(_pObject);