Nel*_*mel 5 msbuild aspnet-compiler
我在通过命令行发布解决方案时遇到问题。它在各种项目上间歇性地失败,但是每一次都成功。我同时收到null引用错误和“正在卸载线程正在运行的应用程序域”,这可能只是带有竞争条件的null引用。它似乎仅在具有Web服务的项目上失败(原始的.asmx和带有.svc或无文件激活的WCF)。尽管有时可能会成功,但我认为我们的代码不是问题,尽管我们可以做一些更改以减轻根本原因(无论可能是什么)。
我尝试过/检查过的内容:
tfpt scorch清理所有本地更改,包括构建输出,但均未成功,因此我知道这不是源目录的问题。C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files(我们使用的是32位)上清除了临时文件,并且看起来还可以,但是仍然有问题。再次发布后,目录仍然为空,因此可能不相关。aspnet_compiler正在写信%LocalAppData%\Temp\Temporary ASP.NET Files。清除这些文件有时似乎奏效,或者也许我很幸运,但是随后又开始失败。我没有发现其他可能相关的东西。构建输出没有提供任何好的信息,因此我将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]
Run Code Online (Sandbox Code Playgroud)
我发现其他人也遇到类似的问题,但是他们要么没有得到答案,要么解决方案对我不起作用。还有其他想法吗?
编辑: 这是我正在使用的命令行:
"C:\Program Files (x86)\MSBuild\12.0\bin\MSBuild.exe" Solution.sln /t:Build /m:1 /p:Configuration=Prod /p:Platform="Mixed Platforms" /p:DeployOnBuild=true /p:PublishProfile=Prod /p:AutoParameterizationWebConfigConnectionStrings=false /v:diag > out.txt
Run Code Online (Sandbox Code Playgroud)
这是一些控制台输出(重定向到文件):
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)
Run Code Online (Sandbox Code Playgroud)
如您所见,msbuild诊断输出不是很有帮助。
编辑2:
尝试查看是否可以调试aspnet_compiler以进一步阐明这一点。我开始gflags.exe启用自动附加到调试器的功能。我可以中断,NullReferenceException但无法加载的符号System.Web。它来自C:\Windows\Microsoft.Net\assembly\GAC_32\System.Web\v4.0_4.0.0.0__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);
}
Run Code Online (Sandbox Code Playgroud)
因此,任何这些可能是空,导致异常:result,HostingEnvironment,compiledAssemblyBase。
如果我要解决这个问题,我会尽可能地隔离它,所以这是计划。
我认为可能有以下原因:
建筑环境
搭建流程
编译器错误
源代码/项目结构过于复杂
在像您这样的最复杂的情况下,所有因素都会一起发挥作用,因此尝试一一隔离原因可能会有所帮助,或者至少可能会显示其他/新的错误,这将更容易修复和继续。
建筑环境
您可以尝试在其他机器或其他机器上构建相同的项目(说构建我的意思是解决您的任务 - 从命令行发布网站)。如果您遇到同样的问题 - 它什么也没有显示,但如果其他环境正常(或至少其中之一) - 那么您肯定有环境问题。
它可以是任何东西 - .Net 版本和/或修复、操作系统版本、命令行的 PATH 变量使用不正确的框架、本地项目路径中的空格 - 无论如何,但如果你可以让它在其他机器上工作,那么你什么时候就会知道你需要研究构建过程而不是其他东西。
您可以尝试构建任何示例项目,以确保您可以发布简单的项目。
搭建流程
看起来您已经在发布步骤中隔离了该问题,但您可以尝试稍微玩一下 - 仅进行编译而不发布,或者在现有二进制文件/发布文件夹等上运行发布目标 - 您需要尝试隔离特定步骤(如果有)失败,排除对其他构建步骤的依赖。
这很可能不会有帮助,因为我预计整个过程会失败 - 但谁知道呢。
编译器错误
这一项与下一项密切相关。如果您的情况可行,您可以尝试在 VS2012 而不是 VS2013 上构建。
源代码/项目结构过于复杂
预构建解决方案中的所有项目,并使用对结果 DLL 的引用而不是对项目的引用。如果一切正常-一一返回项目源,以便您至少可以了解哪个项目导致编译器失败。
当/如果您隔离了一个项目,那么您可以尝试将其部分编译为单独的 DLL,并且在某些情况下您可能会意识到应该重写某些特定的代码构造/标记以满足编译器的要求。
如果问题出在 Web 项目或某些其他项目类型中,这些项目根本无法编译为单个 DLL,您可以尝试“关闭”项目的整个部分 - 例如,排除带有网页的多个文件夹并检查结果。
希望这会有所帮助,但可以肯定的是,所有这些步骤都需要付出巨大的努力才能隔离问题;但在大多数情况下,隔离特定问题可以解决问题的重要部分。
| 归档时间: |
|
| 查看次数: |
3254 次 |
| 最近记录: |