El tipo se define en un ensamblado al que no se hace referencia, ¿cómo encontrar la causa?

83

Sé que el mensaje de error es común y hay muchas preguntas en SO sobre este error, pero hasta ahora ninguna solución me ha ayudado, así que decidí hacer la pregunta. La diferencia con la mayoría de preguntas similares es que uso el directorio App_Code.

Mensaje de error:

CS0012: The type 'Project.Rights.OperationsProvider' is defined in an
assembly that is not referenced. You must add a reference to assembly
'Project.Rights, version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Archivo fuente:

c:\inetpub\wwwroot\Test\Website\App_Code\Company\Project\BusinessLogic\Manager.cs

Siguiendo las sugerencias aquí y aquí , he eliminado todas las instancias de Project.Rights.dll dentro de C: \ Windows \ Microsoft.NET /*.* De acuerdo con esto , verifiqué si los archivos .cs en cuestión tienen la acción de compilación establecida en "Compilar" . Ellas hacen. También he comprobado dos veces que el archivo .cs que contiene el tipo "Project.Rights.OperationsProvider" esté implementado en el directorio App_Code.

Por alguna razón, la aplicación no busca el tipo en el directorio App_Code. Como eliminé todas las instancias de Project.Rights.dll (que yo sepa), no sé qué ensamblaje menciona el mensaje de error.

afaf12
fuente
6
Estás usando una clase (digamos A ) que expone un método / propiedad / algo de tipo Project.Rights.OperationsProvider. El compilador necesita saber qué es eso y luego buscará ese ensamblado (Project.Rights). Si no lo encuentra (porque no tiene una referencia a él en el proyecto de su sitio web) ... obtiene este error. Solución: ¡NO retire ese conjunto de su sistema! AÑADIR una referencia.
Adriano Repetti
2
Intente ir a herramientas - opciones - proyectos y soluciones - compilar y ejecutar - configure ambas verbosidades en Detallado. Eso le dirá cuál es la dependencia y dónde la está buscando el compilador.
danludwig

Respuestas:

99

Cuando recibe este error, no siempre es obvio lo que está sucediendo, pero como dice el error, le falta una referencia. Tome la siguiente línea de código como ejemplo:

MyObjectType a = new MyObjectType("parameter");

Parece bastante simple y probablemente haya hecho referencia a "MyObjectType" correctamente. Pero digamos que una de las sobrecargas del constructor "MyObjectType" toma un tipo al que no se ha hecho referencia. Por ejemplo, hay una sobrecarga definida como:

public MyObjectType(TypeFromOtherAssembly parameter) {
    // ... normal constructor code ...
}

Ese es al menos un caso en el que obtendrá este error. Por lo tanto, busque este tipo de patrón en el que haya hecho referencia al tipo, pero no a todos los tipos de propiedades o parámetros de método que son posibles para las funciones que se llaman en ese tipo.

¡Espero que esto al menos te ayude a ir en la dirección correcta!

drew_w
fuente
16
Nota sobre los métodos de extensión: si dos clases tienen métodos de extensión con el mismo nombre, los parámetros de un tipo pueden "infectar" el uso del método de extensión de otro tipo.
Athari
@Athari gracias, nunca me hubiera dado cuenta de eso
Dave Cousineau
Acabo de encontrar esta respuesta después de un rato de mirar. Este es exactamente mi problema y su explicación fue muy útil. Muchas gracias.
Diane
1
Pero, ¿y si no quiero usar el constructor con la referencia? Quiero usar los demás, sin agregar una referencia. Parece que esto debería ser posible.
Robert Iagar
1
Esto parece realmente extraño, pero recibí este error porque tuve una discrepancia en el caso de uno de los nombres de ensamblado (¿parece que nuget distingue entre mayúsculas y minúsculas?). Tenía una biblioteca C, bibliotecas de referencia B y A. La biblioteca B también hacía referencia a la biblioteca A, pero empaquetaba A como una dependencia con el nombre 'a' en lugar de 'A'. Construyendo la biblioteca C, seguí recibiendo este error hasta que corrigí el nombre de la dependencia en B.
Tolu
49

Verifique el marco objetivo en los proyectos.

En mi caso, "Debe agregar una referencia al ensamblaje" significaba en realidad que los proyectos de referencia y de llamada no tenían el mismo marco de destino. El proyecto de la persona que llama tenía .Net 4.5, pero la biblioteca referenciada tenía el objetivo 4.6.1.

Estoy seguro de que el compilador de MS puede ser más inteligente y registrar un mensaje de error más significativo. Agregué una sugerencia a https://github.com/dotnet/roslyn/issues/14756

Michael Freidgeim
fuente
16

En mi caso, esto se debió a que al realizar una actualización del paquete NuGet solo se actualizaron las referencias a una dependencia de dll en algunos proyectos de mi solución, pero no en todos , lo que resultó en versiones en conflicto. Usando una herramienta de estilo grep para buscar texto dentro de archivos * .csproj en mi solución, fue fácil ver los proyectos que aún necesitaban actualizarse.

rogersillito
fuente
Gracias por esta respuesta, pensé que era algo parecido a esto, pero me alegré de verlo. Dicho de otra manera: mi proyecto principal (servicio) que llama a un constructor con un parámetro opcional en mi capa de datos no tenía esa referencia agregada al .csproj. La comparación de los archivos .csproj secundarios y primarios debe iluminar un ItemGroup que debe estar en el primario que no lo es.
Ryanman
3
La ventana del Administrador de paquetes de Visual Studio para la solución (no para el proyecto individual) tiene la pestaña Consolidar , que muestra qué paquetes tienen diferentes versiones en diferentes proyectos. Probablemente es mejor que la herramienta tipo grep
Michael Freidgeim
7

Cuando recibe este error, significa que el código que está usando hace una referencia a un tipo que está en un ensamblado, pero el ensamblado no es parte de su proyecto, por lo que no puede usarlo.

Eliminar Project.Rights.dll es lo opuesto a lo que desea. Debe asegurarse de que su proyecto pueda hacer referencia al ensamblaje. Por lo tanto, debe colocarse en la caché de ensamblados global o en el directorio ~ / Bin de su aplicación web.

Editar: si no desea utilizar el ensamblado, eliminarlo tampoco es la solución adecuada. En su lugar, debe eliminar todas las referencias a él en su código. Dado que el ensamblado no es necesario directamente por el código que ha escrito, sino por otra cosa a la que hace referencia, tendrá que reemplazar ese ensamblado al que se hace referencia con algo que no tenga Project.Rights.dll como dependencia.

masón
fuente
2
No puedo usar el ensamblaje, es un requisito. Necesito deshacerme de él y almacenar la clase dentro del directorio App_Code. Sé cómo suena, créame. Tener la tarea de modificar una aplicación para que toda la lógica empresarial se almacene dentro de App_Code en lugar de DLL ... no es divertido.
afaf12
1
No, significa que está usando algo con una referencia a él (no que lo esté usando directamente). @ afaf12 si tienes que deshacerte de él ... tienes que comprobar quién lo está usando (imagina esto como una referencia indirecta ). No puede simplemente pegar el código en el directorio App_Code, cualquier ensamblado compilado seguirá haciendo referencia a uno original (y externo) ...
Adriano Repetti
Tuve una similar y tu publicación me ayudó mucho. En mi caso, hice referencia a un ensamblaje "A". Este ensamblaje estaba usando otro ensamblaje "B". Seguí recibiendo un error de que falta el ensamblaje "B", aunque lo agregué a mi proyecto. Una vez que copié el ensamblaje "B" en mi directorio bin, el problema se resolvió. La razón es que mi proyecto no estaba usando el ensamblado "B" pero el ensamblado "A" estaba usando y no lo encontró y por lo tanto lanzó una excepción. Gracias.
ykh
4

En mi caso, estaba haciendo referencia a una biblioteca que se estaba construyendo con la plataforma / configuración incorrecta (acababa de crear la biblioteca referenciada).

Además, no pude solucionar el problema en Visual Studio Configuration Manager, no pude cambiar y crear nuevas plataformas y configuraciones para esta biblioteca. Lo arreglé corrigiendo las entradas en la ProjectConfigurationPlatformssección del .slnarchivo para ese proyecto. Todas sus permutaciones se establecieron en Debug|Any CPU(no estoy seguro de cómo lo hice). Sobrescribí las entradas del proyecto roto con las de un proyecto en funcionamiento y cambié el GUID de cada entrada.

Entradas para proyecto en funcionamiento

{9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.ActiveCfg = Release|x64 {9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.Build.0 = Release|x64

Entradas para proyecto dañado

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Debug|Any CPU {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Debug|Any CPU

Entradas dañadas ahora arregladas

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Release|x64 {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Release|x64

Espero que esto ayude a alguien.

Joseph
fuente
Para mí fue similar. VIsual Studio ha cambiado los GUID para algunos de mis proyectos de FAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C #) a 9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET). Después de que los volví a cambiar, todo salió bien.
scor4er
3

Me acaba de ocurrir que diferentes proyectos hacían referencia a diferentes copias de la misma dll. Me aseguré de que todos hicieran referencia al mismo archivo en el disco y el error desapareció como esperaba.

Gonzalo Méndez
fuente
1

No funcionó para mí cuando intenté agregar la referencia desde la pestaña .NET Assemblies. Sin embargo, funcionó cuando agregué la referencia con BROWSE a C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

Cătălin Rădoi
fuente
0

una de las razones principales puede ser la propiedad de DLL, antes de hacer cualquier cosa para verificar specific version propertysi es verdadero, hacerlo falso

Razón: tal vez el código fuente se unió a otra versión (antigua) cuando la compila, pero esta biblioteca se actualizó con una nueva actualización, la versión ahora es diferente en Assembly Cash y su aplicación no puede obtener una nueva DLL, y después de deshabilitarla, specific version propertysu applacaten será gratuita. para obtener la nueva versión de referencias DLL

Mohammed Rashed Ali
fuente
0

Quizás una biblioteca (archivo DLL) que está utilizando requiera otra biblioteca. En mi caso, hice referencia a una biblioteca que contenía un modelo de entidad de base de datos, pero olvidé hacer referencia a la biblioteca del marco de la entidad.

Graham Laight
fuente
0

Esto también puede significar que usa una biblioteca, que expone tipos (públicos) que están definidos en una biblioteca. Incluso cuando no los use específicamente en su biblioteca (la que no construye).

Lo que esto probablemente evita es que escriba código que use una clase (que en su firma tiene los tipos de una biblioteca sin referencia) que no puede usar.

Edad
fuente
0

Para mí, la razón por la que apareció el error fue que el WebForm donde se informó el error se movió de otra carpeta, pero el nombre de su clase de archivo de código no se modificó y no se correspondía con la ruta real.

Estado inicial
: Ruta del archivo original: /Folder1/Subfolder1/MyWebForm.aspx.cs Nombre de clase del archivo de código
original: Folder1_Subfolder1_MyWebForm

Después de mover el
archivo: Ruta del archivo: /Folder1/MyWebForm.aspx.cs Nombre de la clase del archivo de
código (sin cambios, con el error mostrado): Folder1_Subfolder1_MyWebForm

La solución: cambie el
nombre de su clase de archivo de código Folder1_Subfolder1_MyWebForm
a una que corresponda con la nueva ruta :Folder1_MyWebForm

Todo a la vez: problema resuelto, sin informes de errores.

Vladimír Hála
fuente
0

El tipo 'Domain.tblUser' se define en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado 'Dominio, Versión = 1.0.0.0, Cultura = neutral, PublicKeyToken = null'.

**Solved:**
 Add reference of my domain library layer to my web app libary layer

Nota: asegúrese de que sus referencias sean correctas de acuerdo con su contenedor DI

Asif Raza
fuente
0

En mi caso esto fue porque usé

Operador implícito

entre BLLy DALclases. Cuando quiero usar la BLLcapa en la capa de aplicación, aparece este error. Cambié

operador implícito

a

operador explícito

estará bien. Gracias

Amirhossein Yari
fuente
0

En mi caso, la versión de la dll a la que se hace referencia era en realidad más nueva que la que tenía antes.

Solo necesitaba volver a la versión anterior y eso lo solucionó.

Hugo Nava Kopp
fuente
0

Para mí, esto se debió a que el proyecto tanto directa como indirectamente (a través de otra dependencia) hacía referencia a dos compilaciones diferentes de Bouncy Castle que tenían diferentes nombres de ensamblado. Una de las compilaciones de Bouncy Castle fue el paquete NuGet, la otra fue una compilación de depuración de la fuente descargada de GitHub. Ambos eran nominalmente la versión 1.8.1, pero la configuración del proyecto del código de GitHub establece el nombre del ensamblado en BouncyCastle mientras que el paquete NuGet tenía el nombre del ensamblado BouncyCastle.Crypto. Cambiar la configuración del proyecto, alineando así los nombres de ensamblaje, solucionó el problema.

Mathiash
fuente
1
Le sugiero que pueda hacer que su respuesta sea más útil explicando también cómo lo solucionó.
Stephen Kennedy
0

Tengo un problema similar, elimino RuntimeFrameworkVersion y el problema se solucionó.

Intente eliminar 1.1.1 o

Arash Yazdani
fuente
0

Tuve este problema en una solución recién creada que usaba proyectos existentes. Por alguna razón, un proyecto no podía "ver" otro proyecto, a pesar de que tenía la misma referencia que todos los demás proyectos, y el proyecto referenciado también se estaba construyendo. Sospecho que no pudo detectar algo que tenga que ver con múltiples marcos de destino, porque se estaba construyendo en un marco pero no en el otro.

La limpieza y la reconstrucción no funcionaron y reiniciar VS no funcionó.

Lo que terminó funcionando fue abrir un "Símbolo del sistema de desarrollador para VS 2019" y luego emitir un msbuild MySolution.slncomando. Esto se completó con éxito, y luego VS comenzó a construir con éxito también.

Dave Cousineau
fuente
-3

Limpiar su solución y reconstruir funcionó para mí (en Visual Studio, estas son opciones que obtiene cuando hace clic derecho en el explorador de soluciones), el error desapareció en mi proyecto.

Joost
fuente