Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Log4net Visual Studio应用程序引发NullReferenceException,除非进行调试_Log4net_Nullreferenceexception - Fatal编程技术网

Log4net Visual Studio应用程序引发NullReferenceException,除非进行调试

Log4net Visual Studio应用程序引发NullReferenceException,除非进行调试,log4net,nullreferenceexception,Log4net,Nullreferenceexception,在VS2010中,我有一个控制台应用程序。应用程序引用了一个引用log4net的公共dll。 这是一个长期运行的应用程序,最近由于内存问题被修改为目标x64。 自x64更改以来,又引入了另一个问题 该应用程序在调试模式和使用F5的发布模式下运行良好。它不会在释放模式下使用CTRL-F5运行(即不进行调试)。 该错误是来自公共dll的NullReferenceException 该行尝试调用LogManager(log4net)上的静态方法 我使用的是最新版本的log4net 没有特定于调试的代码

在VS2010中,我有一个控制台应用程序。应用程序引用了一个引用log4net的公共dll。 这是一个长期运行的应用程序,最近由于内存问题被修改为目标x64。 自x64更改以来,又引入了另一个问题

该应用程序在调试模式和使用F5的发布模式下运行良好。它不会在释放模式下使用CTRL-F5运行(即不进行调试)。
该错误是来自公共dll的NullReferenceException

该行尝试调用LogManager(log4net)上的静态方法

我使用的是最新版本的log4net

没有特定于调试的代码

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

您的问题不在log4net中。但是,它工作正常:

    var frame = new StackFrame(2);
    var method = frame.GetMethod();
    return method.DeclaringType;
事实并非如此。在发布模式下,这是优化的,可能会因此导致问题。因为logerror方法取决于记录器名称(declaringtype),所以应该将其包含在logerror方法的签名中

如果您不希望一直添加您的declaringtype,这可能会对您有所帮助:

public static string LogError(Exception ex, [CallerMemberName] string callerName = "")
你应该看看这个问题:


您的问题不在log4net中。但是,它工作正常:

    var frame = new StackFrame(2);
    var method = frame.GetMethod();
    return method.DeclaringType;
事实并非如此。在发布模式下,这是优化的,可能会因此导致问题。因为logerror方法取决于记录器名称(declaringtype),所以应该将其包含在logerror方法的签名中

如果您不希望一直添加您的declaringtype,这可能会对您有所帮助:

public static string LogError(Exception ex, [CallerMemberName] string callerName = "")
你应该看看这个问题:


显示一些代码,问题似乎出在您的代码中。Log4net被设计为在没有任何异常的情况下失败。该代码与将目标更改为x64之前工作的代码相同,并且在调试模式下工作。显示一些代码,问题似乎出在您的代码中。Log4net被设计为在没有任何异常的情况下失败。该代码与将目标更改为x64之前工作的代码相同,并且在调试模式下工作。该代码有效:_log=LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);但它给了我记录器本身的类型。我需要找到一种方法,在堆栈中往上走两步,以获得调用dll。谢谢您所说的似乎是正确的,但不确定为什么它在32位中是正确的。带有[MethodImpl(MethodImplOptions.NoInLine)]的修饰GetLoggerType()现在可以完美地工作了。@user3698845 32位和64位进行了不同的优化。如果它们是相同的,您就不必知道正在构建的是什么类型;但它给了我记录器本身的类型。我需要找到一种方法,在堆栈中往上走两步,以获得调用dll。谢谢您所说的似乎是正确的,但不确定为什么它在32位中是正确的。带有[MethodImpl(MethodImplOptions.NoInLine)]的修饰GetLoggerType()现在可以完美地工作了。@user3698845 32位和64位进行了不同的优化。如果它们是一样的,你就不必知道你在建什么类型的房子。