在.NET 3.5 Web应用程序的ASP.NET预编译期间,在类型初始值设定项中执行各种初始化。当环境配置不正确时,其中一个类型初始值设定项会抛出自定义异常。但是,当我们抛出自定义异常时,aspnet_compiler.exe会告诉我们:
[exec] error ASPRUNTIME: Type is not resolved for member 'App.Project.CustomException,App.Project, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
[exec]
[exec] [SerializationException]: Type is not resolved for member 'App.Project.CustomException,App.Project, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
[exec] at System.Web.Compilation.BuildManagerHost.PrecompileApp(ClientBuildManagerCallback callback)
[exec] at System.Web.Compilation.ClientBuildManager.PrecompileApplication(ClientBuildManagerCallback callback, Boolean forceCleanBuild)
[exec] at System.Web.Compilation.ClientBuildManager.PrecompileApplication(ClientBuildManagerCallback callback)
[exec] at System.Web.Compilation.Precompiler.Main(String[] args)
请注意,不包含“真实”堆栈跟踪信息。但是,当我更改我们的代码以抛出InvalidOperationException(而不是我们的自定义异常)时,正确包含堆栈跟踪。 (另外,我们的CustomException类型使用[Serializable]注释。当我们删除[Serializable]注释时,aspnet_compiler.exe以不同的方式抱怨 - 我们的自定义异常没有标记为这样。)
有谁知道为什么在ASP.NET预编译期间抛出自定义异常会导致辅助SerializationException?为什么要尝试序列化异常?同样,为什么使用BCL InvalidOperationException 而不是导致辅助SerializationException?
这可能是因为aspnet_compiler.exe试图对意外异常进行某种反思吗? (因为它没有加载我们的App.Project程序集,它无法解析类型?)
答案 0 :(得分:3)
aspnet_compiler.exe程序似乎使用.NET Remoting与ASP.NET运行时通信。当ASP.NET运行时抛出我的自定义异常时,aspnet_compiler.exe无法反序列化它,因为它无法解析自定义异常的类型,因为我的App.Project程序集不在GAC中,也不能通过路径搜索到aspnet_compiler.exe
为了测试这个假设,我将App.Project程序集复制到与aspnet_compiler.exe相同的目录(C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727)并执行预编译。当抛出自定义异常时,它会出现我期望的正常堆栈跟踪,并且不会发生SerializationException。