我主要是为遇到这个奇怪问题的其他人发布这个,如果有人能解释为什么 IIS/Cassini 是一个魔鬼。
在大多数情况下,我们可以成功地将 ODL 中定义的 Dispatch 对象转换为
[ 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++ OLE/COM 自动化 DLL 中实现的,并且类型库用于创建一个互操作 DLL 并且它是 regasm'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 。但是对象本身仍然有效并且可以被询问,只是不再投射。
为什么它在第 16 个线程上失败,并且事先工作正常?Ps 一切都设置为 STA。我该如何解决?