Почему мой вызов Activator.CreateInstance периодически прерывается? - PullRequest
5 голосов
/ 23 мая 2010

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

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, но только в редких случаях?

Ответы [ 3 ]

1 голос
/ 22 сентября 2010

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

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

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

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

0 голосов
/ 20 декабря 2011

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

0 голосов
/ 26 мая 2010

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

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

...