为什么MSBuild将* .XmlSerializers.dll程序集放在已发布的Web应用程序的根文件夹中?

时间:2010-01-21 02:17:27

标签: asp.net msbuild xml-serialization

我有一个构建过程,它使用我的VS 2008 .NET 2.0 ASP.NET项目并使用MSBuild构建它。该项目包含ASPX文件和Web服务,还连接到另一个Web服务;)

除了MSBuild将* .XmlSerializers.dll程序集文件放入_PublishedWebsites \ MySite文件夹而不是_PublishedWebsites \ MySite \ bin之外,所有内容似乎都运行良好,就像它与其他dll一样。

* .XmlSerializers.dll程序集文件不在bin文件夹中是否重要?

或者我应该在MSBuild完成后使用我的构建过程将* .XmlSerializers.dll程序集复制到bin文件夹中吗?

2 个答案:

答案 0 :(得分:6)

除非您要从程序集中序列化和反序列化类型,否则不需要此程序集。编译器生成此程序集,以使应用程序在启动并运行后不必生成它。

如果您打算进行序列化,请保留程序集,因为它有助于提高性能。如果您不打算进行任何序列化,请随意忽略它或完全删除它。

有关此做法的详情,请参阅XML Serializer Generator Tool

  

XML Serializer Generator创建   一个XML序列化程序集   按顺序在指定程序集中键入   提高启动性能   串行化时的XmlSerializer或   反序列化指定的对象   类型。

答案 1 :(得分:2)

是的,XmlSerializers程序集不在bin目录中并不重要。使用Fusion Log Viewer我确认我怀疑DLL在Web应用程序根目录中没有被加载。

要更正此问题,您可以添加将文件移动到正确位置的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>

注意:如果您正在从同一目录构建和运行Web应用程序(通常是在开发计算机上本地运行的情况)并且将项目设置“生成序列化程序集”设置为“开”,则会生成文件在bin目录中。这就是我在这种情况下将任务配置为不执行的原因。

我可以简单地确保该文件存在,但是我想确保构建失败,如果由于某种原因文件在集成构建期间不在预期的位置。