C#でもC言語のプリプロセッサにある__FILE__や__LINE__みたいなのが欲しい。そしたらログ出力等で便利だからね。

という訳で自分の場合はこんな感じでスタック情報からファイル名と行番号を取得して出力してます。

ソースはC#ですよ。

using System;
using System.Text;
using System.IO;
using System.Diagnostics;

namespace TestApp
{
     class Program
     {
         class Logfunc
         {
             private string LogPath = ".\\";
             private StreamWriter writer = null;

             public void LogPut(StackFrame CallStack, string msg)
             {
                 try
                 {
                     string myname = CallStack.GetFileName();
                     int myline = CallStack.GetFileLineNumber();

                     Encoding enc = Encoding.GetEncoding("Shift_JIS");

                     DateTime dt = DateTime.Now;
                     string fnamedt = dt.ToString("yyyyMMdd");
                     string fpath = LogPath + "hoge_" + fnamedt + ".log";

                     using (writer = new StreamWriter(fpath, true, enc))
                     {
                         string result = dt.ToString("yyyy/MM/dd HH:mm:ss");
                         writer.WriteLine(result + "\t" + myname + "\t" 
+ myline.ToString() + "\t" + msg);
                     }
                 }
                 catch (Exception e)
                 {
                     Console.WriteLine(e.Message);
                 }
                 finally
                 {
                     if (writer != null)
                     {
                         writer.Close();
                         writer = null;
                     }
                 }
             }
         }

         static void Main(string[] args)
         {
             Logfunc lf = new Logfunc();

             lf.LogPut(new StackFrame(0, true), "TEST LINE 1");
             lf.LogPut(new StackFrame(0, true), "TEST LINE 2");
             lf.LogPut(new StackFrame(0, true), "TEST LINE 3");
             lf.LogPut(new StackFrame(0, true), "TEST LINE 4");


         }
     }
}

※かなり強引に書いたサンプルなのでノリだけ見ていただければ。

StackFramについてはマイクロソフトサイトで見てくださいね。

StackFram引数の一番目はスタックの階層表してるので何某かのエラーが発生して現在ではなく直前の状態が欲しい場合は0ではなくて1とかになりますね。

一度色々試すと意味がわかるかと思います。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする