Защо извикването ми към 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

и ако Geoff Chappell е прав, може да е същият проблем като на моята машина: понякога изследователят прави рестарт и за този момент(и) TrayBandSiteService може да не е достъпен.

person ralf.w.    schedule 26.05.2010

Activator.CreateInstance(typeof(MyType)) Работи добре, когато се опитвам да стартирам кода в самостоятелно приложение за Windows. Когато се проваля, когато се опитвам да стартирам същия код в библиотека от класове под wcf услуги

person yamini    schedule 20.12.2011