Я публикую это в основном для всех, кто сталкивается с этой странной проблемой, и если кто-то может пролить свет на то, почему IIS / Cassini является дьяволом.
По большей части, мы можем успешно разыгратьобъект Dispatch, определенный в 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 ++ OLE / COM-автоматизации DLL, и библиотека типов используется длясоздайте Interop 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
Приведение внезапно возвращает ноль.Но сам объект все еще действителен и может быть опрошен, но больше не приведен.
Почему он не работает в 16-м потоке и прекрасно работает заранее?Ps все настроено на STA.Как мне это исправить?