Error de ASP.Net: "El tipo 'foo' existe tanto en" temp1.dll "como en" temp2.dll "

108

Al ejecutar un proyecto de aplicación web, en momentos aparentemente aleatorios una página puede fallar con un error CS0433: el tipo existe en varias DLL. Las DLL son todas DLL generadas que residen en el directorio "Archivos temporales ASP.NET".

Ben Fulton
fuente

Respuestas:

135

Agregue el atributo batch = "false" al elemento "compilación" del archivo web.config.

Este problema se produce debido a la forma en que ASP.NET 2.0 utiliza las referencias de la aplicación y la estructura de carpetas de la aplicación para compilar la aplicación. Si la propiedad por lotes del elemento en el archivo web.config de la aplicación se establece en true, ASP.NET 2.0 compila cada carpeta de la aplicación en un ensamblado independiente.

http://www.sellsbrothers.com/1995

http://support.microsoft.com/kb/919284

Ben Fulton
fuente
Hombre, gracias por eso. Estaba luchando para solucionar esto en un sitio de producción hoy. Todavía no sé qué lo causó (¡había estado funcionando bien durante tanto tiempo!), Pero esto nos solucionó el problema.
Matt
Gracias. Esto funciona. Desperté esta mañana con este error. MI ISP discountasp.net debe haber cambiado algo. Si no fuera por esta publicación, todavía tendría el error. Pulgar hacia abajo para mi ISP.
Damon
3
Respuesta útil: la sintaxis está aquí: <compilation ... batch = "false" />
Catto
1
Preste atención a esta advertencia: "Este método se recomienda solo para aplicaciones pequeñas ... Esto provoca la fragmentación de la memoria".
ThatMatthew
22

Esto puede suceder si coloca archivos .cs en App_Code y cambia su acción de compilación para compilar en un proyecto de aplicación web.

Tenga la acción de compilación para los archivos .cs en App_Code como Contenido o cambie el nombre de App_Code por otro. Cambié el nombre porque intellisense no arreglará los archivos .cs marcados como contenido.

Más información en http://vishaljoshi.blogspot.se/2009/07/appcode-folder-doesnt-work-with-web.html

Lilja
fuente
11

Una posible razón de este error es que hay 2 páginas aspx, que están teniendo el mismo nombre en su inherits=en el<@page language=......inherits=> línea.

Cambiar el inherits=nombre soluciona el error.

Amrinder Singh
fuente
2
Esto resolvió mi problema, parece que copiar / pegar un control de usuario es un poco complicado cuando no necesitas el código subyacente para hacer nada.
Grubsnik
8

En caso de que alguien más comparta mi problema, recibí este error al intentar publicar un sitio web de un proyecto recién ramificado, la compilación funcionó perfectamente.

Resulta que me había olvidado de quitar la casilla de verificación "Permitir que el sitio precompilado sea actualizable" en Configuración de publicación -> Configurar precompilación .

ErikDaBe
fuente
4

Como otro punto de datos, acabo de tener este problema sin ninguna evidencia de referencias circulares como se describe en los enlaces en la respuesta de Ben. La creación de mi proyecto de sitio web fallaría con algunos de estos errores y la configuracióncompilation batch="false" solucionó, pero no quería ir por ese camino ya que este es un sitio web de producción grande.

Esta solución estaba en una subcarpeta de mi carpeta D: \ svn, que había asignado a S :. Cuando abrí la solución de S :, ocurrieron estos errores, pero si fui directamente a D: \ svn y abrí la solución, no hubo errores.

También noté que, a pesar de tener compilation batch="true"en mi web.config, al abrir la solución desde la unidad S: mapeada, todos mis archivos .ascx se compilan en sus propios ensamblados. Si lo abro desde la ubicación física, los archivos .ascx se compilan en los ensamblados de sus respectivas carpetas (que es como batch="true"se supone que funciona).

Extraño.

Mike Powell
fuente
4

Este error se debió a un conflicto entre el nombre de clase del formulario web y el código auxiliar wsdl (código detrás del archivo .cs) que tiene el mismo nombre de clase, es decir

Página ASPX: Tablero Clase: tablero de clase partiacl

AppCode / APIServices.cs: Panel de control de clase parcial público

El error solo se podía reproducir al publicar el sitio web, pero la compilación y la depuración no informaron ningún error.

Ravi Garg
fuente
2

En mi caso, había cambiado el nombre de un proyecto, por lo que también se había cambiado el nombre del dll. Cuando copié el nuevo dll pero no pensé en eliminar el anterior del servidor, pronto tuve un montón de pares de clases con los mismos nombres. Eliminar los dll obsoletos estaba haciendo el truco (de la causa).

simaglei
fuente
2

Ninguna de estas respuestas funcionó para mí, sin embargo, solucioné el problema. Como estaba usando la función Publicar de VS para implementar la aplicación web, seleccioné la opción para eliminar todos los archivos existentes antes de publicarlos en el asistente Publicar web. Esto forzó una copia limpia de la aplicación y todo funcionó bien desde allí.

Esta solución puede ser útil si su copia de depuración local funciona bien pero el sistema publicado no lo es. También es excelente si no desea tomarse el tiempo para rastrear dll individuales para eliminar y no le importa que los archivos de producción se eliminen primero.

kad81
fuente
2

En mi caso, eliminar todos los ensamblajes de salida de las carpetas bin en todos los proyectos de la solución resolvió el problema. Lamentablemente no tengo ninguna explicación para ello.

dannydk
fuente
1

En mi caso, el problema se resolvió cuando edité un archivo Designer.cs que aún tenía el nombre de clase duplicado. por alguna razón, cuando cambié el nombre de la clase "logout" a "logout2", en el archivo del diseñador no se cambió automáticamente y todavía estaba "logout", y este nombre de clase ya existía en una dll precompilada en mi proyecto (que pertenece a una aplicación web de terceros con la que trabajo y desarrollo).

user960123
fuente
Si se le ocurre una nueva forma de provocar el mensaje de error, no dude en agregarlo :)
Ben Fulton
1

Tengo este problema al poner una parte de una página aspx en el control de usuario separado. En mi máquina todo estaba bien, en el servidor apareció un error.

Se renombró la clase y el archivo del problema.

http://support.microsoft.com/kb/919284 Método 2: Reordenar las carpetas en la aplicación está escribiendo sobre posibles referencias circulares

Anastasia Melnikova
fuente
1

Ninguna de estas soluciones funcionó para mí. Mis dos DLL en conflicto estaban en C: \ ... \ AppData \ ... \ Temporary ASP.NET Files \ ...

El problema era que había revertido mi repositorio de origen a una versión anterior, antes de mover un tipo de un proyecto a otro dentro de la misma solución.

Intenté eliminar la DLL más reciente, que ni siquiera debería haber estado allí en la base de código anterior, de la ubicación de "Archivos temporales ASP.NET" identificada por msbuild. msbuild simplemente vuelva a colocarlo.

También probé la configuración web.config que algunos aquí han usado con éxito, pero tampoco funcionó. Aunque, mientras escribo esto, me doy cuenta de que en realidad había dos proyectos MVC dentro de la misma solución y ambos tenían errores, por lo que el problema puede haber sido que no agregué la configuración a ambos.

Intenté hacer avanzar mi repositorio de origen y limpiar y retroceder y limpiar. Nada.

Intenté eliminar todo lo que se encuentra en la ubicación "Archivos temporales de ASP.NET". msbuild simplemente vuelva a colocarlo.

Finalmente, intenté reconstruir en Visual Studio. Aunque la salida de la línea de comandos y la salida "Errores" dieron el mismo error de "Archivos temporales ASP.NET" de msbuild, el error Intellisense, al pasar el cursor sobre el tipo en conflicto, en realidad se quejó de los archivos DLL en los directorios de salida. Aparentemente, "Limpiar" y "Reconstruir" no estaban haciendo su trabajo. Eliminé manualmente las DLL en los directorios de salida identificados por Intellisense, y el problema se resolvió.

tl; dr: asegúrate de cubrir todos tus web.configs con la configuración por lotes e intenta aprovechar Intellisense para obtener más pistas.

Andrew Kvochick
fuente
1

Mi problema estaba vinculado a un .dll que se estaba generando en la carpeta de mi proyecto.

Si está haciendo referencia a otro archivo, en lugar de hacer todo lo que ve arriba, lo que solucionó mi problema instantáneamente fue eliminar el .dll que estaba dentro de mi directorio / bin para mi proyecto.

El problema no es necesariamente una solución de web.config, es una referencia circular que debe resolverse. Me di cuenta de que borré el antiguo .dll en mi archivo de proyecto original, pero no en el proyecto al que se hacía referencia.

No recomiendo hacer la modificación a su archivo web.config porque eso es solo una corrección de curita, no aborda realmente el problema real. Haga eso si no tiene ganas de solucionar el problema, pero si desea evitar futuros dolores de cabeza, simplemente elimine el .dll de ambos lugares.

cr1pto
fuente
1

Tuve una clase parcial con el mismo nombre en dos proyectos diferentes. Lo resolví dejándolo solo en un proyecto.

Cosmin
fuente
0

A veces puede resultar útil eliminar la solución y crearla de nuevo. Dado que este uso ocurre cuando se convierte de VS2005 a vs2010, algunas referencias al marco 4.0 (después de la actualización) permanecen en la solución, incluso todos los proyectos se definen como 3.5.

Normalmente, la reconstrucción de la solución debería solucionar estos problemas.

Roel AK Mohunlol
fuente
0

Tuve el mismo problema cuando estaba compilando la aplicación en un servidor de compilación.

Mi controlador tenía un código estático simple, así que cambié mi ascx:

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="controllerName.ascx.cs" Inherits="Controls.controllerName" %>

A

 <%@ Control Language="C#" AutoEventWireup="true" Src="controllerName.ascx.cs" Inherits="Controls.controllerName" %>

También eliminó la palabra clave parcial del código subyacente y agregó un espacio de nombres al código subyacente.

Esta:

using System;
using System.Web.UI;

/// <summary>
/// My controller
/// </summary>
public partial class controllerName: UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

A esto:

using System;
using System.Web.UI;

namespace Controles
{
    /// <summary>
    /// My controller
    /// </summary>
    public class controllerName : UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
}

Y eso funcionó para mí.

Saliba
fuente
0

Para mí, esto sucedió cuando tenía mi ubicación de PrecompiledWeb / Publish configurada en el directorio actual, que era donde también estaba la carpeta raíz del sitio.

Mi sitio web veía la carpeta de publicación como parte del proyecto al compilar / construir y luego buscaba duplicados de esa manera.

es decir, no coloque la versión publicada / precompilada de su sitio en las carpetas de códigos de su sitio.

David d C e Freitas
fuente
0

Si las DLL se muestran en una carpeta temporal, debe intentar limpiar su solución.

Hugo Nava Kopp
fuente
0

Publicando mi solución:

El problema estaba relacionado con el "Análisis en tiempo real" de Mcafee Antivirus. Deshabilitar esto resolvió el problema. De alguna manera, ASP no estaba utilizando correctamente la carpeta temporal de ASP cuando el antivirus estaba activado.

Espero que esto ayude a alguien.

Adrian Nasui
fuente
¿Sabías por qué? Mi equipo también tiene este problema, y ​​dicen que se debe a McAfee, sin embargo, según las reglas corporativas de TI, no podemos desactivar el antivirus (¡lo cual no debería interferir!).
Kat Lim Ruiz
Todavía estamos trabajando para encontrar la causa exacta. Desafortunadamente, excluir la carpeta temporal ASP del análisis en tiempo real no soluciona el problema de forma permanente.
Adrian Nasui
0

Vaya a Agregar referencia y busque tanto el dll. Ambos dll habrían marcado, desmarque uno de los dll, ya que hay referencias al mismo dll con una versión diferente que se genera ambigüedad.

RkHirpara
fuente
0

Mi solución fue reemplazar CodePage = "...." con CodeBehind = "..." en el archivo .aspx. De alguna manera se dejó como CodePage durante una migración de versiones anteriores de .NET. Esta directiva de página crea otro archivo dll que entra en conflicto con el archivo dll de proyectos.

mtkale
fuente
0

Ninguna de estas soluciones funcionó para mí. La compilación en el modo "Release" funcionó, pero cuando cambié a "Debug" obtuve incontables mensajes de este error.

No entiendo por qué, pero un simple reinicio de Visual Studio fue mi solución.

Beetee
fuente
0

Me enfrenté al problema en tiempo de compilación.

Estoy de acuerdo con los atributos batch = "true" , el error indica que existen 2 ensamblajes

Solución 1: eliminar uno de ellos

Solución 2: configurar uno de ellos

Hamit YILDIRIM
fuente