上周将我的 Windows 服务应用程序部署到生产环境失败了,所以我尝试在本地以发布模式运行项目InvalidOperationException: Can not determine current class.
,结果可以追溯到对GetCurrentClassLogger
.
我的项目使用Ninject解析ILoggerFactory
到中间层的每个服务。然后服务用于在构造函数GetCurrentClassLogger()
中获取正确ILogger
的。例如:
public class FooService : IFooService
{
private readonly ILogger logger;
public FooService(ILoggerFactory loggerFactory)
{
this.logger = loggerFactory.GetCurrentClassLogger();
}
// ...
}
如果我深入研究GetCurrentClassLogger
atLoggerFactoryBase
的Ninject.Extensions.Logging的实现:
[MethodImpl(MethodImplOptions.NoInlining)]
public ILogger GetCurrentClassLogger()
{
StackFrame stackFrame = new StackFrame(0, false);
if (stackFrame.GetMethod() == (MethodBase) LoggerFactoryBase.getCurrentClassLoggerMethodInfo)
stackFrame = new StackFrame(1, false);
Type declaringType = stackFrame.GetMethod().DeclaringType;
if (declaringType == (Type) null)
throw new InvalidOperationException(string.Format("Can not determine current class. Method: {0}", (object) stackFrame.GetMethod()));
return this.GetLogger(declaringType);
}
我可以看到抛出异常的位置。
我的第一直觉是检查是否有任何系统、框架或项目更新导致它,但自上次成功部署以来没有做任何有意义的事情。
现在......关于这个问题的“有趣”的事情是,当我Trace.WriteLine("Test");
在构造函数中添加一行时,GetCurrentClassLogger
执行得很好。
我能够将此问题与编译器的代码优化联系起来。如果我在项目属性的Build选项卡中禁用它,它也可以正常执行。
问题:什么可能导致StackFrame
停止提供DeclaringType
?
同时,我将其用作解决方法,但我更喜欢使用原始方法:
this.logger = loggerFactory.GetLogger(this.GetType());
任何帮助将非常感激。