Msbuild 发布网站,aspnet_编译器空引用异常

Msbuild 发布网站,aspnet_编译器空引用异常,msbuild,aspnet-compiler,Msbuild,Aspnet Compiler,我无法通过命令行发布解决方案。它在不同的项目上间歇性地失败,但常常成功。我得到了空引用错误和“运行线程的应用程序域已被卸载”,这可能只是带有竞争条件的空引用。它似乎只在具有web服务的项目上失败(原始的.asmx和带有.svc或无文件激活的WCF)。它有时成功的事实让我认为这不是我们的代码的问题,尽管我们可以做一些更改来缓解根本原因(不管是什么) 我尝试/检查的内容: 我运行了tfpt scorch来清除任何本地更改,包括构建输出,但没有成功,所以我知道源目录没有问题 我清除了C:\Windo

我无法通过命令行发布解决方案。它在不同的项目上间歇性地失败,但常常成功。我得到了空引用错误和“运行线程的应用程序域已被卸载”,这可能只是带有竞争条件的空引用。它似乎只在具有web服务的项目上失败(原始的.asmx和带有.svc或无文件激活的WCF)。它有时成功的事实让我认为这不是我们的代码的问题,尽管我们可以做一些更改来缓解根本原因(不管是什么)

我尝试/检查的内容:

  • 我运行了
    tfpt scorch
    来清除任何本地更改,包括构建输出,但没有成功,所以我知道源目录没有问题
  • 我清除了
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET文件中的临时文件(我们使用的是32位文件),似乎有进一步的进展,但仍然存在问题。在另一次发布之后,目录仍然是空的,因此可能不相关
  • 使用Process Monitor,我发现
    aspnet\u编译器
    正在写入
    %LocalAppData%\Temp\Temporary ASP.NET文件
    。清除这些文件有时似乎有效,也许我运气好,但后来又开始失败。我没有发现其他可能相关的东西
  • 确保我有足够的内存,似乎没有什么不同
  • 运行msbuild单线程,没有区别
  • 从命令行运行aspnet_编译器(从MSBuild日志输出获取命令),始终成功
  • 没有压缩文件夹
  • 我使用的是最新的稳定的Visual Studio(VS 2013 update 2),但这并不重要,因为我是从命令行运行的,并且使用的可执行文件位于framework目录中
  • 某些失败的项目中没有App_代码文件夹
构建输出没有提供任何好的信息,所以我将DebugDiag设置为在崩溃时输出。结果如下:

DetailID = 1
    Count:    1
    Type:     System.NullReferenceException
    Message:  
    Stack:    
        System.Web.Compilation.DiskBuildResultCache.CacheBuildResult(System.String, System.Web.Compilation.BuildResult, Int64, System.DateTime)
        System.Web.Compilation.BuildManager.CacheBuildResultInternal(System.String, System.Web.Compilation.BuildResult, Int64, System.DateTime)
        System.Web.Compilation.WebDirectoryBatchCompiler.CacheAssemblyResults(System.Web.Compilation.AssemblyBuilder, System.CodeDom.Compiler.CompilerResults)
        System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder(System.Web.Compilation.AssemblyBuilder)
        System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilderParallel(System.Collections.ICollection)
        System.Web.Compilation.WebDirectoryBatchCompiler.CompileNonDependentBuildProviders(System.Collections.ICollection)
        System.Web.Compilation.WebDirectoryBatchCompiler.Process()
        System.Web.Compilation.BuildManager.BatchCompileWebDirectoryInternal(System.Web.Hosting.VirtualDirectory, Boolean)
        System.Web.Compilation.BuildManager.BatchCompileWebDirectory(System.Web.Hosting.VirtualDirectory, System.Web.VirtualPath, Boolean)
        System.Web.Compilation.BuildManager.PrecompileWebDirectoriesRecursive(System.Web.Hosting.VirtualDirectory, Boolean)
        System.Web.Compilation.BuildManager.PrecompileAppInternal(System.Web.VirtualPath, System.Collections.Generic.IEnumerable`1<System.String>)
        System.Web.Compilation.BuildManager.PrecompileApp(System.Web.VirtualPath, System.Collections.Generic.IEnumerable`1<System.String>)
        System.Web.Compilation.BuildManager.PrecompileApp(System.Web.Compilation.ClientBuildManagerCallback, System.Collections.Generic.IEnumerable`1<System.String>)
        System.Web.Compilation.BuildManagerHost.PrecompileApp(System.Web.Compilation.ClientBuildManagerCallback, System.Collections.Generic.List`1<System.String>)
        [GCFrame]
        [GCFrame]
        [ContextTransitionFrame]
        [GCFrame]
        [GCFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [TPMethodFrame]
        *** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Web\3d247ccfb800c38a29cf91c27a6339da\System.Web.ni.dll
        Module load completed but symbols could not be loaded for C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Web\3d247ccfb800c38a29cf91c27a6339da\System.Web.ni.dll
        System.Web.Compilation.ClientBuildManager.PrecompileApplication(System.Web.Compilation.ClientBuildManagerCallback)
        *** ERROR: Module load completed but symbols could not be loaded for C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe
        [GCFrame]


DetailID = 2
    Count:    1
    Type:     System.NullReferenceException
    Message:  Object reference not set to an instance of an object.
    Stack:    
        [GCFrame]
        [GCFrame]
        [GCFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [GCSafeCollectionFrame]
        [TPMethodFrame]
        System.Web.Compilation.ClientBuildManager.PrecompileApplication(System.Web.Compilation.ClientBuildManagerCallback, Boolean)
        System.Web.Compilation.ClientBuildManager.PrecompileApplication(System.Web.Compilation.ClientBuildManagerCallback)
        System.Web.Compilation.Precompiler.Main(System.String[])
        [GCFrame]
以下是一些控制台输出(重定向到文件):

因此,正如您所看到的,msbuild诊断输出没有多大帮助

编辑2: 试着看看我是否可以调试
aspnet\u编译器
,以进一步阐明这一点。我启动了
gflags.exe
以启用自动附加到调试器。我能够中断
NullReferenceException
,但加载
System.Web
的符号时遇到问题。它来自
C:\Windows\Microsoft.Net\assembly\GAC\u 32\System.Web\v4.0\u 4.0.0\uu b03f5f7f11d50a3a\System.Web.dll

从堆栈跟踪来看,此方法失败:

internal override void CacheBuildResult(string cacheKey, BuildResult result, long hashCode, DateTime utcStart)
{
  if (!result.CacheToDisk)
    return;
  if (HostingEnvironment.ShutdownInitiated)
  {
    BuildResultCompiledAssemblyBase compiledAssemblyBase = result as BuildResultCompiledAssemblyBase;
    if (compiledAssemblyBase == null)
      return;
    this.MarkAssemblyAndRelatedFilesForDeletion(compiledAssemblyBase.ResultAssembly.GetName().Name);
  }
  else
    new PreservationFileWriter(this.PrecompilationMode).SaveBuildResultToFile(this.GetPreservedDataFileName(cacheKey), result, hashCode);
}

因此,其中任何一个都可能为null并导致异常:
result
HostingEnvironment
compiledAssemblyBase
,如果要解决此问题,我会尽可能地将其隔离,因此计划如下

我认为可能的原因如下:

  • 建筑环境

  • 建造程序

  • 编译错误

  • 太复杂的源代码/项目结构

  • 在像您这样的大多数复杂情况下,所有因素都起作用,因此尝试逐个隔离原因可能会有所帮助,或者至少可能会显示更容易修复和继续的其他/新错误

    建筑环境

    您可以尝试在其他机器上构建相同的项目,或者在其他机器上构建相同的项目(所谓构建,我指的是从命令行解决您的任务-发布网站)。如果您将遇到相同的问题—它没有显示任何内容,但如果其他环境正常(或至少其中一个),那么您肯定会遇到环境问题

    它可以是任何东西-.Net版本和/或修复程序、操作系统版本、命令行的路径变量使用不正确的框架、本地项目的路径中的空格-无论什么,但如果您能使它在其他机器上工作,您将知道您需要查看构建过程,而不是其他内容

    您可以尝试构建任何示例项目,以确保可以发布简单的项目

    建造程序

    看起来您已经隔离了发布步骤中的问题,但是您可以尝试稍微处理一下-只执行编译而不发布,或者在现有二进制文件/发布文件夹上运行发布目标等-您需要尝试隔离失败的特定步骤(如果有),排除对其他构建步骤的依赖关系

    很可能这不会有什么帮助,因为我预计整个过程都会失败——但谁知道呢

    编译器错误

    这一个与下一个密切相关。如果您的情况可能的话,您可以尝试在VS2012而不是VS2013上构建

    太复杂的源代码/项目结构

    预构建解决方案中的所有项目,并使用对结果DLL的引用,而不是对项目的引用。如果一切正常-逐个返回项目源代码,这样您至少可以了解哪个项目导致编译器失败

    当/如果您隔离了一个项目,那么您可以尝试将其部分编译为单独的DLL,在某些情况下,您可能会意识到某些特定的代码构造/标记应该重写以满足编译器的要求

    如果问题出现在web project或其他某些项目类型中,而这些项目类型无法编译为单个DLL,则可以尝试“关闭”整个项目部分,例如,排除带有网页的多个文件夹并检查结果


    希望这会有所帮助,但可以肯定的是,所有这些步骤都需要作出重大努力,以孤立问题;但在大多数情况下,将特定问题孤立起来可以解决问题的很大一部分

    删除
    -u
    选项应该会起作用,因为它对我很有用。

    我知道这是一篇老文章,但以防万一有人会发现它有用:

    Target "AspNetPreCompile: (TargetId:3773)" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web\Transform\Microsoft.Web.Publishing.AspNetCompileMerge.targets" from project "C:\Source\Project\Project.csproj" (target "PipelineAspNetCompileMergePhase" depends on it):
    Task "AspNetCompiler" (TaskId:2474)
      Task Parameter:PhysicalPath=C:\Source\Project\obj\x86\Release\AspnetCompileMerge\Source (TaskId:2474)
      Task Parameter:TargetPath=C:\Source\Project\obj\x86\Release\AspnetCompileMerge\TempBuildDir (TaskId:2474)
      Task Parameter:VirtualPath=/ (TaskId:2474)
      Task Parameter:Debug=False (TaskId:2474)
      Task Parameter:Updateable=False (TaskId:2474)
      Task Parameter:ToolPath=C:\Windows\Microsoft.NET\Framework\v4.0.30319 (TaskId:2474)
    
      C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p C:\Source\Project\obj\x86\Release\AspnetCompileMerge\Source C:\Source\Project\obj\x86\Release\AspnetCompileMerge\TempBuildDir  (TaskId:2474)
      Microsoft (R) ASP.NET Compilation Tool version 4.0.30319.34209 (TaskId:2474)
      Utility to precompile an ASP.NET application (TaskId:2474)
      Copyright (C) Microsoft Corporation. All rights reserved. (TaskId:2474)
       (TaskId:2474)
    ASPNETCOMPILER : error ASPRUNTIME: Object reference not set to an instance of an object. [C:\Source\Project\Project.csproj]
      The command exited with code 1. (TaskId:2474)
    
    Done executing task "AspNetCompiler" -- FAILED. (TaskId:2474)
    Done building target "AspNetPreCompile" in project "Project.csproj" -- FAILED.: (TargetId:3773)
    
    internal override void CacheBuildResult(string cacheKey, BuildResult result, long hashCode, DateTime utcStart)
    {
      if (!result.CacheToDisk)
        return;
      if (HostingEnvironment.ShutdownInitiated)
      {
        BuildResultCompiledAssemblyBase compiledAssemblyBase = result as BuildResultCompiledAssemblyBase;
        if (compiledAssemblyBase == null)
          return;
        this.MarkAssemblyAndRelatedFilesForDeletion(compiledAssemblyBase.ResultAssembly.GetName().Name);
      }
      else
        new PreservationFileWriter(this.PrecompilationMode).SaveBuildResultToFile(this.GetPreservedDataFileName(cacheKey), result, hashCode);
    }