带有db4objects.db4o.linq.dll的涡轮机无法加载一个或多个请求的类型异常
-
12-09-2019 - |
题
在我的ASP.NET-MVC应用程序中,我试图设置涡轮机。
初始化代码如下:
public class MvcApplication : TurbineApplication
{
static MvcApplication()
{
ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());
}
}
然后,我有一组可与以下一家相媲美的注册服务商:
public class UserRepositoryRegistration : IServiceRegistration
{
public void Register(IServiceLocator locator)
{
locator.Register<IUserRepository, Db4oUserRepository>();
}
}
如果我尝试运行,我会在SetLocatorProvider之后的某个地方获得以下错误,但是在输入任何寄存器方法之前:
服务器错误中的“/”应用程序中的错误。
无法加载一种或多种请求类型。检索LoadereXceptions属性以获取更多信息。
描述:执行当前Web请求期间发生了一个未经治疗的异常。请查看堆栈跟踪,以获取有关该错误以及代码中何处的更多信息。
异常详细信息:System.Reflection.ReflectionTypeloadexception:无法加载一种或多种请求类型。检索LoadereXceptions属性以获取更多信息。
源错误:执行当前Web请求期间生成了一个未经治疗的异常。可以使用下面的异常堆栈跟踪来识别有关异常的原点和位置的信息。
堆栈跟踪:
[ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.] System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark) +0 System.Reflection.Assembly.GetTypes() +105 MvcTurbine.ComponentModel.DefaultAutoRegistrator.AutoRegister(ServiceRegistration serviceRegistration) +338 MvcTurbine.Web.RotorContext.ProcessAutomaticRegistration(AutoRegistrationList registrationList) +155 MvcTurbine.Web.RotorContext.AutoRegistrationForContext() +163 MvcTurbine.Web.RotorContext.Turn() +37 MvcTurbine.Web.TurbineApplication.ExecuteContext() +43 MvcTurbine.Web.TurbineApplication.TurnRotor() +65 MvcTurbine.Web.TurbineApplication.Application_Start(Object sender, EventArgs e) +85
更新
将问题库缩小到db4objects.db4o.linq.dll,一旦我将此库作为参考(甚至不使用”,只是添加到引用中),我在我的MVC webapplication中引用的一个库中,我得到了我得到的。上面提到的ysod。所有其他DB4O库都可以正常工作。
MettreàJour
尝试将UnityServiceLocator与Windsosservicelecator和NinjectserviceLocator交换。完全相同的结果,因此问题可能并非源于两个LIB。
对方
要重新创建错误页面,就可以采取以下步骤了:
- 创建新的MVC应用程序(无关WAT版本)
- alter gloabal.asax.cs代码使用mvcturbine并添加所需的mvcturbine libs
您会发现一切仍然按预期工作 - 添加db4objects.db4o.dll
一切仍然有效 - 添加db4objects.db4o.linq.dll
ysod
关于在何处以及如何调试的任何想法?
解决方案
为了写下正确的答案。我认为您得到的是由未能加载由DB4Objects.db4o.linq引用的汇编触发的Typeloadexception。
在Ildasm中查看它,表明它需要以DB4O运输的以下组件(使用与DB4Objects.db4o.linq相同的组件来避免任何不匹配)。
这些组件是:
- 单核
- Cecil.Flowanalysis
根据记录,ABD截至今天,LINQ将其用于DB4O查询优化器来分析LINQ查询中的属性访问。
其他提示
为了使涡轮机注册您的类型,它需要具有托管组件(db4objects.db4o.linq)和托管程序集可能会引用的任何其他组件。
您的原始帖子中的堆栈跟踪说,当试图解决应用程序的类型时,事情无法解决,在这种情况下,它不存在。
听起来您的目标类型是一个问题。您可以尝试以下操作:
- 删除所有服务注册,然后一次尝试一次,以确定引起问题的类型。
- 确保您可以成功实例化目标类型。
- 验证目标类型在服务注册中没有任何其他依赖项。
看到目标类型的声明和构造函数将很有帮助。
尝试切换到另一个IOC容器:
将引用添加到mvcturbine.ninject.dll
然后:
public class MvcApplication : TurbineApplication
{
static MvcApplication()
{
//ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator());
ServiceLocatorManager.SetLocatorProvider(() => new NinjectServiceLocator());
}
}
Jeff,MVC涡轮机当前仅支持MVC 1.0,我正在为.NET 3.5和.NET 4.0获得MVC 2.0的支持。请检查 http://turbineproject.com 有关何时发布的信息。