对于我正在处理的应用程序,我们已经开始在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
吞没了错误。我修改了代码以强制PerformStartup
和InitializeSessionFactory
正确报告工厂设置是否成功。
问题:为什么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。