C# 更新NHibernate后,我得到LoaderExceptions错误?

C# 更新NHibernate后,我得到LoaderExceptions错误?,c#,asp.net,asp.net-mvc,nhibernate,fluent-nhibernate,C#,Asp.net,Asp.net Mvc,Nhibernate,Fluent Nhibernate,我有一个网站在本地运行良好后,把它放在主机盖特它是给错误。Hostgator支持团队表示,您的应用程序运行在完全信任级别,在这种情况下,我们只允许中等信任级别 经过调查,我发现问题出在Nhibenate 2.00中,它以完全信任级别运行。搜索internet时,我发现解决方案是将Nhibernate升级到最新版本,或者安装Nhibernate.DependencyInjection,在我安装了这两个版本后,我在本地计算机中发现错误: 无法加载一个或多个请求的类型。取回 LoaderExcepti

我有一个网站在本地运行良好后,把它放在主机盖特它是给错误。Hostgator支持团队表示,您的应用程序运行在完全信任级别,在这种情况下,我们只允许中等信任级别

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

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

到目前为止,我尝试了以下方法,但没有成功: 删除所有DLL并重新导入它们。 具有对所有人都真实的本地副本

另外,当我有
[assembly:AllowPartiallyTrustedCallers()]时,
我也会遇到同样的错误


我想我必须让所有DLL都在中等信任级别上运行,如果是这样的话,请您建议如何实现相同的功能?

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

我已经遇到过几次了,它通常是一个缺少的依赖项,而且总是非常令人沮丧

在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);
}

我已经手动添加和删除了上千次DLL,并且还通过将本地副本设置为true来添加和删除DLL,但仍然没有成功。