更新NHibernate后,我收到LoaderExceptions错误?

时间:2013-04-28 15:58:10

标签: c# asp.net asp.net-mvc nhibernate fluent-nhibernate

我把网站放在host-gator之后在本地工作得很好它给出了错误http://www.akbarca.com/。 Hostgator支持团队表示您的应用程序以完全信任级别运行,在这种情况下,我们只允许中等信任级别。

经过调查,我发现问题出现在Nhibenate 2.00中,它以完全信任级别运行。搜索互联网我发现解决方案是将Nhibernate升级到最新版本,或者安装NHibernate.DependencyInjection,安装完两个后我现在在本地计算机上收到错误:

  

无法加载一个或多个请求的类型。检索   LoaderExceptions属性以获取更多信息。

到目前为止,我已经尝试了以下但没有成功: 删除所有DLL并重新启动它们。 将本地复制为真实。

当我有[assembly: AllowPartiallyTrustedCallers()]时,我收到同样的错误。

我想我必须让所有DLL都运行在中等信任级别,如果可以,请告知如何实现相同的目标?

2 个答案:

答案 0 :(得分:0)

当我们从DLL中引用未被复制到项目的bin目录中的类型时,我们遇到了相同的异常,即使它将copy local设置为true。丢失的dll不容易找到,因为我们必须在找到罪魁祸首之前深入查看异常的内部异常及其堆栈跟踪。我们最初的调查指出了信任等级问题,但最终它是一个死胡同。深入研究内部异常(我遍历异常直到innerException为null)应该可以深入了解哪个dll无法加载。在我们的例子中,我们的项目所依赖的项目引用了“Microsoft.SqlServer.Types”,并且正在使用该dll中的HierarchyId。

答案 1 :(得分:0)

我已经碰到了几次,而且通常缺少依赖关系,并且总是超级令人沮丧。

在Fluent初始化期间抛出异常的事实有时会使异常有点误导,因为它根本不是FNH异常。事实上ReflectionTypeLoadException也将异常作为一个数组保存在LoaderExceptions属性中,这也使得挖掘更多工作。

注意确保各个项目的引用一致。例如,当我让R#为我的项目添加依赖项时,我已经遇到了这个问题,该项目已经使用Nuget映射到另一个项目中。第二个项目得到了一个在本地很好但在服务器上无效的引用(并且没有使用Nuget解析),这使得在本地重现更加困难。

无论如何,这里有一段代码片段,可以帮助您追踪罪魁祸首。此示例来自使用Global.asax的MVC应用程序,但可以轻松地适应其他项目类型。

protected void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    if (null == ex || ex is ThreadAbortException)
    {
        // could be due to redirect
        return;
    }
    if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404)
    {
        // don't want to log this
        return;
    }

    LogException(ex);
}

private void LogException(Exception exception)
{
    if (exception is ReflectionTypeLoadException)
    {
        foreach (Exception loaderException in ((ReflectionTypeLoadException)exception).LoaderExceptions)
        {
            LogException(loaderException);
        }
        if (null != exception.InnerException)
        {
            LogException(exception);
        }
    }
    else if (null != exception.InnerException)
    {
        LogException(exception.InnerException);
    }

    // you might also choose System.Console.WriteLine(...), System.Diagnostics.Trace.WriteLine(...), etc.
    System.Diagnostics.Debug.WriteLine(exception.Message);

    // or send to your favorite logger...this is log4net
    Log.FatalFormat("Unhandled error in the website: {0}", exception);
}