Asp.net mvc 4 温莎城堡动态装配错误?

Asp.net mvc 4 温莎城堡动态装配错误?,asp.net-mvc-4,castle-windsor,Asp.net Mvc 4,Castle Windsor,我在ASP.NET 4 MVC应用程序中使用Castle Windsor 3.1.0,当调用container.Register时,在应用程序启动事件中出现异常 例外情况是“动态程序集中不支持调用的成员。”。以下是堆栈跟踪: [NotSupportedException: The invoked member is not supported in a dynamic assembly.] System.Reflection.Emit.InternalAssemblyBuilder.Get

我在ASP.NET 4 MVC应用程序中使用Castle Windsor 3.1.0,当调用container.Register时,在应用程序启动事件中出现异常

例外情况是“动态程序集中不支持调用的成员。”。以下是堆栈跟踪:

[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
[NotSupportedException:动态程序集中不支持调用的成员。]
System.Reflection.Emit.InternalAssemblyBuilder.GetExportedTypes()+56
c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Core\Internal\ReflectionUtil.GetAvailableType(程序集程序集,布尔值includeNoReported)中的Castle.Core.Internal.ReflectionUtil.GetAvailableType
c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\MicroKernel\Registration\FromAssemblyDescriptor.b_u0(程序集a)中的Castle.MicroKernel.Registration.FromAssemblyDescriptor.c:56
System.Linq.d_u14`2.MoveNext()+238
Castle.MicroKernel.Registration.FromDescriptor.Castle.MicroKernel.Registration.IRegistration.Register(IKernelInternal内核)位于c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\MicroKernel\Registration\FromDescriptor.cs:160
Castle.MicroKernel.Registration.BasedOnDescriptor.Castle.MicroKernel.Registration.IRegistration.Registration(IKernelInternal内核)在c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\MicroKernel\Registration\BasedOnDescriptor.cs:530中
Castle.MicroKernel.DefaultKernel.Register(IRegistration[]注册)在c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\MicroKernel\DefaultKernel.cs:506中
Castle.Windsor.WindsorContainer.Register(IRegistration[]注册)在c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Windsor\WindsorContainer.cs:483中
ProductX.Web.Windsor.Installers.ControllerInstaller.Install(IWindsorContainer容器,IConfigurationStore商店)在C:\TeamProjects\CompanyX.ProductX\Mainline\Admin\ProductX.Web\Windsor\Installers\ControllerInstaller.cs:24中安装
Castle.Windsor.Installer.AssemblyInstaller.Install(IWindsorContainer,IConfigurationStore存储)在c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Windsor\Installer\AssemblyInstaller.cs:56中
c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\Windsor\WindsorContainer.Install(IWindsorInstaller[]安装程序,DefaultComponentInstaller作用域)中的Castle.Windsor.WindsorContainer.Install(iwindsor安装程序[]安装程序,DefaultComponentInstaller作用域):319
Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[]安装程序)在c:\BuildAgent\work\5b096cace0fecb1f\src\Castle.Windsor\WindsorContainer.cs:452中
C:\TeamProjects\CompanyX.ProductX\Mainline\Admin\ProductX.Web\Global.asax.cs:41中的ProductX.Web.mvcapapplication.InitializeWindsor()
C:\TeamProjects\CompanyX.ProductX\Mainline\Admin\ProductX.Web\Global.asax.cs中的ProductX.Web.mvcapapplication.Application\u Start():25
[HttpException(0x80004005):动态程序集中不支持调用的成员。]
System.Web.HttpApplicationFactory.ensureStartCalledForIntegratedMode(HttpContext上下文,httpapplicationapp)+9171773
System.Web.HttpApplication.registereventsubscriptionswithis(IntPtr-appContext,HttpContext-context,MethodInfo[]handlers)+131
System.Web.HttpApplication.InitSpecial(HttpApplicationState,MethodInfo[]处理程序,IntPtr-appContext,HttpContext-context)+194
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr-appContext,HttpContext-context)+339
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+253
[HttpException(0x80004005):动态程序集中不支持调用的成员。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext上下文)+9090876
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext上下文)+97
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext上下文)+256
下面是我给Register打电话的方式:

container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
container.Register(Classes.fromthissembly().BasedOn().LifestyleTransient());
当我在调试模式下构建应用程序时,一切正常。当我在发布模式下构建时,上面的异常会发生。我无法通过谷歌找到关于这个错误的任何信息。我怀疑在动态程序集上如何进行反射时引入了一些.NET4限制,在这种情况下,作为发布版本优化引入了这些限制


有人知道吗?

看起来您正在(不知何故)发射一个动态程序集。尝试添加筛选器以忽略动态程序集。这应该起作用:

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

谢谢Patrick,它帮助我更进一步。如果在该位置使用Where(),则不能再在其后使用BasedOn(),因为它被标记为过时并重置查询。如果我首先使用BasedOn,然后使用Where(),它会说Where()已过时,并将重置查询。非常令人困惑…它确实解决了动态组装问题,所以我将把这个问题标记为已回答。谢谢。您可能需要对AppDomain中加载的所有程序集进行一些反射和迭代,以了解是什么在创建动态程序集。动态程序集的名称应以类似“ahsbzfd”(即随机字符)的形式突出显示。窥视该程序集并查看其中的内容。它正在以下程序集名称中调用:匿名托管的DynamicMethods程序集,版本=0.0.0.0,区域性=中性,PublicKeyToken=null。奇怪的是,您可能会认为堆栈跟踪中的System.Reflection.Emit.InternalAssemblyBuilder.GetExportedTypes调用导致了这种情况,但它在调试版本中工作,并且引用的DLL没有任何更改。作为参考,此问题再次出现,解决方法如下: