c# - SGEN: se intentó cargar un ensamblaje con un formato incorrecto
.net tfs (8)
Tengo un proyecto que puede construir bien en mi máquina local, sin embargo, cuando obtengo TFS para compilarlo, recibo el siguiente error:
SGEN: Se intentó cargar un ensamblaje con un formato incorrecto:
Después de leer muchas otras publicaciones sobre este tema, la mayoría de la gente dice que necesito cambiar el tipo de compilación a x86 o a cualquier CPU, en lugar de x64, pero después de probar innumerables combinaciones, esta no fue la solución. Mi programa también es un servicio de Windows, por lo que la configuración del Pool de aplicaciones para permitir aplicaciones de 32 bits (como lo sugirieron otros) tampoco es la solución.
Actualicé un proyecto de 4.0 a 4.5.2 e instalé el Microsoft .NET Framework 4.5.2 Developer Pack en el servidor de compilación. Después de eso funcionó. Tienes un paquete de desarrollador para todas las demás versiones .net.
El problema desaparece después de instalar el último SDK de Windows que incluye la versión de 64 bits de sgen.exe:
http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx
Algunas veces (si esa no ayuda), la versión anterior ayuda:
http://msdn.microsoft.com/en-us/windows/desktop/hh852363.aspx
Por alguna razón, la versión de 64 bits de sgen no está incluida en las herramientas de compilación de Microsoft
En mi caso, este error no se debió a una combinación inválida de configuraciones x86 / x64, sino a la intención de construir un proyecto que apunta a una versión .NET Framework específica (v4.5.1) cuyos ensamblajes de referencia no se habían instalado en el servidor de compilación. .
La combinación de las siguientes dos condiciones fue responsable del error:
- En Visual Studio, en la página Propiedades del proyecto, en la pestaña Aplicación, el "Marco de destino" se configuró en ".NET Framework 4.5.1";
- En el servidor de compilación, en la carpeta
C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETFramework
, una carpeta llamada v4.5.1 no estaba presente. (Otras carpetas con números de versión, incluidas v3.5, v4.0 y v4.5, estaban presentes).
La solución fue instalar el Kit de desarrollo de software de Windows (SDK) para Windows 8.1 en el servidor de compilación. En el asistente de instalación, en el paso "Seleccionar las funciones que desea instalar", desactivé todas las casillas excepto la de ".NET Framework 4.5.1 Software Development Kit".
La ejecución de esa instalación provocó que se creara la carpeta v4.5.1 que falta en la carpeta Reference Assemblies / Microsoft / Framework.NETFramework y que la construcción se ejecutara correctamente.
Encontré el mismo error cuando traté de compilar mi proyecto (el objetivo de la plataforma está configurado en x86) en Release. Se compiló bien en Debug. Descubrí que, en Release, se ejecuta el ensamblaje Generar serialización; por lo tanto, la llamada a la utilidad SGen. El problema fue que MSBuild llamó a la versión x64 de SGen contra mi EXE x86, que generó el error. Tuve que pasar este argumento de MSBuild para que MSBuild use la versión correcta de SGen:
/p:SGenToolPath="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Bin/NETFX 4.0 Tools"
Encontré este tema relevante: https://github.com/dotnet/sdk/issues/1630
Mientras esperaba que esto se solucionara en una versión futura, pude resolver el problema añadiendo dos objetivos al archivo csproj, como lo sugiere https://github.com/joperezr :
<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Remove="@(_DesignTimeFacadeAssemblies_Names->''%(OriginalIdentity)'')" />
</ItemGroup>
<Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." />
</Target>
<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->''%(OriginalIdentity)'')" />
</ItemGroup>
<Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has run." />
</Target>
Estaba teniendo un problema similar al ver el error de "formato incorrecto" de SGEN al construir en VS o MSBuild desde la línea de comandos. Mi proyecto es x64, pero MSBuild insistió en usar la versión de 32 bits de la herramienta. (Algunos de mis compañeros trabajan en esto al desarrollar VS 2015, pero solo tengo VS 2017 instalado y quiero mantenerlo así).
Mirando el resultado de la construcción de diagnóstico, parece que SGEN se está ejecutando desde el directorio nombrado por su parámetro SdkToolsPath (para mí: C:/Program Files (x86)/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.6.1 Tools/
). Esto se asigna desde TargetFrameworkSDKToolsDirectory. Mirando los archivos de objetivos, esto viene de SDK40ToolsPath. Y eso está establecido desde el archivo .config de MSBuild.
Resolví esto editando C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/MSBuild/15.0/Bin/MSBuild.exe.config
(requiere privilegio de administrador), estableciendo la propiedad SDK40ToolsPath usando
<property name="SDK40ToolsPath" value="$([MSBuild]::GetRegistryValueFromView(''HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/NETFXSDK/4.6.2/WinSDK-NetFx40Tools-x64'', ''InstallationFolder'', null, RegistryView.Registry32))" />
(Nota: si está buscando esta ruta en el registro en un sistema operativo de 64 bits, vaya a HKLM / SOFTWARE / WOW6432Node / Microsoft ...)
El cambio principal es, por supuesto, x86 a x64 para usar las herramientas de 64 bits. También cambié el marco para que sea lo que usamos (4.6.2). Esto puede significar que solo podemos usar herramientas confiables para proyectos de 64 bits y para este marco, con este cambio en su lugar. Aún así, espero que esto pueda ayudar a alguien a encontrarse con este problema. (Estoy sorprendido y consternado. MSBuild no cambia automáticamente la ruta de las herramientas en función de Framework & Architecture).
Mi problema finalmente fue resuelto por esta página - http://aplocher.wordpress.com/2012/10/12/sgen-an-attempt-was-made-to-load-an-assembly-with-an-incorrect-format-tfs-2010/
En caso de que esa página desaparezca en el futuro, aquí están los pasos involucrados:
- En Team Explorer, haga clic derecho en su definición de compilación y elija Abrir ubicación de archivo de proceso
- Haga doble clic en el archivo XAML que está seleccionado
- En el diseñador, seleccione el contenedor llamado Sequence (este es el contenedor de nivel superior que rodea todo lo demás).
- En la lista Argumentos (normalmente en la parte inferior), cambie MSBuildPlatform de Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.Auto a Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.X86.
- Guarde y cierre el archivo.
- Comprueba el archivo de nuevo en TFS y prueba tu compilación de nuevo.
Tuve el mismo problema y ver la pantalla de salida me dio más detalles. A partir de eso, descubrí que Target Framework era más alto de lo que estaba permitido para este tipo de proyecto (estaba construyendo un proyecto SQL Server CLR). El marco de destino en el proyecto se estableció en 4.0. Cambiar esto a 3.5 me solucionó el problema.
Dave