2010-05-22 13 views
5

Sto utilizzando il seguente codice per accedere al servizio di banda sito del Windows Explorer Shell:Perché la mia chiamata a Activator.CreateInstance non riesce a intermittenza?

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; 

Per lo più, funziona benissimo. Una percentuale molto piccola del tempo (meno dell'1%), la chiamata alla Activator.CreateInstance getta la seguente eccezione:

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) 

ho guardato il codice di errore, e sembra indicare che l'isn di servizio registrati. Sono abbastanza sicuro che in realtà non è il caso poiché la chiamata funzionerà bene pochi istanti dopo, e il CLSID è fornito da explorer.exe.

Sono perplesso. Cosa potrebbe causare il fallimento di Activator.CreateInstance, ma solo raramente?

+0

Correggimi se ho torto, ma la presenza di quell'oggetto non è un dettaglio di implementazione non documentato? –

+0

@Stephen: il CLSID è definito in SHOBJIDL.H ma è altrimenti non documentato. Sto cercando una risposta pratica. Se hai idee su cosa potrebbe causare i sintomi che sto osservando, sono tutto orecchie. Anche se è una speculazione su ciò che explorer.exe potrebbe fare internamente. –

risposta

1

Autorizzazioni? Sì, c'è un problema con le applicazioni ad alta integrità che accedono agli oggetti COM in applicazioni di media integrità. Da qualche parte nel mio sito web c'è una dimostrazione di esattamente questo. Ah, ma per la classe TrayNotify, non TrayBandSiteService. Spero tu non abbia passato troppo tempo a capire qualcosa che potresti facilmente aver letto.

In ogni caso, vedere l'ultimo paragrafo del this, dal quale ora mi citazione:

Per inciso, si noti che il programma non riesce se Controllo account utente (UAC) è attivato e il programma viene eseguito con elevata privilegio. EXPLORER è il server COM e TRAYNOT (il mio programma dimostrativo) è un client COM. Tuttavia, EXPLORER ha solo media integrità. Sebbene le note di Microsoft sul controllo dell'account utente - non siano abbastanza importanti da contare come documentazione di programmazione - si occupano della situazione di un client COM con integrità inferiore che tenta di comunicare con un server COM ad alta integrità, stranamente si dice poco sul contrario. Un client COM a maggiore integrità è protetto da un server COM a bassa integrità, proprio come un programma di integrità più elevata è protetto dalla ricezione di messaggi di finestra da un programma di integrità inferiore. Per quest'ultimo, Microsoft fornisce il programma di integrità superiore con mezzi espedienti per aprirsi ai messaggi attesi da una fonte di integrità inferiore. Trovare la disposizione analoga per COM può essere un esercizio utile per un'altra volta.

Mi dispiace dire che non ho mai trovato il tempo.

0

Activator.CreateInstance(typeof(MyType)) Funziona correttamente quando si tenta di eseguire il codice in un'applicazione Windows autonoma. Dove fallisce quando provo a eseguire lo stesso codice in una libreria di classi in servizi wcf

Problemi correlati