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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 21 января 2010

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

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

Подробнее об этой практике см. Генератор XML-сериализатора :

Генератор XML Serializer создает сборка XML-сериализации для вводит указанную сборку по порядку улучшить производительность запуска XmlSerializer при сериализации или десериализует объекты указанного типы.

2 голосов
/ 20 мая 2010

Да, важно, что сборка XmlSerializer не находится в каталоге 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>

Примечание. Если вы создаете и запускаете веб-приложение из одного каталога (как это обычно происходит при локальном запуске на компьютере разработчика) и для параметра проекта «Создать сборку сериализации» установлено значение «Вкл.», Файл создается в каталоге bin. Вот почему я настроил задачу, чтобы она не выполнялась в этом случае.

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

...