2008-09-24 23 views
83

he escrito la siguiente prueba simple para tratar de aprender interfaz fluida del castillo de Windsor:No se pudo cargar el tipo de error de montaje

using NUnit.Framework; 
using Castle.Windsor; 
using System.Collections; 
using Castle.MicroKernel.Registration; 

namespace WindsorSample { 
    public class MyComponent : IMyComponent { 
     public MyComponent(int start_at) { 
      this.Value = start_at; 
     } 
     public int Value { get; private set; } 
    } 
    public interface IMyComponent { 
     int Value { get; } 
    } 

    [TestFixture] 
    public class ConcreteImplFixture { 
     [Test] 
     public void ResolvingConcreteImplShouldInitialiseValue() { 
      IWindsorContainer container = new WindsorContainer(); 
      container.Register(Component.For<IMyComponent>().ImplementedBy<MyComponent>().Parameters(Parameter.ForKey("start_at").Eq("1"))); 
      IMyComponent resolvedComp = container.Resolve<IMyComponent>(); 
      Assert.AreEqual(resolvedComp.Value, 1); 
     } 
    } 
} 

Cuando ejecuto la prueba a través TestDriven.NET me sale el siguiente error:

System.TypeLoadException : Could not load type 'Castle.MicroKernel.Registration.IRegistration' from assembly 'Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'. 
at WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue() 

Cuando ejecuto la prueba a través de la interfaz gráfica de usuario NUnit me sale:

WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue: 
System.IO.FileNotFoundException : Could not load file or assembly 'Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified. 

Si abro la Asamblea que estoy referenciación reflector que puede ver su información es:

Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc 

y que sin duda contiene Castle.MicroKernel.Registration.IRegistration

Qué podría estar pasando?

Debo mencionar que los archivos binarios están tomados del latest build of Castle aunque nunca he trabajado con nant, así que no me molesté en volver a compilar desde el origen y simplemente tomé los archivos en el directorio bin. También debo señalar que mi proyecto se compila sin problemas.

Respuesta

79

¿Está el ensamblaje en la memoria caché de ensamblaje global (GAC) o en cualquier otro lugar en el que esté sobreescribiendo el ensamblado que cree que se está cargando? Esto suele ser el resultado de un ensamblaje incorrecto que se está cargando, para mí significa que generalmente tengo algo en el GAC que anula la versión que tengo en bin/Debug.

+1

Agregué los ensamblajes navegando a los archivos dll, por lo que el GAC no debería entrar en la ecuación. También haga clic derecho en el conjunto-> abrir en reflector desde la solución explorer lo trae al reflector con toda la información que esperaría –

+3

No importa cómo lo haya agregado si existe un ensamblado con el mismo nombre/versión en el GAC cargará ese. –

+0

VS.NET mostrará la ruta al ensamblaje que seleccione y el reflector abrirá el ensamblaje correcto, pero cuando la aplicación se ejecute, el tiempo de ejecución de .NET cargará el ensamblado GAC. –

2

La versión = 1.0.3.0 indica Castle RC3, sin embargo, la interfaz fluida se desarrolló algunos meses después del lanzamiento de RC3. Por lo tanto, parece que tienes un problema de control de versiones. Tal vez tiene Castle RC3 registrado en el GAC y está usando ese ...

+0

Interesante, obtuve la última compilación aquí: http://builds.castleproject.org/cruise/DownloadBuild.castle? number = 956 Es lo que recomendaron en su foro. Además, si ese fuera el caso, imagino que el proyecto no compilaría en absoluto. Pero esto no compila ningún problema –

+0

En cuanto a tener la versión en el GAC, probablemente sí, pero no agregué la referencia del GAC y el uso de un reflector en la referencia indica que es el que yo pensaba –

+0

Intente eliminar el conjunto duplicado de el GAC, estoy dispuesto a ser ese es tu problema. –

101

Si tiene un proyecto que hace referencia a otro proyecto (como un tipo 'Aplicación de Windows' que hace referencia a 'Biblioteca de clases') y ambos tienen el mismo Nombre del ensamblado, obtendrás este error. Puede nombrar con fuerza el proyecto al que se hace referencia o (incluso mejor) renombrar el ensamblaje del proyecto de referencia (en la pestaña 'Aplicación' de las propiedades del proyecto en VS).

+0

Además: intente limpiar la carpeta de salida. Probablemente, el cambio de nombre de biblioteca puede causar el mismo problema, porque ambos (antiguos y nuevos) se colocarán en la misma carpeta de salida. –

+0

Si corta o pega un proyecto y no edita correctamente todos los campos, puede provocar este problema. –

2

me sale esto de vez en cuando y siempre ha sido hacia abajo para que el ensamblado en la GAC ​​

13

Lo sentimos sacar a relucir una vieja pregunta contestada, pero la solución a esto para mí no fue mencionado anteriormente, así que pensé que lo haría Agregue mi respuesta a la larga cola ...

Terminé teniendo una referencia anterior a una clase (un HttpHandler) en web.config que ya no se usaba (y ya no era una referencia válida). Por alguna razón, se ignoró mientras se ejecutaba en Studio (¿o quizás todavía tengo acceso a esa clase dentro de mi configuración de desarrollo?), Así que solo obtuve este error una vez que intenté implementarlo en IIS. Busqué el nombre del ensamblado en web.config, eliminé la referencia del manejador no utilizado, luego este error desapareció y todo funciona bien. Espero que esto ayude a alguien más.

6

que estaba recibiendo este error y nada he encontrado en StackOverflow o en otro lugar lo resolvió, pero la respuesta de bmoeskau a esta pregunta me señaló en la dirección correcta para la corrección, que no se ha mencionado todavía como una respuesta. Mi respuesta no está estrictamente relacionada con la pregunta original, pero la publico aquí bajo la suposición de que alguien que tenga este problema encontrará la forma de hacerlo aquí mediante la búsqueda en Google o algo similar (como yo dentro de un mes cuando esto me vuelva a picar) , arg!).

Mi ensamblaje está en el GAC, por lo tanto, teóricamente, solo hay disponible una versión del ensamblaje. Excepto IIS está cacheando útilmente la versión anterior y me da este error. Acababa de cambiar, reconstruir y volver a instalar la asamblea en el GAC. Una posible solución es usar el Administrador de tareas para matar w3wp.exe. Esto obliga a IIS a volver a leer el ensamblaje desde el GAC: problema resuelto.

0

Esto ocurre generalmente cuando tiene implementada una versión de su ensamblaje en el GAC pero no se ha actualizado con las nuevas clases que podría haber agregado al ensamblado en su IDE. Por lo tanto, asegúrese de que el ensamblaje en el GAC se actualice con los cambios que haya realizado en su proyecto.

E.g. si tiene una Biblioteca de clases comunes y en esa Biblioteca de clases tiene el tipo Common.ClassA e implemente esto en el GAC con un nombre fuerte. Viene más tarde y agrega otro tipo llamado Common.ClassB y ejecuta su código en su IDE sin implementar primero los cambios que realizó en el GAC de Common con el tipo Common.ClassB recién agregado.

1

Sólo tiene que ejecutar en esto con otra de las causas:

ejecutan las pruebas de unidad en modo de lanzamiento, pero la biblioteca se carga era la versión modo de depuración que no había sido actualizado

9

que tenía el mismo problema y para mí no tenía nada que ver con el espacio de nombres o el nombre del proyecto.

Pero como varios usuarios insinuaron que tenía que ver con un ensamblaje antiguo que aún se está haciendo referencia.

Recomiendo eliminar todas las carpetas "bin"/binarias de todos los proyectos y reconstruir toda la solución. Esto eliminó todos los ensamblajes potencialmente desactualizados y luego MEF exportó todos mis complementos sin problema.

1

Sólo tiene que ejecutar en esto con otra de las causas:

que estaba usando un montaje creado fusionada con ILRepack. El ensamblado del que está consultando los tipos debe ser el primero pasado a ILRepack o sus tipos no estarán disponibles.

1

Si este error causado por el cambio del espacio de nombres, hacen que la carpeta sur de ese proyecto se cambia el nombre al mismo nombre, y cerca VS.NET Editar el proyecto que tiene el problema con el Bloc de notas y vuelva a colocar allí los nodos

"RootNamespace> New_Name_Of_Folder_Of_Your_Project_Namespace" RootNamespace> "AssemblyName> New_Name_Of_Folder_Of_Your_Project_Namespace" AssemblyName>

0

Sin embargo, otra solución: DLL de edad apuntando a la otra y en caché por Visual Studio en

C:\Users\[yourname]\AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies

Salga de VS, elimine todo en esta carpeta y Bob es su tío.

0

tuve este problema después de tener un nombre de clase:
Could not load type 'Namspace.OldClassName' from assembly 'Assembly name...'.

Detener IIS y la eliminación de los contenidos en Temporary ASP.NET Files fija, para mí.

depeding en su proyecto (32/64 bits, la versión .NET, etc.) la correcta Temporary ASP.NET Files difiere:

  • 64 bits
    %systemroot%\Microsoft.NET\Framework64\{.netversion}\Temporary ASP.NET Files\
  • 32 bits
    %systemroot%\Microsoft.NET\Framework\{.netversion}\Temporary ASP.NET Files\
  • En mi máquina dev era (¿Porque es posible que IIS Express sea?)
    %temp%\Temporary ASP.NET Files
0

Recibí el mismo error después de actualizar un dll al que se hace referencia en un proyecto ejecutable de escritorio. El problema era que la gente mencionada aquí relacionaba una antigua referencia y era simple de arreglar, pero no se ha mencionado aquí, así que pensé que podría ahorrarle tiempo a otras personas.

De todos modos he actualizado DLL A y tiene el error de otro referenciado dll llamémosle B DLL aquí, donde A tiene una referencia a dll B.

Actualizando DLL B ha solucionado el problema.

-2

Acabo de resolver esto ejecutando el comando iisreset usando el símbolo del sistema ... Siempre lo primero que hago cuando recibo tales errores.

+3

Lo siento, pero esto no tiene nada que ver con la pregunta, hace suposiciones sobre el uso de iis y no explica qué es lo que está causando el problema. –

0

Adición de su DLL de GAC (caché de ensamblados global)

en Visual Studio Command => Ejecutar como Adminstrator

gacutil/i "ruta del archivo DLL"

se puede ver el montaje añadido C: \ Windows \ system32 \

también resolverá DLL que falta o "no se pudo cargar el archivo o ensamblado" en SSIS tarea script

+1

Notaré que agregar cosas al GAC suele ser una mala idea, que la implementación es más difícil y, en general, es algo de lo que incluso Microsoft se está alejando. –

1

que tenía el mismo problema. Acabo de resolver esto actualizando el ensamblado a través de GAC.

Para usar gacutil en una máquina de desarrollo, vaya a: Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010).

Utilicé estos comandos para desinstalar y volver a instalar, respectivamente.

gacutil /u myDLL 

gacutil /i "C:\Program Files\Custom\mydllname.dll" 

Nota: no desinstalé mi dll en mi caso acabo de actualizar dll con la ruta actual.

1

Eliminar mi archivo .pdb para el dll me solucionó este problema. Supongo que tiene algo que ver con el hecho de que el dll fue creado usando ILMerge.

+0

¡Esto fue todo para mí! No sé qué es ILMerge, pero a Epicor no le gustó tener el archivo pdb junto a mi ensamblaje. – MDave

2

Cuando me encuentro con tal problema, encuentro que la herramienta FUSLOGVW es muy útil. Está comprobando la información de enlace de ensamblaje y la registra por usted. A veces las bibliotecas faltan, a veces GAC tiene diferentes versiones que se están cargando. A veces, la plataforma de bibliotecas referenciadas está causando los problemas.Esta herramienta deja en claro cómo se están resolviendo los enlaces de las dependencias y esto realmente puede ayudarlo a investigar/depurar su problema.

Fusion Log Viewer/fuslogvw/Assembly Binding Log Viewer. Consulte más/descargue aquí: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx.

Cuestiones relacionadas