从 nhibernate 1.0.4.0 升级到 nhibernate 3.3 后,当我尝试运行"配置 cfg = new Configuration();"时遇到以下错误
System.TypeInitializationException was caught
Message="The type initializer for 'NHibernate.Cfg.Configuration' threw an exception."
Source="NHibernate"
TypeName="NHibernate.Cfg.Configuration"
StackTrace:
at NHibernate.Cfg.Configuration..ctor()
at KEH.Web.Data.NHibernateUtil..cctor() in F:ProjectsKEH nHibernateKEHWebDataDataNHibernateUtil.cs:line 24
InnerException: System.NotSupportedException
Message="The invoked member is not supported in a dynamic assembly."
Source="mscorlib"
StackTrace:
at System.Reflection.Emit.AssemblyBuilder.get_Location()
at log4net.Util.SystemInfo.AssemblyLocationInfo(Assembly myAssembly)
at log4net.Core.DefaultRepositorySelector.GetInfoForAssembly(Assembly assembly, String& repositoryName, Type& repositoryType)
at log4net.Core.DefaultRepositorySelector.CreateRepository(Assembly repositoryAssembly, Type repositoryType, String repositoryName, Boolean readAssemblyAttributes)
at log4net.Core.DefaultRepositorySelector.CreateRepository(Assembly repositoryAssembly, Type repositoryType)
at log4net.Core.DefaultRepositorySelector.GetRepository(Assembly repositoryAssembly)
at log4net.Core.LoggerManager.GetLogger(Assembly repositoryAssembly, String name)
at log4net.LogManager.GetLogger(Assembly repositoryAssembly, String name)
at log4net.LogManager.GetLogger(Type type)
at lambda_method(ExecutionScope , Type )
at NHibernate.Log4NetLoggerFactory.LoggerFor(Type type)
at NHibernate.LoggerProvider.LoggerFor(Type type)
at NHibernate.Cfg.Configuration..cctor()
InnerException:
任何帮助将不胜感激。
NHibernateUtil 类代码如下:
public class NHibernateUtil
{
private static readonly Configuration cfg;
private static readonly ISessionFactory sessionFactory;
private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
static NHibernateUtil()
{
try
{
logger.Debug("Before Initializing NHibernate");
cfg = new Configuration();
cfg.AddAssembly("KEH.Web.Data");
sessionFactory = cfg.BuildSessionFactory();
logger.Debug("Initialized NHibernate");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public static ISession OpenSession()
{
logger.Debug("Before Getting Connection");
return sessionFactory.OpenSession();
}
}
我遇到了同样的问题。实际原因是我使用了一个使用旧版log4net的库。NHibernate如果找到,会尝试使用它。所以我不得不通过添加这样的行来强制它使用(或实际上不使用)其他记录器:LoggerProvider.SetLoggersFactory(new NoLoggingLoggerFactory());
不知道为什么它不起作用,但我只是替换
cfg.AddAssembly("KEH.Web.Data");
跟
cfg.AddAssembly(typeof(Entity).Assembly);
其中,实体是映射文件程序集中存在的某个类。
为了其他可能通过谷歌找到这个问题的人的利益:
对我们来说,这个错误是一个红鲱鱼。我们的应用程序运行良好,直到我们部署了新组件并且它将失败(以未知方式),并且 IIS 将回收应用程序池。问题是我们使用的 HTML 到 JPG 组件以某种方式出错,导致我们所有的 w3wp.exe 工作进程消耗最大 CPU。当通过 IIS 回收应用程序池时,整个站点将关闭,NHibernate 将持续引发此错误,直到 iis重置。在回收之前,即使有 CPU 负载,站点仍然会非常敏感。
虽然我们仍然不知道该组件是如何失败的,或者为什么它会级联到 NHibernate 初始化的问题,但关键是这是一个红鲱鱼。请务必注意新部署后不久"突然"发生的此错误,并保留 CPU 利用率的日志,以便帮助发现何时酝酿问题。最后,如果停机时间发生在每天的同一时间,则可能是自动 IIS 应用程序池回收,这应该是另一个线索,表明某些东西正在窃听您的应用程序并在回收期间出现。
最终,我们禁用了HTML到JPG组件,直到找到解决方法并且我们的正常运行时间恢复到100%。
希望这对某人有所帮助。