FluentNHibernate 1.2.0.712 FileIOException仅在我们的应用程序的后续运行中发生

时间:2014-10-17 14:28:07

标签: c# nhibernate fluent-nhibernate

对于我正在处理的应用程序,我们已经开始在Visual Studio 2014中以奇怪的方式从NHibernate获取以下异常:

Could not load file or assembly 'FluentNHibernate, Version=1.2.0.712, Culture=neutral, PublicKeyToken=8aa435e3cb308880' or one of its dependencies. An API call exited abnormally. (Exception from HRESULT: 0x800300FA (STG_E_ABNORMALAPIEXIT))

当我们进行服务器代码更改(导致应用程序重新编译)时,应用程序可以正常运行。只有当我们尝试在没有首先重建项目的情况下运行我们的Web项目时才会发生这种情况。

我们已手动确保将DLL部署到bin文件夹。我们已确保该应用程序引用了FluentNHibernate v1.2.0.712。我们知道情况就是这样,因为第一次运行按预期运行。

发生这种情况的代码如下所示:

public class DataContext : IDisposable
{
    private static ISessionFactory _sessionFactory;
    private static bool _startupComplete;

    private static object _locker;

    public void Dispose()
    {
        _locker = null;
        _sessionFactory = null;
    }

    public static ISession GetSession()
    {
        EnsureStartup();
        ISession session = _sessionFactory.OpenSession();
        session.BeginTransaction();
        return session;
    }

    public static void EnsureStartup()
    {
        if(_startupComplete)
            return;

        lock(_locker)
        {
            if(! _startupComplete)
            {
                bool success = PerformStartup();
                _startupComplete = success;
            }
        }
    }

    public static bool PerformStartup()
    {
        return InitializeSessionFactory();
    }

    public static bool InitializeSessionFactory()
    {
        try
        {
            Configuration configuration = BuildConfiguration();
            _sessionFactory = configuration.BuildSessionFactory();
            return true;
        }
        catch(Exception ex)
        {
            return string.IsNullOrEmpty(ex.Message);
        }
    }

    public static Configuration BuildConfiguration()
    {
        Configuration configuration = Fluently.Configure(
                new Configuration().Configure())
                // Mappings uses reflection to add mappings from the specified assembly
                .Mappings(cfg => cfg.FluentMappings.AddFromAssembly(typeof(DataContext).Assembly))
                .BuildConfiguration();

        return configuration;
    }

    class IncludeCastleDllInBuild : NHibernate.ByteCode.Castle.ProxyFactory
    {
        // Note: prevents missing DLL issue with the Castle DLL
    }
}

由于ISession中的GetSession赋值获得Null引用异常,我们首先检测到它。在深入钻取并且F11 / F10逐步执行我们的代码后,我们发现他们try/catch中的InitializeSessionFactory吞没了错误。我修改了代码以强制PerformStartupInitializeSessionFactory正确报告工厂设置是否成功。

问题:为什么NHibernate无法加载,只能在我们的应用程序的后续运行中加载?更重要的是,我们如何摆脱这种恼人的例外?

编辑1:根据@DaveZych,我在类中添加了IDisposable实现,清除了_locker_sessionFactory字段,但它对问题没有影响。此外,在我们的web.config文件中,我们没有开启模拟行,并且基于impersonation documentation,默认情况下模拟已关闭。

编辑2:对于笑脸和咯咯笑声,我在web.config部分的system.web内添加了以下代码:

<authentication mode="Windows" />
<identity impersonate="false" />

不幸的是,尽管an earlier question about the same generic error,这也没有任何影响。还应该注意我使用的是最新版本的Visual Studio 2013。

0 个答案:

没有答案