Msbuild 发布网站,aspnet_编译器空引用异常
我无法通过命令行发布解决方案。它在不同的项目上间歇性地失败,但常常成功。我得到了空引用错误和“运行线程的应用程序域已被卸载”,这可能只是带有竞争条件的空引用。它似乎只在具有web服务的项目上失败(原始的.asmx和带有.svc或无文件激活的WCF)。它有时成功的事实让我认为这不是我们的代码的问题,尽管我们可以做一些更改来缓解根本原因(不管是什么) 我尝试/检查的内容:Msbuild 发布网站,aspnet_编译器空引用异常,msbuild,aspnet-compiler,Msbuild,Aspnet Compiler,我无法通过命令行发布解决方案。它在不同的项目上间歇性地失败,但常常成功。我得到了空引用错误和“运行线程的应用程序域已被卸载”,这可能只是带有竞争条件的空引用。它似乎只在具有web服务的项目上失败(原始的.asmx和带有.svc或无文件激活的WCF)。它有时成功的事实让我认为这不是我们的代码的问题,尽管我们可以做一些更改来缓解根本原因(不管是什么) 我尝试/检查的内容: 我运行了tfpt scorch来清除任何本地更改,包括构建输出,但没有成功,所以我知道源目录没有问题 我清除了C:\Windo
- 我运行了
来清除任何本地更改,包括构建输出,但没有成功,所以我知道源目录没有问题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_代码文件夹
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
,如果要解决此问题,我会尽可能地将其隔离,因此计划如下
我认为可能的原因如下:
希望这会有所帮助,但可以肯定的是,所有这些步骤都需要作出重大努力,以孤立问题;但在大多数情况下,将特定问题孤立起来可以解决问题的很大一部分 删除
-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);
}