C# 呼び出し元のファイル名、行数、関数名を取得

ログ出し用に使えますね。.Net4.5から用っぽい

        public void Debug(string mess,
            [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
            [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
            [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
        {
            string output = Path.GetFileName(sourceFilePath) + "-" + sourceLineNumber.ToString() + ":" + memberName + ":" + mess;
            logger.Debug(output);
        }

C#でlog4netの設定方法

設定ファイルを別途置かないやり方。

AssemblyInfo.cs に追記

// read Log4Net Configuration file
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

App.Configに以下追記

<configuration>
...
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
...
<log4net>
		<!--通常ログ:単一ファイル出力 -->
		<appender name="InfoLogDailyAppender" type="log4net.Appender.FileAppender">
			<file value="${APPDATA}\\会社名\\ソフト名\\Logs\\Info.log" />
			<appendtofile value="true" />
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMax" value="WARN" />
				<param name="LevelMin" value="INFO" />
			</filter>
			<layout type="log4net.Layout.PatternLayout"><ConversionPattern value="%date [%thread] [%-5level] %message%n" /></layout>
		</appender>
		<!--エラーログ:分割ファイル出力 -->
		<appender name="ErrorLogDailyAppender" type="log4net.Appender.RollingFileAppender">
			<!--ファイル名は日付ごと -->
			<param name="File" value="${APPDATA}\\会社名\\ソフト名\\Logs\\Error_" />
			<param name="DatePattern" value='yyyyMMdd".log"' />
			<param name="RollingStyle" value="date" />
			<param name="StaticLogFileName" value="false" />
			<param name="AppendToFile" value="true" />
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMax" value="FATAL" />
				<param name="LevelMin" value="ERROR" />
			</filter>
			<param name="MaximumFileSize" value="10MB" />
			<param name="MaxSizeRollBackups" value="10" />
			<layout type="log4net.Layout.PatternLayout"><ConversionPattern value="%date [%thread] [%-5level] %message%n" /></layout>
		</appender>
		<!--デバッグ用:分割ファイル出力 -->
		<appender name="DebugLogDailyAppender" type="log4net.Appender.RollingFileAppender">
			<!--ファイル名は日付ごと -->
			<param name="File" value="${APPDATA}\\会社名\\ソフト名\\Logs\\Trace_" />
			<param name="DatePattern" value='yyyyMMdd".log"' />
			<param name="RollingStyle" value="date" />
			<param name="StaticLogFileName" value="false" />
			<param name="AppendToFile" value="true" />
			<filter type="log4net.Filter.LevelRangeFilter">
				<!--<param name="LevelMax" value="FATAL" />
				-->
				<param name="LevelMin" value="TRACE" />
			</filter>
			<param name="MaximumFileSize" value="10MB" />
			<param name="MaxSizeRollBackups" value="10" />
			<layout type="log4net.Layout.PatternLayout"><ConversionPattern value="%date [%thread] [%-5level] %message%n" /></layout>
		</appender>
		<root>
			<!--TRACE以上のログを記録 -->
			<level value="TRACE" />
			<!--使用する Appender -->
			<appender-ref ref="InfoLogDailyAppender" />
			<appender-ref ref="ErrorLogDailyAppender" />
			<appender-ref ref="DebugLogDailyAppender" />
		</root>
	</log4net>
...
</configuration>

使うときの初期設定はこちら

ILog logger;
logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

こうすると
C:\Users\ユーザー名\AppData\Roaming\会社名\ソフト名\Logs にログがたまる

C#で時間のかかる処理でプログレスバー表示させてキャンセル受け付ける処理実装

Progress という名前のフォームを作って、
プログレスバー(progressBar1) と キャンセルボタン(button1)を貼り付ける。
コードは以下のように。
処理するのは文字列返す関数としている。

Progress.cs

// SetTitle() / SetFunction() で処理設定して ShowDialog()で実行 
// 処理関数の中で p.Report(100); したら処理完了と判断する
// その後 GetResult() でタスクで処理した結果の文字列受け取る
// キャンセル時には"キャンセル"が帰る
public partial class Progress : Form
{

    CancellationTokenSource cancelTokensource;  // キャンセル判定用
    string m_result;                            // 返り値

    // 初期化
    public Progress()
    {
        InitializeComponent();
    }

    // ウインドウタイトル設定
    public void SetTitle(string aTitle)
    {
        this.Text = aTitle;
    }

    // 処理関数設定
    public delegate string Func(IProgress<int> p, CancellationToken cancelToken);   // デリゲート宣言
    Func m_Func;
    public void SetFunction(Func aFunc)
    {
        m_Func = aFunc;
    }

    // 処理開始イベント
    Task<string> m_Task;
    private void Progress_Shown(object sender, EventArgs e)
    {
        cancelTokensource = new CancellationTokenSource();
        var cToken = cancelTokensource.Token;

        var p = new Progress<int>(ShowProgress);
        m_Task = Task.Run(() => m_Func(p, cToken));
    }

    // キャンセルボタンクリック
    private void button1_Click(object sender, EventArgs e)
    {
        this.button1.Enabled = false;   // もう一回は押せなくする
        if (cancelTokensource != null)
        {
            m_result = "キャンセル";
            cancelTokensource.Cancel();//キャンセルを発行
            m_Task.Wait();
            this.Close();
        }
    }

    //表示更新用
    private void ShowProgress(int percent)
    {
        this.progressBar1.Value = percent;

        // 100%で終了と判断する
        if( percent == 100 )
        {
            m_Task.Wait();
            m_result = m_Task.Result;
            this.Close();
        }

    }

    // 返り値取得
    public string GetResult()
    {
        return m_result;
    }

}


こっちはProgressを使って重い処理を実行する呼び出し側

string 重い処理(IProgress<int> p, CancellationToken cancelToken){
	// 重い処理する

	//...

	return "返り値";
}

private void button1_Click(object sender, EventArgs e)
	Progress progress = new Progress();
	progress.SetTitle("重い処理中");
	progress.SetFunction(重い処理);
	progress.ShowDialog();

	string result = progress.GetResult();
	if (result == "キャンセル")
	{
	    MessageBox.Show("キャンセルしました。");
	}
}

SeleniumでEdgeを利用(Seleniumのコンソールを隠す版)

NuGetでSelenium.SupportとSelenium.WebDriverをインストールして
実行ファイルと同じフォルダにMicrosoftWebDriver.exeがある前提。
MicrosoftWebDriver.exeはこちらからDL

            var service = EdgeDriverService.CreateDefaultService();
            service.HideCommandPromptWindow = true;
            EventFiringWebDriver driver = new EventFiringWebDriver(new EdgeDriver(service));
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);

            driver.Navigate().GoToUrl(”http://hoge.com”);