Почему мой вызов Activator.CreateInstance периодически терпит неудачу?

Я использую следующий код для доступа к службе сайта группы оболочки Windows Explorer:

Guid GUID_TrayBandSiteService = new Guid(0xF60AD0A0, 0xE5E1, 0x45cb, 0xB5, 0x1A, 0xE1, 0x5B, 0x9F, 0x8B, 0x29, 0x34);
Type shellTrayBandSiteService = Type.GetTypeFromCLSID(GUID_TrayBandSiteService, true);
site = Activator.CreateInstance(shellTrayBandSiteService) as IBandSite;

В основном работает отлично. В очень небольшом проценте случаев (менее 1%) вызов Activator.CreateInstance вызывает следующее исключение:

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {F60AD0A0-E5E1-45CB-B51A-E15B9F8B2934} failed due to the following error: 80040154.
  at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
  at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
  at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
  at System.Activator.CreateInstance(Type type, Boolean nonPublic)

Я просмотрел код ошибки, и он указывает на то, что служба не зарегистрирована. Я почти уверен, что на самом деле это не так, поскольку через несколько секунд вызов будет работать нормально, а CLSID предоставляется explorer.exe.

Я в тупике. Что может привести к сбою Activator.CreateInstance, но только в редких случаях?


person Daniel Stutzbach    schedule 22.05.2010    source источник
comment
Поправьте меня, если я ошибаюсь, но разве наличие этого объекта не является недокументированной деталью реализации?   -  person Stephen Cleary    schedule 23.05.2010
comment
@Stephen: CLSID определен в SHOBJIDL.H, но в остальном он недокументирован. Я ищу практический ответ. Если у вас есть идеи о том, что может вызвать симптомы, которые я наблюдаю, я внимательно слушаю. Даже если это предположение о том, что может делать explorer.exe внутри.   -  person Daniel Stutzbach    schedule 23.05.2010


Ответы (3)


Разрешения? Да, существует проблема с доступом приложений с высокой степенью интеграции к COM-объектам в приложениях со средней степенью целостности. Где-то на моем сайте есть демонстрация именно этого. Ах, но для TrayNotify класса, а не TrayBandSiteService. Надеюсь, вы не потратили слишком много времени на выяснение того, что вы, возможно, только что прочитали.

В любом случае, см. последний абзац этот , из которого я сейчас цитирую:

Кроме того, обратите внимание, что программа завершается сбоем, если включен контроль учетных записей (UAC) и программа запускается с повышенными привилегиями. EXPLORER — это COM-сервер, а TRAYNOT (моя демонстрационная программа) — COM-клиент. Тем не менее, EXPLORER имеет только среднюю целостность. Хотя заметки Microsoft по UAC — они недостаточно существенны, чтобы считаться документацией по программированию — касаются ситуации, когда COM-клиент с более низкой степенью целостности пытается связаться с COM-сервером с более высокой степенью целостности, как ни странно, мало говорится об обратном. COM-клиент с более высоким уровнем целостности защищен от COM-сервера с более низким уровнем целостности, так же как программа с более высоким уровнем целостности защищена от получения оконных сообщений от программы с более низким уровнем целостности. Для последнего Microsoft предоставляет программу с более высокой степенью целостности с явными средствами, позволяющими открывать себя для ожидаемых сообщений из источника с более низкой степенью целостности. Поиск аналогичного положения для COM может быть полезным упражнением в другой раз.

С сожалением должен сказать, что я так и не нашел времени.

person Geoff Chappell    schedule 22.09.2010

Я нашел некоторые пояснения о TrayBandSiteService здесь: http://www.geoffchappell.com/viewer.htm?doc=studies/windows/shell/explorer/classes/traybandsiteservice.htm

и если Джефф Чаппелл прав, это может быть та же проблема, что и на моей машине: иногда проводник перезагружается, и в этот момент (моменты) TrayBandSiteService может быть недоступен.

person ralf.w.    schedule 26.05.2010

Activator.CreateInstance(typeof(MyType)) Работает нормально, когда я пытаюсь запустить код в отдельном приложении Windows. Где происходит сбой, когда я пытаюсь запустить тот же код в библиотеке классов в службах wcf

person yamini    schedule 20.12.2011