在我们的 .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 试图对意外异常进行某种反射(reflection)? (因此,由于它没有加载我们的 App.Project 程序集,它无法解析类型?)
最佳答案
似乎 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。
关于c# - ASP.NET 预编译期间出现类型解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5020503/