2009-10-24 11 views
11

Me encontré con un problema extraño esta semana que no puedo explicar: cambié mi aplicación para usar la versión firmada de algunos ensamblajes de terceros (Xceed Grid y algunos de sus otros componentes) y la hora de inicio de la aplicación entró en el inodoro. Cada vez que la aplicación cargaba un ensamblaje firmado, tardaba 30 segundos en cargarse. El inicio de la aplicación pasó de 5 segundos a más de 90 segundos. ¿Qué diablos está pasando aquí?¿Por qué los ensamblados firmados tardan en cargarse?

Algunos otra información:

  • Esta es una aplicación que corre bajo Windows Forms .NET 3.5 SP1.
  • La computadora no tenía conexión a Internet (a propósito, por razones de seguridad).
+0

¿Ha cambiado alguna configuración para el entorno de tiempo de ejecución? ¿En especial en qué nivel de confianza ejecutas la aplicación? ¿Defecto? – Foxfire

+1

¿Cómo verificaste el tiempo de carga? – anishMarokey

+0

En Internet Explorer, vaya a Opciones-> Avanzado. Desmarque la casilla "Comprobar la revocación de certificados de los editores", eso me ayudó con situaciones similares en el pasado ... – ParmesanCodice

Respuesta

14

Tener un vistazo a estos enlaces:

Podrían ayudar. Podría ser que la configuración en su sistema significa que .NET Framework está haciendo un trabajo extra para verificar el ensamblaje. Si este es el caso, puede configurarlo para que no sea tan quisquilloso.

+0

Además, póngase en contacto con el autor del ensamblaje en caso de que tengan otros clientes que hayan informado del mismo problema. Pueden tener una sección de FAW en su sitio o algo así. –

+0

¡Gracias, ese fue exactamente el problema! Dirigiéndose a publicar en los foros de Xceed ahora para que nadie más tenga que sufrir este mismo dolor. –

1

Cargando firmado asambleas sin duda será más lenta que sus homólogos no firmado porque la firma necesita ser verificada, pero esto debe ser completamente insignificante.

Pasando de 5 segundos a 90 segundos ?? Creo que debe ponerse en contacto con el autor del ensamblaje y preguntarles si cambiaron solo la firma :-)

+0

El motivo de 90 segundos es que la máquina de prueba no estaba conectada a Internet, por lo que se agotó el tiempo de espera. (Esto puede sonar como una locura, pero hay algunos escenarios donde esto es bastante válido.) –

0

Quizás los ensamblajes firmados no sean NGEN, mientras que los ensamblados no firmados sí.

+1

No estoy seguro, pero él está hablando de 90 !! segundos. Ngen nunca tendrá un impacto tan grande a menos que la asamblea tenga (literalmente) GB de tamaño. – Foxfire

1

Supongo que tiene la configuración de seguridad configurada de manera que los certificados de ensamblaje se verifiquen. Por lo tanto, es probable que intente acceder a la web para verificar algún certificado y luego espera un tiempo de espera (30 segundos es un número MUY típico de tiempo de espera).

Puede verificar esto si observa lo que sucede en esos 30 segundos. Para mi suposición de que es cierto, debería haber poco uso de CPU y pocos accesos a HDD en esos 90 segundos. Si tiene un uso elevado de CPU o está vinculado a su disco duro, entonces es otra cosa.

BTW: Otra opción sería si su disco duro está completamente lleno y los ensamblajes están EXTREMADAMENTE fragmentados (pero 90 segundos sería más de lo que he escuchado en ese caso).

1

Intenta iniciar tu aplicación desde Visual Studio con "Step over". Esto iniciará el código pasando por encima de cada aplicación, para que pueda verificar lo que demora tanto. Una vez tuve esto, y resultó que mi servidor SQL estaba realmente en mal estado.

Otra forma de averiguar por qué tarda tanto es colocar el punto de interrupción disperso a través del código de carga y ver cuál es el cuello de botella. Si la aplicación tarda 90 segundos en antes desu primero le gusta, probablemente algo con XCeed, o cargando los ensamblajes firmados.

Por cierto, soy consciente de que hay mejores maneras de perfil de su aplicación, pero esto rápido 'n manera sucia funciona bastante agradable y eficaz para depurar este tipo de problemas

15

Jason Evans mensaje contiene la respuesta, pero en la forma de un enlace. Pensé que sería bueno publicar la solución real aquí:

Cree un archivo Appname.exe.config en la misma carpeta que el ejecutable (donde Appname es el nombre de su ejecutable; para el desarrollo, esto sería en el carpeta de salida de depuración). Esto muestra un archivo xml que supone que no tiene otras entradas en el archivo de configuración principal; si tiene el archivo ya, supongo que acaba de agregar el nuevo secciones/texto como sea necesario:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <runtime> 
     <generatePublisherEvidence enabled="false" /> 
    </runtime> 
</configuration> 
+0

Gracias Will. Por cierto, veo que probablemente debería haber publicado mi respuesta como un comentario a la respuesta de Jason Evans. No quise adelantarme a su publicación. [Doh! ¡Qué novato!] – MartinKB

+1

¡Gracias por la respuesta! Todavía creo que el enlace es la respuesta definitiva porque contiene el código, una explicación del problema y una explicación detallada de cómo verificar el problema. –

2

Sólo en caso cualquier otra persona viene a través de este post, he rastreado el problema un poco más, porque estaba solo tratando de descubrirlo y encontrar esta página.

Parece que la CRL se comprueba cada vez que ejecuta su proceso si se ha agotado el tiempo de la CRL existente en su equipo y aún no se ha actualizado con una nueva. Puede probar esto al presionar la CRL al http://crl.microsoft.com/pki/crl/products/CodeSignPCA.crl y verificar la fecha de caducidad. Ahora configura un Proxy dentro de IE que no funciona. Establezca la fecha de su máquina después de la fecha de caducidad y vuelva a probar su aplicación.

Si su NIC está desactivada, la CRL no está marcada.

Si su NIC no tiene puerta de enlace, la CRL no está marcada.

Si tiene un Proxy habilitado y una puerta de enlace, entonces la CRL está marcada y si hay un problema con el Proxy, experimentará este tiempo de espera.

Si se conecta a Internet con éxito, entonces la CRL se actualiza y estará bien por el momento.

Mi aplicación estaba usando algunos componentes Xceed más antiguos en .NET 2.0 y ha estado funcionando para siempre, así que me llevó un tiempo averiguar qué estaba pasando.

Cuestiones relacionadas