Log4net Visual Studio应用程序引发NullReferenceException,除非进行调试
在VS2010中,我有一个控制台应用程序。应用程序引用了一个引用log4net的公共dll。 这是一个长期运行的应用程序,最近由于内存问题被修改为目标x64。 自x64更改以来,又引入了另一个问题 该应用程序在调试模式和使用F5的发布模式下运行良好。它不会在释放模式下使用CTRL-F5运行(即不进行调试)。Log4net Visual Studio应用程序引发NullReferenceException,除非进行调试,log4net,nullreferenceexception,Log4net,Nullreferenceexception,在VS2010中,我有一个控制台应用程序。应用程序引用了一个引用log4net的公共dll。 这是一个长期运行的应用程序,最近由于内存问题被修改为目标x64。 自x64更改以来,又引入了另一个问题 该应用程序在调试模式和使用F5的发布模式下运行良好。它不会在释放模式下使用CTRL-F5运行(即不进行调试)。 该错误是来自公共dll的NullReferenceException 该行尝试调用LogManager(log4net)上的静态方法 我使用的是最新版本的log4net 没有特定于调试的代码
该错误是来自公共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位进行了不同的优化。如果它们是一样的,你就不必知道你在建什么类型的房子。