2013-01-02 2 views
0

Castle Windsor 3.1.0을 ASP .NET 4 MVC 응용 프로그램에서 사용하고 있는데, container.Register가 호출 될 때 Application_Start 이벤트에서 예외가 발생합니다.캐슬 윈저 다이내믹 어셈블리 버그?

예외는 "호출 된 멤버가 동적 어셈블리에서 지원되지 않습니다."입니다. 여기에 스택 추적입니다 : 내가 등록 전화 했어 방법

[NotSupportedException: The invoked member is not supported in a dynamic assembly.] 
    System.Reflection.Emit.InternalAssemblyBuilder.GetExportedTypes() +56 
    Castle.Core.Internal.ReflectionUtil.GetAvailableTypes(Assembly assembly, Boolean includeNonExported) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Core\Internal\ReflectionUtil.cs:165 
    Castle.MicroKernel.Registration.FromAssemblyDescriptor.<SelectedTypes>b__0(Assembly a) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\MicroKernel\Registration\FromAssemblyDescriptor.cs:56 
    System.Linq.<SelectManyIterator>d__14`2.MoveNext() +238 
    Castle.MicroKernel.Registration.FromDescriptor.Castle.MicroKernel.Registration.IRegistration.Register(IKernelInternal kernel) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\MicroKernel\Registration\FromDescriptor.cs:160 
    Castle.MicroKernel.Registration.BasedOnDescriptor.Castle.MicroKernel.Registration.IRegistration.Register(IKernelInternal kernel) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\MicroKernel\Registration\BasedOnDescriptor.cs:530 
    Castle.MicroKernel.DefaultKernel.Register(IRegistration[] registrations) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\MicroKernel\DefaultKernel.cs:506 
    Castle.Windsor.WindsorContainer.Register(IRegistration[] registrations) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Windsor\WindsorContainer.cs:483 
    ProductX.Web.Windsor.Installers.ControllerInstaller.Install(IWindsorContainer container, IConfigurationStore store) in C:\TeamProjects\CompanyX.ProductX\Mainline\Admin\ProductX.Web\Windsor\Installers\ControllerInstaller.cs:24 
    Castle.Windsor.Installer.AssemblyInstaller.Install(IWindsorContainer container, IConfigurationStore store) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Windsor\Installer\AssemblyInstaller.cs:56 
    Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers, DefaultComponentInstaller scope) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Windsor\WindsorContainer.cs:319 
    Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers) in c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Windsor\WindsorContainer.cs:452 
    ProductX.Web.MvcApplication.InitializeWindsor() in C:\TeamProjects\CompanyX.ProductX\Mainline\Admin\ProductX.Web\Global.asax.cs:41 
    ProductX.Web.MvcApplication.Application_Start() in C:\TeamProjects\CompanyX.ProductX\Mainline\Admin\ProductX.Web\Global.asax.cs:25 

[HttpException (0x80004005): The invoked member is not supported in a dynamic assembly.] 
    System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9171773 
    System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +131 
    System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +194 
    System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +339 
    System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253 

[HttpException (0x80004005): The invoked member is not supported in a dynamic assembly.] 
    System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9090876 
    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97 
    System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +256 

은 다음과 같습니다 내가 디버그 모드에서 응용 프로그램을 빌드 할 때

container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient()); 

, 그것은 괜찮습니다. 릴리스 모드에서 빌드 할 때 위의 예외가 발생합니다. Google을 통해이 오류에 대해 아무 것도 찾을 수 없습니다. 내 생각에 .NET Compact Framework 4의 제한 사항은 릴리스 구조 최적화로 도입 된 동적 어셈블리에서 반영이 수행되는 방식으로 소개되었습니다.

아무도 아이디어가 없습니까?

답변

1

동적 어셈블리가 방출되고있는 것처럼 보입니다 (어떻게 든). 동적 어셈블리를 무시하는 필터를 추가하십시오. 작동해야 함 :

container.Register(Classes.FromThisAssembly().Where(t => !t.Assembly.IsDynamic).BasedOn<IController>().LifestyleTransient()); 
+0

감사합니다. 패트릭 덕분에 좀 더 가까이 다가 갈 수있었습니다. 해당 위치에서 Where()를 사용하면 Obsolete로 표시되고 더 이상 BasedOn()을 사용하지 않고 쿼리를 다시 설정합니다. BasedOn을 먼저 사용하고 Where()를 사용하면 Where()가 더 이상 사용되지 않고 쿼리가 다시 설정됩니다. 매우 혼란 스럽습니다 ... –

+0

동적 어셈블리 문제가 해결되었으므로 문제를 답변으로 표시하겠습니다. 감사. –

+0

AppDomain에로드 된 모든 어셈블리를 리플렉션하고 반복하여 동적 어셈블리를 만드는 것을 확인할 수 있습니다. 동적 어셈블리의 이름은 'ahsbzfd'(예 : 임의의 문자)처럼 두드러 져야합니다. 그 어셈블리를 들여다보고 그 안에 무엇이 있는지보십시오. – PatrickSteele

관련 문제