Génération d’un assembly de sérialisation Xml dans le cadre de ma génération

Ce code produit une exception FileNotFoundException, mais s’exécute finalement sans problème:

void ReadXml() { XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); //... } 

Voici l’exception:


Une première exception au hasard de type ‘System.IO.FileNotFoundException’ s’est produite dans mscorlib.dll

Informations supplémentaires: Impossible de charger le fichier ou l’assembly ‘MyAssembly.XmlSerializers, Version = 1.4.3190.15950, Culture = neutral, PublicKeyToken = null’ ou l’une de ses dépendances. Le système ne peut pas trouver le fichier spécifié.


Il semble que le framework génère automatiquement l’assembly de sérialisation s’il n’est pas trouvé. Je peux le générer manuellement en utilisant sgen.exe, ce qui allège l’exception.

Comment puis-je obtenir Visual Studio pour générer l’assembly de sérialisation XML automatiquement?


Mise à jour: l’assemblage Generate Serialization Assembly: On ne semble rien faire.

Voici comment j’ai réussi à le faire en modifiant le script MSBUILD dans mon fichier .CSPROJ:

Tout d’abord, ouvrez votre fichier .CSPROJ en tant que fichier plutôt qu’en tant que projet. Faites défiler jusqu’au bas du fichier jusqu’à ce que vous trouviez ce code commenté, juste avant la fermeture de la balise Project:

  

Maintenant, nous venons d’insérer notre propre cible AfterBuild pour supprimer tous les XmlSerializer et SGen existants, comme ceci:

        

Ça marche pour moi.

Comme Martin l’a expliqué dans sa réponse , activer la génération de l’assemblage de sérialisation via les propriétés du projet n’est pas suffisant car la tâche SGen ajoute le commutateur /proxytypes à la ligne de commande sgen.exe.

Microsoft possède une propriété documentée MSBuild qui vous permet de désactiver le commutateur /proxytypes et provoque la tâche SGen pour générer les assemblys de sérialisation même s’il n’y a pas de types de proxy dans l’assembly.

SGenUseProxyTypes

Une valeur booléenne indiquant si les types de proxy doivent être générés par SGen.exe. La cible SGen utilise cette propriété pour définir l’indicateur UseProxyTypes. Cette propriété est définie par défaut sur true et il n’y a pas d’interface utilisateur pour modifier cela. Pour générer l’assembly de sérialisation pour les types non-webservice, ajoutez cette propriété au fichier de projet et définissez-la sur false avant d’importer les fichiers Microsoft.Common.Targets ou C # / VB.targets.

Comme le suggère la documentation, vous devez modifier votre fichier de projet manuellement, mais vous pouvez append la propriété SGenUseProxyTypes à votre configuration pour activer la génération. Votre configuration de fichiers de projet finirait par ressembler à ceci:

    On false    On false  

Les autres réponses à cette question ont déjà mentionné le paramètre Propriétés du projet-> Construire-> Générer des assemblys de sérialisation mais, par défaut, cela générera uniquement l’assembly s’il existe des ” types de proxy de service Web XML ” dans le projet.

La meilleure façon de comprendre le comportement exact de Visual Studio consiste à examiner la cible GenerateSerializationAssemblies dans le fichier C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 ** Microsoft.Common.targets **.

Vous pouvez vérifier le résultat de cette tâche de construction à partir de la fenêtre Sortie de Visual Studio et sélectionner Générer à partir de la liste déroulante Afficher la sortie de :. Vous devriez voir quelque chose comme

C: \ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \ bin \ sgen.exe /assembly:D:\Temp\LibraryA\obj\Debug\LibraryA.dll / proxytypes / reference: .. / comstackr: / delayign- LibraryA -> D: \ Temp \ LibraryA \ bin \ Debug \ LibraryA.dll

Le point clé ici est le commutateur / proxytypes . Vous pouvez lire sur les différents commutateurs de l’ outil XML Serializer Generator Tool (Sgen.exe)

Si vous êtes familier avec MSBuild, vous pouvez personnaliser la cible GenerateSerializationAssemblies pour que la tâche SGen ait un atsortingbut UseProxyTypes = “false” au lieu de true, mais vous devez alors assumer toutes les responsabilités associées à la personnalisation du système Visual Studio / MSBuild. Sinon, vous pouvez simplement étendre votre processus de compilation pour appeler SGen manuellement sans le commutateur / proxytypes.

Si vous lisez la documentation de SGen, il est clair que Microsoft souhaitait limiter l’utilisation de cette fonctionnalité. Compte tenu de la quantité de bruit sur ce sujet, il est assez clair que Microsoft n’a pas fait un excellent travail en documentant l’expérience de Visual Studio. Il existe même un élément Connect Feedback pour ce problème et la réponse n’est pas géniale.

créer une nouvelle définition de tâche sgen rompt une volée. Il suffit de définir les variables nécessaires pour que la tâche fonctionne comme prévu. Quoi qu’il en soit, la documentation de Microsoft ne contient pas d’informations importantes.

Étapes pour pré-générer des assemblages de sérialisation

(avec des parties de http://msdn.microsoft.com/en-us/library/ff798449.aspx )

  1. Dans Visual Studio 2010, dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet pour lequel vous souhaitez générer des assemblys de sérialisation, puis cliquez sur Décharger le projet.
  2. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet pour lequel vous souhaitez générer des assemblys de sérialisation, puis cliquez sur Modifier .csproj.
  3. Dans le fichier .csproj, immédiatement après l’ v?.? , ajoutez les éléments suivants:

    false $(Platform)

  4. Dans le fichier .csproj, dans chaque configuration de plate-forme

    Par exemple,

    ajoutez la ligne suivante:

    On

  5. Enregistrez et fermez le fichier .csproj.

  6. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet que vous venez de modifier, puis cliquez sur Recharger le projet.

Cette procédure génère un assembly supplémentaire nommé .xmlSerializers.dll dans votre dossier de sortie. Vous devrez déployer cet assemblage avec votre solution.


Explication

SGen par défaut que pour les types de proxy génère pour “Any CPU”. Cela se produit si vous ne définissez pas les variables correspondantes dans votre fichier de projet.

SGenPlatformTarget est requirejs pour correspondre à votre PlatformTarget. J’ai tendance à penser que c’est un bogue dans le modèle de projet. Pourquoi la plate-forme cible sgen devrait-elle être différente de celle de votre projet? Si c’est le cas, vous obtiendrez une exception à l’exécution

0x80131040: La définition du manifeste de l’assembly situé ne correspond pas à la référence de l’assembly

Vous pouvez localiser la définition de la tâche msbuild en analysant votre fichier de projet:

  

où MSBuildToolsPath dépend de votre http://msdn.microsoft.com/en-us/library/bb397428.aspx

Regardez dans la définition de tâche SGen pour TargetFrameworkVersion 4.0 depuis

Chemin d’installation de Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.CSharp.targets

pour voir les variables non documentées comme $ (SGenPlatformTarget), vous êtes libre de définir dans votre fichier de projet

      

Au cas où quelqu’un d’autre se heurterait soudainement à ce problème après que tout fonctionnait correctement avant: Pour moi, il fallait que la case “Activer mon code (géré uniquement)” ne soit pas cochée dans le menu des options (Options -> Débogage) éteint automatiquement après l’installation de .NET Reflector).

EDIT: Ce qui veut dire, bien sûr, que cette exception se produisait avant, mais quand “activer juste mon code” est désactivé, l’assistant de débogage (s’il est activé), s’arrêtera à ce stade lorsqu’il sera lancé.

Je suis un peu en retard à la fête, mais j’ai trouvé la réponse précédente difficile à travailler. Plus précisément, Visual Studio tomberait en panne à chaque fois que j’essayais d’afficher les propriétés de mon projet. Je pense que cela était dû au fait qu’il ne comprenait plus comment lire le fichier csproj. Cela dit…

Ajoutez ce qui suit à votre ligne de commande d’événement de post-construction:

 "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sgen.exe" "$(TargetPath)" /force 

Cela permettra d’exploiter directement sgen.exe pour reconstruire l’assembly de sérialisation Xml chaque fois que vous construisez votre projet pour Debug ou Release.

Regardez dans les propriétés de la solution. Sur l’onglet de construction en bas, il y a une liste déroulante appelée “Générer un assemblage de sérialisation”

Une solution légèrement différente de celle fournie par la sauvegarde du cerveau pourrait consister à spécifier directement la cible de la plate-forme là où vous devez l’utiliser comme suit:

   $(Platform)   $(PlatformTarget)