2010-05-22 10 views
5

estoy usando el siguiente código para acceder al servicio web de la banda del Explorador de Windows Shell:¿Por qué falla mi llamada a Activator.CreateInstance intermitentemente?

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; 

Sobre todo, funciona muy bien. Un porcentaje muy pequeño del tiempo (menos del 1%), la llamada a Activator.CreateInstance lanza la siguiente excepción:

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) 

He mirado el código de error, y que parece indicar que el servicio de ISN no registrado Estoy bastante seguro de que ese no es el caso, ya que la llamada funcionará muy bien unos minutos más tarde, y el CLSID es provisto por explorer.exe.

Estoy perplejo. ¿Qué podría hacer que Activator.CreateInstance falle, pero solo en raras ocasiones?

+0

Corregirme si me equivoco, pero ¿no es la presencia de ese objeto un detalle de implementación no documentado? –

+0

@Stephen: El CLSID se define en SHOBJIDL.H pero no está documentado. Estoy buscando una respuesta práctica. Si tienes ideas sobre lo que podría causar los síntomas que estoy observando, soy todo oídos. Incluso si se trata de especulaciones sobre lo que explorer.exe podría estar haciendo internamente. –

Respuesta

1

¿Permisos? Sí, hay un problema con las aplicaciones de alta integridad que acceden a objetos COM en aplicaciones de integridad media. En algún lugar de mi sitio web hay una demostración de esto exactamente. Ah, pero para la clase TrayNotify, no TrayBandSiteService. Espero que no hayas dedicado demasiado tiempo a descifrar algo que podrías haber leído fácilmente.

De todos modos, véase el último párrafo del this, de la que ahora cita:

Como acotación al margen, cabe destacar que el programa falla si el Control de cuentas de usuario (UAC) está activado y el programa se ejecuta con elevada privilegio. EXPLORER es el servidor COM y TRAYNOT (mi programa de demostración) es un cliente COM. Sin embargo, EXPLORER solo tiene integridad media. Aunque las notas de Microsoft sobre UAC (no son lo suficientemente sustanciales como para contar como documentación de programación) se ocupan de la situación de un cliente COM de menor integridad que intenta comunicarse con un servidor COM de mayor integridad, curiosamente se dice poco sobre el reverso. Un cliente COM de mayor integridad está protegido de un servidor COM de menor integridad, del mismo modo que un programa de mayor integridad está protegido de recibir mensajes de ventana de un programa de menor integridad. Para este último, Microsoft proporciona el programa de mayor integridad con medios de explicidad para abrirse a los mensajes esperados desde una fuente de menor integridad. Encontrar la disposición análoga para COM puede ser un ejercicio que valga la pena en otro momento.

Lamento decir que nunca he encontrado la hora.

0

Activator.CreateInstance(typeof(MyType)) Funciona bien cuando intento ejecutar el código en una aplicación de Windows independiente. Donde falla cuando trato de ejecutar el mismo código en una biblioteca de clases bajo los servicios wcf

Cuestiones relacionadas