'NHibernate.Cfg.Configuration'的类型初始值设定项引发异常



从 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%。

希望这对某人有所帮助。

最新更新