web-dev-qa-db-fra.com

SGEN: Tentative de charger un assemblage avec un format incorrect.

J'ai un projet qui peut construire correctement sur mon ordinateur local. Cependant, lorsque TFS le construit, je reçois le message d'erreur suivant: 

SGEN: Une tentative de chargement d'un assemblage avec un format incorrect a été effectuée: 

Après avoir lu beaucoup d'autres articles sur ce sujet, la plupart des gens disent simplement que je dois changer le type de construction en x86 ou N'importe quel processeur, plutôt qu'en x64, mais après avoir essayé d'innombrables combinaisons, ce n'était pas la solution. Mon programme étant également un service Windows, la configuration du pool d'applications pour autoriser les applications 32 bits (comme suggéré par d'autres) n'est également pas la solution.

37
Paul McLean

Mon problème a finalement été résolu par cette page - http://aplocher.wordpress.com/2012/10/12/sgen-an-attempt-was-made-to-load-an-Assembly-with-an-incorrect -format-tfs-2010/

Au cas où cette page disparaîtrait à l’avenir, voici les étapes à suivre - 

  1. Dans Team Explorer, cliquez avec le bouton droit sur votre définition de construction et choisissez Ouvrir l'emplacement du fichier de processus.
  2. Double-cliquez sur le fichier XAML sélectionné.
  3. Dans le concepteur, sélectionnez le conteneur appelé Séquence (c'est le conteneur de niveau supérieur qui fait tout le reste).
  4. Dans la liste Arguments (généralement en bas), remplacez MSBuildPlatform à partir de Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.Auto en Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.X86.
  5. Enregistrez et fermez le fichier.
  6. Vérifiez le fichier dans TFS et essayez à nouveau votre construction.
15
Paul McLean

Le problème disparaît après l'installation du dernier SDK Windows , qui inclut la version 64 bits de sgen.exe:

http://msdn.Microsoft.com/en-us/windows/desktop/bg162891.aspx

Parfois (si cela n’aide pas) l’ancienne version aide:

http://msdn.Microsoft.com/en-us/windows/desktop/hh852363.aspx

Pour une raison quelconque, la version 64 bits de sgen n’est pas incluse dans les outils de compilation Microsoft Build

8
Louis Somers

J'ai rencontré la même erreur lorsque j'ai essayé de compiler mon projet (Platform cible est défini sur x86) dans Release. Il a bien compilé dans Debug. Je suis arrivé à découvrir que dans Release, Generate serialization Assembly est exécuté; d'où l'appel à l'utilitaire SGen. Le problème était que MSBuild a appelé la version x64 de SGen contre mon EXE x86, qui a généré l'erreur. J'ai dû passer cet argument MSBuild pour que MSBuild utilise la version correcte de SGen:

/p:SGenToolPath="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools"
5
TDN

J'ai trouvé ce problème pertinent: https://github.com/dotnet/sdk/issues/1630

En attendant que cela soit corrigé dans une future version, j'ai pu résoudre le problème en ajoutant deux cibles au fichier csproj, comme suggéré par 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>
5
Ola Eldøy

Dans mon cas, cette erreur était due non à une combinaison non valide de paramètres x86/x64, mais à une tentative de construction d'un projet ciblant une version spécifique du framework .NET (v4.5.1) dont les assemblys de référence n'avaient pas été installés sur le serveur de génération. .

La combinaison des deux conditions suivantes était responsable de l'erreur:

  1. Dans Visual Studio, sur la page Propriétés du projet, sous l'onglet Application, le "Cadre cible" était défini sur ".NET Framework 4.5.1";
  2. Sur le serveur de génération, dans le dossier C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework, un dossier nommé v4.5.1 était non présent. (D'autres dossiers portant des numéros de version, y compris les versions 3.5, 4.0 et v4.5, were present.)

Le correctif consistait à installer le Kit de développement logiciel Windows (SDK) pour Windows 8.1 sur le serveur de génération. Dans l'assistant d'installation, à l'étape "Sélectionnez les fonctionnalités que vous souhaitez installer", j'ai décoché toutes les cases, à l'exception de celle correspondant au "Kit de développement logiciel .NET Framework 4.5.1".

L'exécution de cette installation a provoqué la création du dossier v4.5.1 manquant du dossier Assemblies\Microsoft\Framework.NETFramework et à l'exécution de la génération.

3
Jon Schneider

J'avais un problème similaire, voyant l'erreur "format incorrect" de SGEN lors de la création de VS ou de MSBuild à partir de la ligne de commande. Mon projet est x64, mais MSBuild a insisté pour utiliser la version 32 bits de l'outil. (Certains de mes pairs travaillent autour de cela en construisant dans VS 2015, mais je n'ai que VS 2017 installé et je souhaite que cela continue.)

Au vu de la sortie de la génération de diagnostics, SGEN s’exécute à partir du répertoire nommé par son paramètre SdkToolsPath (pour moi: C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\). Ceci est attribué à partir de TargetFrameworkSDKToolsDirectory. En regardant les fichiers cibles, cela provient de SDK40ToolsPath. Et cela est défini à partir du fichier .config de MSBuild.

J'ai résolu ce problème en modifiant C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe.config (requiert le privilège Admin), en définissant la propriété SDK40ToolsPath à l'aide de

<property name="SDK40ToolsPath" value="$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.6.2\WinSDK-NetFx40Tools-x64', 'InstallationFolder', null, RegistryView.Registry32))" />

(Remarque: si vous recherchez ce chemin dans le registre sur un système d'exploitation 64 bits, accédez à HKLM\SOFTWARE\WOW6432Node\Microsoft ...)

Le principal changement est, bien sûr, de x86 à x64 pour utiliser les outils 64 bits. J'ai également changé le cadre pour qu'il soit ce que nous utilisons (4.6.2). Ceci may signifie que nous ne pouvons utiliser de manière fiable que des outils pour les projets 64 bits et pour ce cadre, avec ce changement. Néanmoins, j'espère que cela pourra aider quelqu'un qui se heurte à ce problème. (Je suis choqué et consterné. MSBuild ne modifie pas automatiquement le chemin des outils en fonction de Framework & Architecture.)

0
Keith Robertson

Dans mon cas, la solution a été compilée correctement dans Debug, mais il y a eu une erreur Release dans un seul projet.

Utilisation de cette https://social.msdn.Microsoft.com/Forums/en-US/13d3cc7a-88dc-476c-8a15-fa2d4c59e5aa/sgen-an-attempt-was-made-toload-an-Assembly- avec un format incorrect? forum = netfx64bit , j'ai changé le projet PlatformTarget qui avait des problèmes avec x86 pour Any CPU.

J'ai maintenu la solution avec Mixed Platform et il était possible de compiler dans Release

0
Rodolfo Gaspar

J'ai mis à niveau un projet de la version 4.0 à la version 4.5.2 et installé le pack de développement Microsoft .NET Framework 4.5.2 sur le serveur de génération. Après cela a fonctionné. Vous avez un pack de développement pour toutes les autres versions .net.

https://support.Microsoft.com/en-us/help/2901951/the-Microsoft--net-framework-4-5-2-developer-pack-for-windows-server-2

0
fedda

J'ai eu le même problème et l'affichage de l'écran de sortie m'a donné plus de détails. A partir de là, j'ai trouvé que le cadre cible était plus élevé que ce qui était autorisé pour ce type de projet (je construisais un projet SQL Server CLR). Le cadre cible dans le projet a été défini à 4.0. Remettre ce retour à 3.5 corrigeait le problème pour moi.

Dave

0
David Wiltcher