Ошибка разрешения типа во время предварительной компиляции ASP.NET - PullRequest
2 голосов
/ 16 февраля 2011

Во время предварительной компиляции ASP.NET нашего веб-приложения .NET 3.5 в инициализаторах типов выполняется различная инициализация.Один из инициализаторов типа генерирует пользовательское исключение, когда среда неправильно настроена.Однако, когда выдается наше пользовательское исключение, вот что 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 not вызывает вторичное SerializationException?

Может ли это быть из-за того, что aspnet_compiler.exe пытается каким-то образом отразить неожиданные исключения?(И поэтому, поскольку у нас не загружена наша сборка App.Project, он не может определить тип?)

1 Ответ

3 голосов
/ 17 февраля 2011

Похоже, что программа 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 не возникает.

...