2011-02-16 6 views
2

.NET 3.5 웹 응용 프로그램의 ASP.NET 사전 컴파일 중에 형식 초기화 프로그램에서 다양한 초기화가 수행됩니다. 형식 이니셜 라이저 중 하나가 환경이 잘못 구성된 경우 사용자 지정 예외를 throw합니다. 우리의 사용자 정의 예외가 발생 그러나, 여기에 aspnet_compiler.exe는 우리에게 무엇을 : 더 "진짜"스택 추적 정보가 포함되지 않도록ASP.NET 사전 컴파일 중 유형 확인 오류

[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 사전 컴파일 중에 사용자 지정 예외를 throw하면 왜 Secondary SerializationException이 발생합니까? 예외를 직렬화하려고하는 이유는 무엇입니까? 마찬가지로 BCL InvalidOperationException 이 아닌을 사용하면 왜 Secondary SerializationException이 발생합니까?

예기치 않은 예외에 대해 aspnet_compiler.exe가 일종의 반사 작업을 수행하려고했기 때문일 수 있습니까? 따라서 우리 App.Project 어셈블리가로드되어 있지 않으므로 형식을 확인할 수 없습니다.

답변

3

aspnet_compiler.exe 프로그램은 .NET Remoting을 사용하여 ASP.NET 런타임과 통신하는 것으로 보입니다. ASP.NET 런타임에서 내 사용자 지정 예외를 throw하면 aspnet_compiler.exe는 내 App.Project 어셈블리가 GAC에 없거나 aspnet_compiler.exe에 대한 경로 검색을 통해 사용할 수 없으므로 사용자 지정 예외 유형을 확인할 수 없기 때문에이를 deserialize 할 수 없습니다. .

이 가설을 테스트하기 위해 aspnet_compiler.exe (C : \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727)와 동일한 디렉토리에 App.Project 어셈블리를 복사하고 프리 컴파일을 수행했습니다. 사용자 지정 예외가 throw 될 때 정상적인 스택 추적을 함께 나오고 SerializationException 발생하지 않습니다.

+0

+1 용. 난 이상한 오류를 받고 있었고 실제 스택 추적을 결정하기 위해 프레임 워크 디렉토리에 복사하는 방법을 사용했습니다. 감사! – TheCloudlessSky

+0

@ TheCloudlessSky 당신을 도왔습니다. –