質問: ### 質問内容 行き詰ってしまい、質問させてください。 環境A Windows Server 2012 R2 IIS 8.5 .net framework 4.5 環境B Windows 8 Pro IIS 8.5 .net framework 4.5 開発言語:C# asp.netでWebページを作成しビルドしたものを、環境A、環境Bにそれぞれに同じものを置いています。 このプログラムではlog4netを使ってクラス名とメソッド名等をログに出力しているのですが 環境Aでは上手く出力されず、環境Bでは正常に出力されています。 (クラス名、メソッド名以外は両方とも正常に出力されています) 環境Aの出力内容 System.Web.UI.Page : Void ProcessRequestMain(Boolean, Boolean) 環境Bの出力内容 フォルダパス.クラス名 : Void Page_Load(System.Object, System.EventArgs) ### クラス名、メソッド名の取得方法 クラス名、メソッド名の取得は以下のようにしています。 ``` // クラス名の取得 new StackFrame(4).GetMethod().ReflectedType.FullName; // メソッド名の取得 new StackFrame(4).GetMethod(); ``` IISの設定が悪いのかとも思い、いろいろ試してみたのですが さっぱりわからず行き詰ってしまいました。 環境Aでも最初は正常に出力されていたのですが、 ビルドしなおしてからおかしくなりました。 ビルドオプションなどを変えてはいないはずなのですが原因がわかりません。 ↓ コードの最適化オプションがついていました。 あと、環境Aでも一部のページのみ正常に出力されます。 なにかご存知の方いらっしゃいましたらご教授お願いします。 以上よろしくお願いします。
回答: リリースビルドや最適化を行っているとStackFrameで取得できない場合があります。 参考:C# メソッドの呼び出し元メソッド名を取得するおまじない - Qiita > > リリースビルドにはシンボル情報がないため、ファイル、メソッド名、行番号が取得できないようです。 > > リリースビルドでもPDBファイルを生成すると、シンボル情報を利用できるようです。 > > 最適化を抑止しないと、正しいメソッド名、行番号が取れない場合があります。 > > >