在VS 2010中,我有一个控制台应用程序。该应用程序引用了一个引用log4net的Common dll。 这是一个长期运行的应用程序,由于内存问题,最近修改为目标x64。 自x64更改以来,已经引入了另一个问题。
应用程序在调试模式和F5的发布模式下运行良好。它不会在CTRL F5的释放模式下运行(即没有调试) 该错误是来自公共dll
内的NullReferenceException该行尝试在LogManager(log4net)上调用静态方法。
我使用的是最新版本的log4net
没有DEBUG特定代码
public static void LogError(Exception ex)
{
_log = LogManager.GetLogger(GetLoggerType()); //Fails on GetLogger
_log.Error(ex);
}
private static Type GetLoggerType()
{
var frame = new StackFrame(2);
var method = frame.GetMethod();
return method.DeclaringType;
}
答案 0 :(得分:4)
你的问题不在log4net中。它运作正常,但是:
var frame = new StackFrame(2);
var method = frame.GetMethod();
return method.DeclaringType;
不是。在发布模式下,这种优化并可能因此而导致问题。因为你的logerror方法取决于记录器名称(声明类型),所以你应该将它包含在LogError方法的签名中。
如果您不希望一直添加声明类型,这可能会对您有所帮助:
public static string LogError(Exception ex, [CallerMemberName] string callerName = "")
你应该看看这个问题: