Почему MSBuild помещает блок *.XmlSerializers.dll в корневую папку опубликованного веб-приложения?

У меня есть процесс сборки, который берет мою.NET VS 2008 2,0 проекта ASP.NET и создает его с помощью MSBuild. Проект содержит файлы ASPX, плюс веб-сервис, и также соединяется с другим веб-сервисом ;)

Все, кажется, работает хорошо кроме MSBuild, помещает файл блока *.XmlSerializers.dll в папку _PublishedWebsites\MySite, а не в _PublishedWebsites\MySite\bin как он делает с другим dll.

Имеет значение, что файл блока *.XmlSerializers.dll не находится в папке мусорного ведра?

Или я должен использовать свой процесс сборки для копирования блока *.XmlSerializers.dll в папку мусорного ведра после того, как MSBuild закончился?

7
задан Matthew Lock 21 January 2010 в 02:52
поделиться

2 ответа

Вам не нужна эта сборка, если вы не будете сериализация и десериализующие типы от вашей сборки. Эта сборка генерируется компилятором для сохранения вашего приложения от необходимости создания его после его выполнения.

Если вы намереваетесь выполнять сериализацию, сохраните сборку по мере того, как она поможет с производительностью. Если вы не собираетесь делать какие-либо сериализации, то не стесняйтесь игнорировать его или вообще удалить его.

Для получения дополнительной информации об этой практике см. XML Serializer Generator Tool :

Генератор сериализатора XML создает Собрание сериализации XML для Типы в указанной сборке в порядке Улучшить производительность запуска XMLSerializer, когда он сериализации или десериализировать объекты указанного Типы.

6
ответ дан 7 December 2019 в 05:23
поделиться

Да, имеет значение, что сборка XmlSerializers не находится в каталоге bin. Используя Fusion Log Viewer, я подтвердил свое подозрение, что DLL не загружалась, когда она была оставлена в корне веб-приложения.

Чтобы исправить это, можно добавить цель AfterBuild, которая перемещает файл в нужное место. Я использую следующий фрагмент, но более новые версии MsBuild имеют задачу Move:

  <Target Name="AfterBuild">
    <!-- Don't do this when the final destination is the same as build destination (local builds) -->
    <Exec Command="move /Y &quot;$(WebProjectOutputDir)\$(AssemblyName).XmlSerializers.dll&quot; &quot;$(WebProjectOutputDir)\bin&quot;" Condition="'$(OutDir)' != '$(OutputPath)'"/>
  </Target>

Примечание: Если вы собираете и запускаете веб-приложение из одной и той же директории (как это обычно бывает при локальной работе на вашей машине разработки) и в настройках проекта "Generate serialization assembly" установлено значение On, файл будет создан в директории bin. Вот почему я настроил задачу так, чтобы она не выполнялась в этом случае.

Я мог бы просто убедиться в существовании файла, но я хотел убедиться, что сборка не будет выполнена, если по какой-то причине файл не окажется в нужном месте во время интеграционной сборки.

2
ответ дан 7 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: