从nhibernate 1.0.4.0升级到nhibernate 3.3后,当我尝试运行“Configuration 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:\Projects\KEH nHibernate\KEHWeb\Data\Data\NHibernateUtil.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();
}
}
答案 0 :(得分:4)
我遇到了同样的问题。 实际的原因是我使用了一个使用旧版log4net的库。 如果找到,NHibernate会尝试使用它。 所以我不得不强制它通过添加这样的线来使用(或实际上不使用)其他记录器: LoggerProvider.SetLoggersFactory(new NoLoggingLoggerFactory());
答案 1 :(得分:1)
不确定为什么它不起作用,但我只是替换
cfg.AddAssembly("KEH.Web.Data");
与
cfg.AddAssembly(typeof(Entity).Assembly);
其中Entity是映射文件汇编中存在的一些类。
答案 2 :(得分:-2)
为了通过Google找到此问题的其他人的利益:
对我们来说,这个错误是一个红鲱鱼。我们的应用程序运行良好,直到我们部署了一个新组件并且它将失败(以未知的方式)并且IIS将回收应用程序池。问题是我们使用的HTML到JPG组件是错误的,导致我们所有的w3wp.exe工作进程消耗最大的CPU。当应用程序池通过IIS回收时,整个站点都会关闭,NHibernate将持续抛出此错误,直到iisreset。在回收之前,即使CPU负载,站点仍然会响应很快。
虽然我们仍然不知道组件是如何失败的,或者为什么它会与NHibernate初始化的问题级联起来,但重点是它是一个红鲱鱼。确保在新部署后不久“突然”发现此错误,并保留CPU利用率的日志,以便在发生故障时帮助发现。最后,如果停机时间几乎在每天的同一时间发生,那么它可能是一个自动的IIS应用程序池循环,这应该是另一个线索,在回收过程中,某些东西会破坏您的应用程序并浮出水面。
最终,我们禁用HTML到JPG组件,直到找到解决方法并且我们的正常运行时间回升到100%。
希望这有助于某人。