除非调试,否则Visual Studio应用程序抛出NullReferenceException

时间:2014-06-02 10:59:37

标签: log4net nullreferenceexception

在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;
    }

1 个答案:

答案 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 = "")

你应该看看这个问题:

stackframe-behaving-differently-in-release-mode