¿Por qué los ensamblajes firmados tardan en cargarse?

Esta semana tuve un problema extraño 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 se fue al baño. Cada vez que la aplicación cargaba un ensamblaje firmado, demoraba 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í?

Alguna otra información:

  • Esta es una aplicación de WinForms que se ejecuta bajo .NET 3.5 SP1.
  • La computadora no tenía conexión a internet (a propósito, por seguridad).

Echa un vistazo a estos enlaces:

Ellos podrían ayudar. Podría ser que la configuración en su sistema signifique que .NET Framework está haciendo mucho trabajo adicional para verificar el ensamblaje. Si este es el caso, entonces puedes configurarlo para que no sea tan delicado.

La publicación de Jason Evans contiene la respuesta, pero en 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 estaría en la carpeta de salida de depuración). Esto muestra un archivo xml que asume que no tiene otras entradas en el archivo de configuración principal; Si ya tiene el archivo, asumo que simplemente agregaría las nuevas secciones / texto según sea necesario:

< ?xml version="1.0" encoding="utf-8"?>      

Solo en caso de que alguien más llegue a esta publicación, he rastreado el problema un poco más, porque estaba tratando de averiguarlo y encontré esta página.

Parece que la CRL se comprueba cada vez que ejecuta su proceso si se ha agotado el tiempo de espera de la CRL existente que está en su máquina y aún no se ha actualizado con una nueva. Puede probar esto presionando la CRL en http://crl.microsoft.com/pki/crl/products/CodeSignPCA.crl y verifique la fecha de caducidad. Ahora configure un Proxy dentro de IE que no funcione. 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á deshabilitada, 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, se comprueba la CRL y si hay un problema con el Proxy, experimentará este tiempo de espera.

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

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

La carga de ensamblajes firmados definitivamente será más lenta que las contrapartes no firmadas porque la firma debe verificarse, pero esto debe ser completamente insignificante.

Pasando de 5 segundos a 90 segundos ?? Creo que necesita ponerse en contacto con el autor de la asamblea y preguntarles si solo cambiaron la firma 🙂

Supongo que tiene configuradas las configuraciones de seguridad 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 de tiempo de espera MUY típico).

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

BTW: Otra opción sería si su unidad de disco duro está completamente llena y los ensamblajes están EXTREMADAMENTE fragmentados (pero 90 segundos serían más de lo que había oído en ese caso).

Intente iniciar su aplicación desde Visual Studio con “Step over”. Esto iniciará el código al pasar por encima de cada aplicación, para que pueda comprobar lo que lleva tanto tiempo. Una vez tuve esto, y resultó que mi servidor SQL estaba realmente desordenado.

Otra forma de descubrir por qué demora tanto es colocar un punto de interrupción dispersos a través del código de carga y ver cuál es el cuello de botella. Si la aplicación tarda 90 segundos antes de su primer me gusta, probablemente algo con XCeed, o cargando los ensamblajes firmados.

Por cierto, soy consciente de que hay mejores formas de crear un perfil de su aplicación, pero esta forma rápida y sucia funciona de manera agradable y eficiente para solucionar estos problemas.

Tal vez los ensamblajes firmados no sean NGEN, mientras que los no firmados sí lo son.