reconoce - C#: no se pudieron cargar tipos del ensamblaje
no se puede cargar el tipo del ensamblado (4)
Después de agregar Lucene.net y Lucene.net Contrib a C # MVC3, recibo el siguiente mensaje después de la primera ejecución exitosa. Después de recibir este error, necesito borrar completamente los archivos C: / Users / Me / AppData / Local / Temp / Temporal ASP.NET antes de poder ejecutar el proyecto nuevamente.
Intenté eliminar manualmente los archivos de Lucene (incluidas las referencias en mi proyecto) y volver a instalarlos, tanto con NuGet como manualmente, pero siempre es la misma situación. después de que el proyecto se ejecutó una vez, empiezo a recibir los siguientes errores:
Nota: Contrib.Regex es parte de Lucene.net Contrib.
Server Error in ''/'' Application.
Could not load types from assembly Contrib.Regex, Version=2.9.4.0, Culture=neutral, PublicKeyToken=85089178b9ac3181, errors:
Exception: System.IO.FileLoadException: Could not load file or assembly ''Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181'' or one of its dependencies. The located assembly''s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: ''Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181''
=== Pre-bind state information ===
LOG: User = rcw7/Me
LOG: DisplayName = Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181
(Fully-specified)
LOG: Appbase = file:///C:/Development/Projects/Foobar/Foobar/
LOG: Initial PrivatePath = C:/Development/Projects/Foobar/Foobar/bin
Calling assembly : Contrib.Regex, Version=2.9.4.0, Culture=neutral, PublicKeyToken=85089178b9ac3181.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:/Development/Projects/Foobar/Foobar/web.config
LOG: Using host configuration file: C:/Users/Me/Documents/IISExpress/config/aspnet.config
LOG: Using machine configuration file from C:/Windows/Microsoft.NET/Framework/v4.0.30319/config/machine.config.
LOG: Post-policy reference: Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181
LOG: Attempting download of new URL file:///C:/Users/Me/AppData/Local/Temp/Temporary ASP.NET Files/root/e9b4cfa4/edfa73f8/Lucene.Net.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Exception: System.IO.FileLoadException: Could not load file or assembly ''Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181'' or one of its dependencies. The located assembly''s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: ''Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181''
Salida completa aquí: http://pastebin.com/Vbu4VK7B
Inicialmente pensé que era un problema local en mi entorno de desarrollo, pero después de reconstruir y copiar el proyecto en nuestro servidor, recibo los mismos errores.
¿Alguna sugerencia sobre cómo superar esto? :-)
Esto normalmente significa que tiene los archivos en el GAC que son una versión diferente y los que están en su contenedor son otra versión. Entonces su aplicación apunta a una versión y está buscando otra. Se está confundiendo. Lo que quieres hacer es desinstalar Lucene.net. Después de desinstalar, busque en la carpeta c: / windows / assembly y asegúrese de que no haya archivos Lucene allí. Si hay, haga clic derecho y desinstale. Entonces puedes instalarlo de nuevo.
Puede usar Fusion Log Viewer para diagnosticar este problema. Le da detalles completos de los tipos que no se cargaron de manera similar a la que informó aquí. Espero que esto ayude.
Como resultado, el infierno DLL no fue causado por mi propia intromisión en configuraciones y bibliotecas compiladas. De hecho, fue causado por una colisión entre mi versión recién descargada de Lucene.NET y una versión un tanto anticuada incluida con Examine, que a su vez estaba incluida con Umbraco 5.
Aparentemente, el Lucene.NET obsoleto y empaquetado terminó en la memoria caché de la sombra (Archivos ASP.NET temporales), por lo que después de la siguiente compilación o reinicio de IIS, la ejecución se interrumpiría. Borrar la memoria caché de sombras permitiría una ejecución exitosa.
Lo extraño fue que no pude encontrar ninguna referencia en ninguna parte del resultado de depuración que insinuara la versión obsoleta de Lucene.NET, ya sea con una ruta de directorio o un número de versión. El problema se vio al comparar los tamaños de archivo de la versión copiada de Lucene.NET y la versión que tenía la intención de usar. Estaban desactivados, así que hice una búsqueda de Lucene.NET.dll y encontré el que se incluye con Examine en el árbol de Umbraco (en / App_Plugins / Examine)
La solución rápida era simplemente comprimir el complemento Examine, para que Umbraco no lo viera. Eso me deja sin el complemento Examine, pero no lo estaba usando de todos modos.
La solución correcta sería decirle a la aplicación que debería ignorar las versiones anteriores de Lucene.NET, pero hasta ahora no he tenido suerte. Esto es lo que agregué a web.config:
<dependentAssembly>
<assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.9.4.1" newVersion="2.9.4.1" />
</dependentAssembly>
Esto no pareció tener ningún efecto, y la versión obsoleta aún terminó en el caché de las sombras. He movido esta pregunta aquí: ¿Cómo hago que Umbraco 5 ignore el paquete (con Examine) Lucene.NET
Gracias por su ayuda y sugerencias, ¡me apuntó en la dirección correcta! :-)
La manifest definition does not match
significa que hay un problema con la resolución del ensamblaje. ver esta pregunta
[editar]
Los ensamblajes se cargan desde GAC, luego los directorios lib / bin dentro de su aplicación, luego los directorios especificados mediante <HintPath>
en su proyecto. Comprueba que tienes
Specific Version = True
y Copy Local = True
en la ventana de propiedades de la referencia.
Los ensamblados de las rutas privadas dentro de su aplicación (directorios lib / bin) son los únicos que se copian de forma instantánea. Es posible que Contrib.Regex esté siendo copiado de la sombra mientras que Lucene.NET core no lo está.
[/editar]
El directorio bajo ASP.NET Temporary Files
que está borrando es el directorio de copia oculta. Puede haber un problema con la forma en que se está copiando este ensamblado, que pueden ser permisos para su cuenta de dominio. Puede probar esta teoría cambiando el directorio de shadowcopy o apagando completamente el shadowcopy como se describe aquí :
Puede cambiar este directorio en Application_Start como se explica en https://.com/a/2847495/151445
Puede desactivar la copia oculta en la web.config:
<hostingEnvironment shadowCopyBinAssemblies="false" />