代码之家  ›  专栏  ›  技术社区  ›  GilesDMiddleton

在IIS中的第16个托管线程上,从COM库转换到接口失败(InvalidCastException,WinRT起始错误0x80040155)

  •  1
  • GilesDMiddleton  · 技术社区  · 6 年前

    我发布这篇文章的目的主要是为了其他任何关注这个奇怪问题的人,如果有人能解释为什么IIS/Cassini是个魔鬼的话。

    在大多数情况下,我们可以成功地将ODL中定义的分派对象强制转换为

    [ uuid(GUID_FOO) ]
    dispinterface IFooDisp
    {
        ... properties & methods.
    };
    [ uuid(GUID_FOO_COCLASS),noncreatable ]
    coclass FooDisp
    {
        [default] dispinterface IFooDisp;
    };
    

    连接到以下接口

    [ uuid(GUID_BAR) ]
    interface IBar : IUnknown
    {
        ... some methods
    }
    

    上述两种方法都是在注册的C++ OL/COM自动化DLL中实现的,而类型库用于创建互操作DLL,并且它是ReasASM D。

    因此,在C#中,我们可以成功地多次调用

    myFoo as IBar
    

    (IBar) myFoo
    

    我们发现,如果我们打开一个网页,转到服务器上的URL,关闭浏览器并重复16次(Cassini或IIS),当创建第16个托管线程时,强制转换会突然失败,出现以下基本异常:

        Exception Thrown at 0x75151812 (KernelBase.dll) in My.exe: 
    WinRT originate error - 0x80040155 : 'Failed to find proxy registration for IID: {GUID_BAR}.' 
    

    (myFoo as IBar)!=null
    

    演员阵容突然返回null。但是对象本身仍然有效,可以被询问,只是不再铸造。

    1 回复  |  直到 6 年前
        1
  •  2
  •   GilesDMiddleton    6 年前

    我可以告诉你如何修复它 oleautomation 到IBar属性。但我不知道为什么有必要。

    我是怎么到那里的?

    我想,如果它只需要注册表项就可以存在,那该怎么办呢? 所以我一个接一个地添加属性,直到右边的一个将注册表设置推入,添加 油脂自动化 对IBar接口属性进行了修改。它突然把它修好了,再也没有失败了。

    也许元数据被清除并重新收集?有人能再解释一下吗?

    推荐文章