先週、私の Windows サービス アプリケーションの運用環境へのデプロイが失敗したため、プロジェクトをローカルでリリース モードで実行しようとしたところInvalidOperationException: Can not determine current class.、GetCurrentClassLogger.
私のプロジェクトでは、 NinjectILoggerFactoryを使用して、中間層のすべてのサービスに解決します。次に、サービスはコンストラクターでGetCurrentClassLogger()適切なものを取得するために使用します。ILogger例えば:
public class FooService : IFooService
{
private readonly ILogger logger;
public FooService(ILoggerFactory loggerFactory)
{
this.logger = loggerFactory.GetCurrentClassLogger();
}
// ...
}
Ninject.Extensions.LoggingGetCurrentClassLoggerのatLoggerFactoryBaseの実装を掘り下げると:
[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実行されることです。
この問題をコンパイラのコード最適化に関連付けることができました。プロジェクト プロパティの [ビルド] タブで無効にすると、正常に実行されます。
質問StackFrame:の提供を停止する原因は何DeclaringTypeですか?
その間、私はこれを回避策として使用していますが、元の方法を使用することをお勧めします。
this.logger = loggerFactory.GetLogger(this.GetType());
どんな助けでも大歓迎です。