c# - ASP.NET 预编译期间出现类型解析错误

标签 c# asp.net remoting .net-remoting

在我们的 .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/

相关文章:

c# - 强制 DateTime.Parse 对于不变日期失败

c# - 从给定值的 ConcurrentDictionary 中删除键/值对

asp.net - 一个页面可以有多个ScriptManager吗?如果是的话,在什么条件下需要呢?

c# - 我应该为远程处理程序集强命名吗?

.net - Silverlight是否支持远程处理?

c# - 自动属性和结构

c# - 虚拟化统一网格

c# - 检查 HangFire.JobStorage 是否被实例化

javascript - JS 事件委托(delegate)对某些组件不起作用

scala - akka 远程处理(scala)中的死信