c# - El sitio web.Net 4.6 no carga correctamente los ensamblajes de referencia
asp.net iis (6)
Tengo un proyecto web en Visual Studio 2013, que incluye varios proyectos de biblioteca.
El problema es que la adición de una referencia (es decir, System.Collection, System.Net) al proyecto web se agrega como un ''Ensamblaje de referencia'' desde C:/Program Files (x86)/Reference Assemblies/Microsoft
, cuando se carga en IIS. no está cargando correctamente la implementación del ensamblaje (desde GAC). Ejemplo de error sigue.
[BadImageFormatException: Cannot load a reference assembly for execution.]
[BadImageFormatException: Could not load file or assembly ''System.Collections'' or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +34
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +77
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +16
System.Reflection.Assembly.Load(String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +38
[ConfigurationErrorsException: Could not load file or assembly ''System.Collections'' or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +728
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +196
System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +45
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +172
System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +91
System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +111
System.Web.Compilation.BuildManager.ExecutePreAppStart() +156
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +624
[HttpException (0x80004005): Could not load file or assembly ''System.Collections'' or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +659
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +95
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +189
Eliminar las dlls de referencia de la carpeta bin soluciona el problema, pero no estoy seguro de qué es necesario cambiar para solucionarlo correctamente.
Borro el paquete de la carpeta / Bin
System.Collections y System.Collections.Concurrent
y reconstruir proyecto
funciona.
Cada vez que vea BadImageFormatException
, tiene un problema de compatibilidad de formato binario. Puede ser su grupo de IIS configurado para ejecutar un grupo de 32 bits y sus ensamblajes están diseñados para x64, o viceversa. O, puede ser, estás intentando ejecutar ensamblajes x64 en una máquina de 32 bits. Puede ser que tenga una máquina x64, ensamblajes construidos por anycpu, pero algunos ensamblados de terceros se construyen estrictamente a código de 32 bits.
Es uno de estos, o similar.
Ahora, "usr" tiene buen punto aquí. Tiene No se Cannot load a reference assembly for execution
pero en contexto con BadImageFormatException
. Me pregunto si esto sucede en el momento de la compilación. Para esto, intenta agregar esto a web.config
<compilation>
<assemblies>
<remove assembly="System.Collections" />
. . . .
O si tienes
<add assembly="System.Collections. . . ." />
Intenta eliminarlo primero
Ahora, es normal que GAC sea la ubicación preferida como referencia a menos que proporcione configuraciones de probing
En mi caso, agregué el paquete nuget System.Collections a mi proyecto asp.net 4.6.1 y, por alguna razón, no se incluyó en el archivo csproj. Edité manualmente el archivo csproj y agregué la referencia. Lo recargué, y, voila, funcionó!
Este problema ocurrirá a menudo si sus redirecciones de enlace se refieren a versiones anteriores de las que dependen sus referencias, y esto puede suceder después de actualizar los paquetes (por ejemplo, a través de NuGet). Para resolver en general, he agregado una serie de pasos como respuesta here . Sin embargo, para este problema en particular, recomiendo específicamente el siguiente paso 5 que es:
Elimine todos los enlaces de ensamblaje de todos los archivos app.config y Web.config y luego compile su solución. Los enlaces de app.config ya no son necesarios. Los enlaces de Web.config se volverán a agregar en el siguiente paso, pero al eliminarlos primero se garantiza que no haya ninguna versión obsoleta en sus enlaces.
Me pasó después de la actualización de VS 15.8. La configuración de "Copiar local" en falso resolvió el problema para cada ensamblaje que me dio el error. Además, eliminé (a mano) las etiquetas " <Private>
" duplicadas en .csproj.
Resolución:
Los proyectos de mi biblioteca hacían referencia a algunas librerías básicas ( System.*
Etc) con la opción RequiredTargetFramework
establecida en 3.5. Esto solo fue evidente en el archivo csproj, ejemplo:
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
Por lo tanto, causando todo tipo de problemas con las versiones .net, Visual Studio intentaba clasificarlo agregando redirecciones de enlace en mi web.config para apuntarlas a v4 (e incluir ensamblajes de referencia), sin éxito.
La eliminación de todos los elementos RequiredTargetFramework
de los archivos csproj ha solucionado el problema.