C# · 12月 29, 2021

c# – NuGet的Unity Bootstrapper在App_Start上抛出错误

适用于Unity 3.0的Microsoft Unity Bootstrapper在此行上抛出错误: FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

出现以下错误:

An exception of type ‘System.ArrayTypeMismatchException’ occurred in
mscorlib.dll but was not handled in user code

Additional information: Attempted to access an element as a type
incompatible with the array.

整个代码都在这里,而且这是由nuget下载的引导程序预先制作和编写的.

Bootstrapper生成文件App_Start / UnityMVCActivator.cs

using System.Linq;using System.Web.Mvc;using Microsoft.Practices.Unity.Mvc;[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(WebApplication.WebUI.App_Start.UnityWebActivator),”Start”)]namespace WebApplication.WebUI.App_Start{ /// <summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary> public static class UnityWebActivator { /// <summary>Integrates Unity when the application starts.</summary> public static void Start() { var container = UnityConfig.GetConfiguredContainer(); FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First()); FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container)); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); // TODO: Uncomment if you want to use PerRequestLifetimeManager // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule)); } }}

Bootstrapper生成文件App_Start / UnityConfig.cs

using System;using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.Configuration;using WebApplication.Domain.Abstract;using WebApplication.Domain.Concrete;namespace WebApplication.WebUI.App_Start{ /// <summary> /// Specifies the Unity configuration for the main container. /// </summary> public class UnityConfig { #region Unity Container private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => { var container = new UnityContainer(); RegisterTypes(container); return container; }); /// <summary> /// Gets the configured Unity container. /// </summary> public static IUnityContainer GetConfiguredContainer() { return container.Value; } #endregion /// <summary>Registers the type mappings with the Unity container.</summary> /// <param name=”container”>The unity container to configure.</param> /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to /// change the defaults),as Unity allows resolving a concrete type even if it was not prevIoUsly registered.</remarks> public static void RegisterTypes(IUnityContainer container) { // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. //container.LoadConfiguration(); // TODO: Register your types here //container.RegisterType<IProductRepository,EFProductRepository>(); } }}

有任何想法吗?

#region Assembly Microsoft.Practices.Unity.Mvc.dll,v3.0.0.0// C:\Users\James\Documents\Visual Studio 2013\Projects\Application\packages\Unity.Mvc.3.0.1304.0\lib\Net45\Microsoft.Practices.Unity.Mvc.dll#endregionusing Microsoft.Practices.Unity;using System.Collections.Generic;using System.Web.Mvc;namespace Microsoft.Practices.Unity.Mvc{ // Summary: // Defines a filter provider for filter attributes that support injection of // Unity dependencies. public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider { // Summary: // Initializes a new instance of the Microsoft.Practices.Unity.Mvc.UnityFilterAttributeFilterProvider // class. // // Parameters: // container: // The Microsoft.Practices.Unity.IUnityContainer that will be used to inject // the filters. public UnityFilterAttributeFilterProvider(IUnityContainer container); // Summary: // Gets a collection of custom action attributes,and injects them using a Unity // container. // // Parameters: // controllerContext: // The controller context. // // actionDescriptor: // The action descriptor. // // Returns: // A collection of custom action attributes. protected override IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext,ActionDescriptor actionDescriptor); // // Summary: // Gets a collection of controller attributes,and injects them using a Unity // container. // // Parameters: // controllerContext: // The controller context. // // actionDescriptor: // The action descriptor. // // Returns: // A collection of controller attributes. protected override IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext,ActionDescriptor actionDescriptor); }}

Unity引导程序安装的软件包

<package id=”Unity” version=”3.0.1304.1″ targetFramework=”net45″ /> <package id=”Unity.Mvc” version=”3.0.1304.0″ targetFramework=”net45″ /> <package id=”WebActivatorEx” version=”2.0.4″ targetFramework=”net45″ />

堆栈:

[ArrayTypeMismatchException: Attempted to access an element as a type incompatible with the array.] System.Collections.Generic.List`1.Insert(Int32 index,T item) +58 System.Collections.ObjectModel.Collection`1.InsertItem(Int32 index,T item) +55 System.Web.Mvc.FilterProviderCollection.InsertItem(Int32 index,IFilterProvider item) +47 System.Collections.ObjectModel.Collection`1.Add(T item) +98 WebApplication.WebUI.App_Start.UnityWebActivator.Start() in c:\Users\James\Documents\Visual Studio 2013\Projects\Application\WebApplication.WebUI\App_Start\UnityMvcActivator.cs:18[TargetInvocationException: Exception has been thrown by the target of an invocation.] System.RuntimeMethodHandle.InvokeMethod(Object target,Object[] arguments,Signature sig,Boolean constructor) +0 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object[] parameters,Object[] arguments) +192 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,CultureInfo culture) +155 System.Reflection.MethodBase.Invoke(Object obj,Object[] parameters) +19 WebActivatorEx.BaseActivationMethodAttribute.InvokeMethod() +236 WebActivatorEx.ActivationManager.RunActivationMethods(Boolean designerMode) +535 WebActivatorEx.ActivationManager.RunPreStartMethods(Boolean designerMode) +48 WebActivatorEx.ActivationManager.Run() +163[InvalidOperationException: The pre-application start initialization method Run on type WebActivatorEx.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation..] System.Web.Compilation.BuildManager.InvokePreStartInitMethodscore(ICollection`1 methods,Func`1 setHostingEnvironmentCultures) +556 System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +132 System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath,Boolean& isRefAssemblyLoaded) +102 System.Web.Compilation.BuildManager.ExecutePreAppStart() +153 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager,IApplicationHost appHost,IConfigMapPathFactory configMapPathFactory,HostingEnvironmentParameters hostingParameters,PolicyLevel policyLevel,Exception appDomainCreationException) +516[HttpException (0x80004005): The pre-application start initialization method Run on type WebActivatorEx.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation..] System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9882460 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext context) +254解决方法 更新了解决方案

好的,这很棘手.我不知道如何设法获得这种类型的项目.您可能已经从早期版本的ASP.NET MVC升级了您的项目类型.以下方式是答案.

在您的Web.Config的运行时装配绑定部分,请添加以下.

<dependentAssembly> <assemblyIdentity name=”System.Web.Mvc” publicKeyToken=”31bf3856ad364e35″ /> <bindingRedirect oldVersion=”1.0.0.0-5.0.0.0″ newVersion=”5.0.0.0″ /></dependentAssembly>

这应该解决你的问题.