InvalidCastException para Objeto del mismo tipo-Carga de control personalizada


Tengo un error muy cableado, uno de mis controles personalizados parece que es crear dos archivos compilados, y cuando intento cargarlo dinámicamente con LoadControl() es simplemente fallar porque no se puede convertir el uno al otro - incluso si son exactamente los mismos. Escribo el mensaje para ver que todo es lo mismo, es solo cambiar la dll compilada.

System.Web.HttpUnhandledException (0x80004005):     
 Exception of type 'System.Web.HttpUnhandledException' was thrown. --->             
    System.InvalidCastException:
[A]ASP.Modules_OneProduct_MedioumImage cannot be cast to
[B]ASP.Modules_OneProduct_MedioumImage.         

   Type A originates from 'App_Web_kg4bazz1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
in the context 'Default'
    at location 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\80ed7513\10eb08d9\App_Web_kg4bazz1.dll'.          

   Type B originates from 'App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 
in the context 'Default'    
    at location 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\80ed7513\10eb08d9\App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b.dll'.

El código

Este es el código tal y como está ahora mismo después de haber seguido exactamente lo que está escrito en MSDN :

foreach (int OneProductID in TheProductIdArrays)
{
    // here is the throw.
    ASP.Modules_OneProduct_MedioumImage OneProduct = 
        (ASP.Modules_OneProduct_MedioumImage)LoadControl(@"~/mod/OneProduct_MediumImage.ascx");

    // do some work with 
    //OneProduct
}

Anteriormente he cargado el control sin el ASP. pero después de que este error aparece y en busca de solución, sigo estrictamente lo que está en MSDN. El bicho sigue aquí sin importar lo que haga.

También he probado ambos métodos, cada uno solo, y juntos (de nuevo fallan)

<%@ Register src="~/mod/OneProduct_MediumImage.ascx" tagname="OneProduct_MediumImage" tagprefix="uc1" %>
<%@ Reference Control="~/mod/OneProduct_MediumImage.ascx" %>

Config

Mi web.config, he intentado con maxBatchSize 20, 100, 1000, también con optimizeCompilations true o false, pero el error aparece de nuevo.

<compilation debug="false" defaultLanguage="C#" batch="true"
maxBatchSize="800" batchTimeout="10800" optimizeCompilations="false"
targetFramework="4.0">

Ahora algunos detalles acerca de

  • El error es aleatorio, en alguna compilación aparece, en alguna otra no.
  • El proyecto es grande, las páginas están en vivo con mucha gente en cada minuto que pide ver algo, pero también aparece cuando no hay nadie dentro.
  • Se ejecuta en 64 bits dot.net 4, Integrado
  • Ejecutar como jardín web, pero también probado y una piscina sola (y obtener el mismo problema)
  • La sesión está desactivada en el proyecto completo.
  • Las páginas se ejecutan a partir de 2007, pero este problema es aparece el último mes, por desgracia no puedo encontrar dónde y cómo se inicia, o lo que es desencadenarlo porque llego tarde algunos días para verlo.
  • Aparece solo una carga de control personalizada, la que tiene llamada pesada.
  • He cambiado 4 veces el código haciendo pequeños cambios, o grandes cambios y todavía allí.
  • He intentado con optimizeCompilations verdadero y falso y el mismo tema.
  • También he intentado detener la web, eliminar todos los archivos temporales, reabrir y lo había otra vez.
  • He intentado colocar un mutex en global.asax cuando la aplicación comienza a bloquear solo una compilación al mismo tiempo, pero esto también falla.
  • Desde el momento que funciona, entonces todo está bien, pero si no funciona no se corrige automáticamente.
  • El código que cargo este control personalizado existe y se llama en más de un lugar en el código, en diferentes páginas.
  • Otros controles personalizados, con carga similar no tuvieron ningún problema.
  • ViewState es desactivado para este control personalizado.
  • También he intentado reubicar algún código, cambiar la llamada a la función completa con micro optimiza, no vuelve a fallar.
  • Funciona bien en el equipo de desarrollo. Coloco batch="true" en la web.config y el error aparece de inmediato.
  • No hay otros problemas como ese, como un error que no podemos solucionar pase lo que pase. El sistema se ejecuta durante días, el grupo NO se recicla en absoluto, la memoria es estable y hay más uso gratuito. El programa es corre desde hace años, pero cambiamos es casi todos los días con actualizaciones.
  • Bajo el mismo núcleo de código se ejecuta más de un sitio (algo así como stackexchange) y todos tienen el mismo problema aleatorio.
  • El AutoEventWireup es false
  • Su aparece y en otro control personalizado que cargue de la misma manera.

Lo que hago ahora como solución alternativa cuando aparece este error: simplemente fuerzo el proyecto a recompilar con un pequeño cambio, y el error desaparece, hasta el siguiente actualizar.

Tengo un error que intenta resolver las últimas semanas del árbol sin encontrar la razón. He intentado casi cualquier cosa que pueda cosa de, pero todo falla, y el error aparece de nuevo. Así que posteo aquí tal vez algunos puedan ayudarme y encontrar una manera de salir de esto.

Última palabra: Este error es una locura, el control personalizado es el mismo, hago cualquier cosa en él solo lo cargo dinámicamente y boom, el compilador es tenerlo dos veces diferentes por alguna razón que solo él sabe - aleatoriamente.

Actualización 1

He podido reproducir el error en la máquina desarrolladora. Allí descubro que los dos módulos dll que contiene este control personalizado tienen un diferente.

El uno era un paquete de 4 controles personalizados juntos. El otro módulo era el control personalizado solo.

Solución alternativa

Después de tres semanas tratando de corregir este error, termino que este error aparece cuando el compilador hace que se compile por lotes de un directorio, y agrupa muchos controles personalizados diferentes, en el mismo DLL. Así que cuando intento cargarlo solo es lanzar esta excepción.

Así que muevo el control personalizado problemático en un directorio diferente solo y parece que lo evito por ahora.

Actualización 2

Aparece de nuevo, incluso después de mover algunos archivos a un directorio diferente. Es aleatorio y no puede encontrar una conexión clara con lo que se desencadena su.

Actualización 3

Porque tenemos spot que el problema principal aquí es la compilación por lotes (batch="true") que compila en el mismo dll muchos controles personalizados, una forma de decirle al compilador que NO haga eso, es el maxBatchGeneratedFileSize parámetro. Yo lo uso con un valor de 100, y el problema aparece de nuevo, ahora tengo inferior a 40 y probarlo.

maxBatchGeneratedFileSize="40"
Author: Aristos, 2013-02-10

5 answers

Esto puede suceder cuando tiene activado el procesamiento por lotes y tiene alguna forma de referencias circulares a nivel de directorio.

Por favor vea esta respuesta para ver exactamente lo que quiero decir con 'referencias circulares' en este contexto, ya que el significado es bastante sutil.

Si logra romper el ciclo (por ejemplo, moviendo un control de usuario a otro lugar), no tendrá este problema.

Actualización 1

Yo pensaría que en teoría, esto solo puede ser causado por un ciclo, pero a veces pueden ser difíciles de detectar.

Te daré una solución alternativa que creo que funcionará y es muy fácil de probar (a pesar de que es un poco de un truco). En los controles de usuario que le están dando problemas, agregue el siguiente atributo en la directiva:

<%@ Control Language="C#" [...] CompilerOptions="/define:dummy1" %>

Si ves esto con otros controles, puedes añadir lo mismo pero con dummy2, dummy3, etc...

Esto tendrá el efecto de no agrupar este control de usuario, ya que tiene diferentes necesidades de compilación de los otros. Técnicamente, puede agregar cualquier parte de la línea de comandos de C# como CompilerOptions, pero un dummy /define es el más simple e inofensivo.

Pero a diferencia de desactivar el procesamiento por lotes a nivel mundial, el impacto perf será mínimo, ya que solo un subconjunto muy pequeño de páginas no se procesará por lotes.

Por cierto, no hace falta decir que lo que estás viendo es un error en ASP.NET, y ese error ha estado allí durante probablemente más de 10 años! Tal vez en algún momento debería ser abordado:)

 11
Author: David Ebbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:44:20

Para rastrear la causa del problema, creo que es importante saber cómo se creó su control. Por favor refiérase a esta lectura: Girando un .control de Usuario ascx en un Control Personalizado Redistribuible .

Paso 1: Creación del Control de usuario

Para crear el control de usuario, lo mejor es comenzar con una aplicación vacía que no contiene nada más que el ascx. Mientras que la creación del usuario control utiliza técnicas "estándar", hay algunos restricciones que es necesario tener en cuenta para que se convierta con éxito en un control personalizado independiente. La restricción principal es que el control de usuario debe ser autónomo. Es decir, no puede depender de las cosas globales de la aplicación como App_Code o global.asax. La razón de esto es que desde el el objetivo es convertir el UserControl en una DLL independiente, romper en otras aplicaciones si se basó en código que no es parte de eso DLL . Una excepción a esta regla es que el UserControl puede ser depende de los ensamblados que viven en el directorio bin (o en el GAC). Solo tienes que asegurarte de que los otros ensamblajes estén siempre disponible cuando usas el control personalizado en otras aplicaciones.

Y

Paso 3: Utilice el comando Publish para precompilar el Sitio

(...) Seleccione "Usar nombres fijos y ensamblados de una sola página". Esto garantizará que su control de usuario se compilará en un solo ensamblado que tendrá un nombre basado en el archivo ascx . Si no marque esta opción, su control de usuario podría compilarse junto con otras páginas y controles de usuario (si tenía algunos), y el ensamblaje recibiría un nombre aleatorio con el que sería más difícil trabajar.

En mi opinión, es muy probable que tenga el control de usuario compilado y registrado en GAC como un ensamblaje separado y también incluido en su DLL de aplicación web.

Nota: Tal vez esto debería haber sido un comentario, pero quería incluir las citas del enlace mencionado. Espero que sea útil.

 2
Author: Alex Filipovici,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 09:55:01

Después de una gran cantidad de depuración en una actualización ASP.NET sitio web, mi último error fue este en tiempo de ejecución.

Acabo de marcar la opción de Compilación / publicación " usar nombres fijos y ensamblados de una sola página "y resolvió mi caso:)

Aquí algunos enlaces útiles: https://msdn.microsoft.com/en-us/library/hh475319 (v=vs.110). aspx

Https://msdn.microsoft.com/en-us/library/aa479044.aspx

Http://forums.asp.net/t/960707.aspx

 1
Author: DestyNova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-14 23:43:25

Recientemente me he encontrado con un problema similar cuando estaba compilando una versión modificada de asp.net MVC 4 y la importación de la nueva DLL en el proyecto.

De alguna manera estaba haciendo referencia a las versiones antiguas de los DLL en la web.config (incluyendo la web.configuración en la carpeta views)

El error en mi caso fue lanzado porque las dos DLL eran versiones diferentes. 4.0.0 y 4.1.0. Tal vez deberías investigar eso. Tal vez especificar una versión de los archivos compilados (supongo que DLLS)

I espero que esto le ayude a solucionar el problema.

Otros consejos: Supongo que tiene algún tipo de sistema de control de versiones? en caso afirmativo, revierta todos los cambios antes de que esto comenzara y mira cuidadosamente el código y qué modelos / controles cambian y cómo. si no está usando VCS... no hay mucho que pueda hacer para revertir los cambios. Y deberías empezar a usar un VCS.

 0
Author: Aviatrix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-04 22:51:55

He notado que a veces el diseñador crea un segundo archivo de diseñador de código, por ejemplo, tendría:

OneProduct_MediumImage.ascx
OneProduct_MediumImage.ascx.cs
OneProduct_MediumImage.ascx.designer.cs
OneProduct_MediumImage.ascx.designer1.cs

No se dará cuenta si no tiene la opción "Mostrar todos los archivos" en el Explorador de soluciones, pero para un proyecto web el compilador compilará todos los archivos en la carpeta, no solo los incluidos en el proyecto.

En segundo lugar, si su proyecto es un "Proyecto de Sitio Web", no hay espacios de nombres, lo que puede conducir a muchos errores extraños. Mira esta pregunta SO: Problema de espacio de nombres . net

Finalmente, logré resolver errores aparentemente aleatorios de UserControl estableciendo el atributo ClassName en el archivo de control, por ejemplo:

<%@ Control Language="cs" 
    AutoEventWireup="false" 
    CodeBehind="OneProduct_MediumImage.ascx.cs" 
    Inherits="ASP.Modules_OneProduct_MedioumImage"
    ClassName="OneProduct_MediumImageControl" %>
 0
Author: Willem Duncan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:51:32