Создание сборки сериализации Xml как части моей сборки
этот код создает исключение FileNotFoundException, но в конечном итоге работает без проблем:
void ReadXml()
{
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
//...
}
вот исключение:
первое случайное исключение типа "System.IO.FileNotFoundException" произошло в mscorlib.dll
дополнительная информация: не удалось загрузить файл или сборку ' MyAssembly.XmlSerializers, Version=1.4.3190.15950, Culture=neutral, PublicKeyToken=null ' или одна из его зависимостей. Система не может найти файл указанный.
похоже, что платформа автоматически создает сборку сериализации, если она не найдена. Я могу создать его вручную с помощью sgen.exe, что облегчает исключение.
как заставить visual studio автоматически создавать сборку сериализации XML?
обновление: сборка создания сериализации: при настройке, похоже, ничего не делает.
8 ответов:
вот как мне удалось это сделать, изменив сценарий MSBUILD в моем.CSPROJ файл:
во-первых, открыть свой .CSPROJ файл как файл, а не как проект. Прокрутите до конца файла, пока не найдете этот закомментированный код, непосредственно перед закрытием тега проекта:
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. <Target Name="BeforeBuild"> </Target> <Target Name="AfterBuild"> </Target> -->теперь мы просто вставляем нашу собственную цель AfterBuild, чтобы удалить любой существующий XmlSerializer и SGen наш собственный, например:
<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)"> <!-- Delete the file because I can't figure out how to force the SGen task. --> <Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" /> <SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(TargetFrameworkSDKToolsDirectory)" Platform="$(Platform)"> <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" /> </SGen> </Target>это работает для меня.
как объяснил Мартин в ответ, включение генерации сборки сериализации через свойства проекта недостаточно, потому что задача SGen добавляет
/proxytypesпереключиться на sgen.командной строки exe-файла.Microsoft имеет документированное свойство MSBuild что позволяет отключить
/proxytypesпереключается и вызывает задачу SGen для создания сборок сериализации, даже если нет прокси-типов в собрание.SGenUseProxyTypes
логическое значение, указывающее, являются ли типы прокси должен быть сгенерирован SGen.исполняемый. Цель SGen использует это свойство для установите флаг UseProxyTypes. Это свойство по умолчанию имеет значение true, и там нет пользовательского интерфейса, чтобы изменить это. Чтобы создать сборку сериализации типы, отличные от webservice, добавьте это свойство в файл проекта и установите его значение false перед импортом Microsoft.Общий.Цели или C# / VB.цели
как следует из документации, вы должны изменить файл проекта вручную, но вы можете добавить
SGenUseProxyTypesсвойства конфигурации для создания. Конфигурация файлов проекта будет выглядеть примерно так:<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <!-- Snip... --> <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies> <SGenUseProxyTypes>false</SGenUseProxyTypes> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <!-- Snip... --> <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies> <SGenUseProxyTypes>false</SGenUseProxyTypes> </PropertyGroup>
другие ответы на этот вопрос уже упоминали свойства проекта- > Build ->Создание Сборок Сериализации установка, но по умолчанию это будет генерировать только сборку, если есть " типы прокси веб-службы XML" в проекте.
лучший способ понять точное поведение Visual Studio-изучить GenerateSerializationAssemblies цель в C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 * * Microsoft. Common.targets** файл.
вы можете проверить результат этой задачи сборки из Visual Studio выход
создание нового определения задачи 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 по умолчанию только для прокси-типов генерирует для "любого процессора". Это происходит, если вы не устанавливаете соответствующие переменные в файле проекта.
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 путь\Майкрософт.Чистая\рамки\В4.0.30319\Майкрософт.Используется CSharp.цели
чтобы увидеть недокументированные переменные, такие как $(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>
в случае, если кто-то еще столкнется с этой проблемой внезапно после того, как все работало нормально раньше: для меня это было связано с тем, что флажок "Включить только мой код (только управляемый)" был снят в меню параметров (параметры - > отладка) (который был автоматически отключен после установки .NET Reflector).
изменить: То есть, конечно, это исключение происходило раньше, но когда" включить только мой код " выключен, помощник по отладке (если он включен) остановится на этом момент, когда брошен.
Я немного опоздал на вечеринку, но я нашел предыдущий ответ трудным для работы. В частности, Visual Studio будет аварийно завершать работу всякий раз, когда я пытался просмотреть свойства моего проекта. Я думаю, это было связано с тем, что он больше не понимал, как прочитать файл csproj. То, что сказал...
добавьте в командную строку события после сборки следующее:
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sgen.exe" "$(TargetPath)" /forceэто будет использовать sgen.исполняемые непосредственно перестроить сборку сериализации XML каждый раз, когда вы строите ваш проект для отладки или выпуска.
посмотреть в свойствах на решение. На вкладке сборка в нижней части есть выпадающий список под названием "создать сборку сериализации"
немного отличается от решения, предоставленного резервная копия мозга может быть, чтобы непосредственно указать цель платформы прямо там, где вы должны использовать его так:
<!-- Check the platform target value and if present use that for a correct *.XmlSerializer.dll platform setup (default is MSIL)--> <PropertyGroup Condition=" '$(PlatformTarget)'=='' "> <SGenPlatform>$(Platform)</SGenPlatform> </PropertyGroup> <PropertyGroup Condition=" '$(PlatformTarget)'!='' "> <SGenPlatform>$(PlatformTarget)</SGenPlatform> </PropertyGroup> <!-- Delete the file because I can't figure out how to force the SGen task. --> <Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" /> <SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)" SdkToolsPath="$(TargetFrameworkSDKToolsDirectory)" EnvironmentVariables="$(SGenEnvironment)" Platform="$(SGenPlatform)"> <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" /> </SGen>
Comments