создание нового определения задачи sgen ломает муху на колесе. просто установите необходимые переменные, чтобы задача работала как задумано. В любом случае в документации Microsoft отсутствует важная информация.
Шаги для предварительной генерации сборок сериализации
(с деталями от http://msdn.microsoft.com/en-us/library/ff798449.aspx)
- В Visual Studio 2010 в обозревателе решений щелкните правой кнопкой мыши проект, для которого требуется создать сборки сериализации, и выберите команду «Выгрузить проект».
- В обозревателе решений щелкните правой кнопкой мыши проект, для которого вы хотите сгенерировать сборки сериализации, и выберите команду Изменить .csproj.
В файле .csproj сразу после элемента <TargetFrameworkVersion>v?.?</TargetFrameworkVersion>
добавьте следующие элементы:
<SGenUseProxyTypes>false</SGenUseProxyTypes>
<SGenPlatformTarget>$(Platform)</SGenPlatformTarget>
В файле .csproj, в каждой конфигурации платформы
например. <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
добавить следующую строку:
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
Сохраните и закройте файл .csproj.
- В обозревателе решений щелкните правой кнопкой мыши проект, который вы только что отредактировали, и выберите Обновить проект.
Эта процедура создает дополнительную сборку с именем .xmlSerializers.dll в вашей выходной папке. Вам нужно будет развернуть эту сборку вместе с вашим решением.
Объяснение
SGen по умолчанию только для типов прокси генерирует для «Any CPU». Это происходит, если вы не устанавливаете соответствующие переменные в файле проекта.
SGenPlatformTarget требуется для соответствия вашей PlatformTarget. Я склонен думать, что это ошибка в шаблоне проекта. Почему целевая платформа sgen должна отличаться от платформы вашего проекта? Если это произойдет, вы получите исключение времени выполнения
0x80131040: определение манифеста обнаруженной сборки не соответствует ссылке на сборку
Вы можете найти определение задачи msbuild, проанализировав файл проекта:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
где MSBuildToolsPath зависит от вашего <TargetFrameworkVersion>
http://msdn.microsoft.com/en-us/library/bb397428.aspx
Просмотр определения задачи SGen для TargetFrameworkVersion 4.0 от
Путь установки Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.CSharp.targets
чтобы увидеть недокументированные переменные, такие как $ (SGenPlatformTarget), которые вы можете установить в файле проекта
<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>