La création d'une nouvelle définition de tâche sgen casse une mouche sur la roue. Il suffit de définir les variables nécessaires pour que la tâche fonctionne comme prévu. De toute façon, la documentation de Microsoft manque 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 )
-
Dans Visual Studio 2010, dans l'Explorateur de solutions, cliquez avec le bouton droit de la souris sur le projet pour lequel vous souhaitez générer des assemblages de sérialisation, puis cliquez sur Décharger le projet.
-
Dans l'Explorateur de solutions, cliquez avec le bouton droit de la souris sur le projet pour lequel vous souhaitez générer des assemblages de sérialisation, puis cliquez sur Modifier .csproj.
-
Dans le fichier .csproj, immédiatement après l'élément <TargetFrameworkVersion>v?.?</TargetFrameworkVersion>
ajoutez les éléments suivants :
<SGenUseProxyTypes>false</SGenUseProxyTypes>
<SGenPlatformTarget>$(Platform)</SGenPlatformTarget>
-
Dans le fichier .csproj, dans chaque configuration de plateforme
par exemple <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
ajoutez la ligne suivante :
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
-
Enregistrez et fermez le fichier .csproj.
-
Dans l'explorateur de solutions, cliquez à droite sur le projet que vous venez de modifier, puis cliquez sur Recharger le projet.
Cette procédure génère un assemblage supplémentaire nommé .xmlSerializers.dll dans votre dossier de sortie. Vous devrez déployer cet assemblage avec votre solution.
Explication
SGen par défaut uniquement 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 nécessaire pour correspondre à votre PlatformTarget. J'ai tendance à penser qu'il s'agit d'un bug dans le modèle de projet. Pourquoi la plateforme cible de sgen devrait-elle être différente de celle de votre projet ? Si c'est le cas, vous obtiendrez une exception d'exécution.
0x80131040 : La définition du manifeste de l'assemblage localisé ne correspond pas à la référence de l'assemblage.
Vous pouvez localiser la définition de la tâche msbuild en analysant votre fichier de projet :
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
où le MSBuildToolsPath dépend de votre <TargetFrameworkVersion>
http://msdn.microsoft.com/en-us/library/bb397428.aspx
Regardez dans la définition de la tâche SGen pour TargetFrameworkVersion 4.0 de
Chemin d'installation de Windows \Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets
pour voir les variables non documentées comme $(SGenPlatformTarget) que vous êtes libre de définir dans votre fichier de projet.
<Target
Name="GenerateSerializationAssemblies"
Condition="'$(_SGenGenerateSerializationAssembliesConfig)' == 'On' or ('@(WebReferenceUrl)'!='' and '$(_SGenGenerateSerializationAssembliesConfig)' == 'Auto')"
DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource"
Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)"
Outputs="$(IntermediateOutputPath)$(_SGenDllName)">
<SGen
BuildAssemblyName="$(TargetFileName)"
BuildAssemblyPath="$(IntermediateOutputPath)"
References="@(ReferencePath)"
ShouldGenerateSerializer="$(SGenShouldGenerateSerializer)"
UseProxyTypes="$(SGenUseProxyTypes)"
KeyContainer="$(KeyContainerName)"
KeyFile="$(KeyOriginatorFile)"
DelaySign="$(DelaySign)"
ToolPath="$(SGenToolPath)"
SdkToolsPath="$(TargetFrameworkSDKToolsDirectory)"
EnvironmentVariables="$(SGenEnvironment)"
SerializationAssembly="$(IntermediateOutputPath)$(_SGenDllName)"
Platform="$(SGenPlatformTarget)"
Types="$(SGenSerializationTypes)">
<Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly"/>
</SGen>
</Target>