C# クラスライブラリ、プラグイン開発時に便利な、アプリケーション側からデバッガに接続する方法。

Visual Studio でアプリケーション開発を行っている際によく使用する「デバッグの開始 (F5)」。
Visual Studio をアタッチ(デバッガと接続)した状態で、スタートアッププロジェクトのアプリケーションを起動する。

その逆で、アプリケーション側からデバッガへ接続する方法も用意されている。次がその関数になる。

System.Diagnostics.Debugger.Launch();

環境

Windows10 pro 64bit
Visual Studio 2019

実際にためしてみた

static class Program
{
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main()
    {
        System.Diagnostics.Debugger.Launch(); // デバッガへ接続

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new TestForm());
    }
}

ビルドされた実行ファイルを直接起動すると接続先を選ぶウィンドウが表示された。

visual-studio-debugger-Launch

起動中の Visual Studio を選ぶと、System.Diagnostics.Debugger.Launch() 箇所でブレークした状態になってくれた。

visual-studio-debugger-Launch-break

「new instance of ...」を選ぶと新規で Visual Studio が起動し上記と同様となるが
ソリューションエクスプローラーにはソースなどもない状態での新規ソリューションとしての起動となってしまい別の個所にブレークを仕掛けたりするのができない。

visual-studio-debugger-Launch-new
ソリューションエクスプローラーにソースなどが全くない

これを回避するには対象のソリューションを Visual Studio で開いておき、それに接続すればよいが これって「デバッグの開始 (F5)」 でいいんじゃ?と思ってしまった。

よくよく考えてみるとメインエントリポイントに仕掛ける必要は無かった

Visual Studio には起動済みのプロセスに後からアタッチする機能もある。
よく使うのはクラスライブラリやプラグインなどの DLL を制作している場合だ。
しかし、アプリケーション起動後に後からアタッチした場合、すでに初期化処理などが終わっておりその部分のデバッグができないという場面がある。
こういった場合に有効なのでは?と思い試してみた。

クラスライブラリ側の例

namespace SampleClassLib
{
    static public class Debug
    {
        public static void DebuggerLaunch()
        {
            System.Diagnostics.Debugger.Launch();
        }
    }
}

アプリケーション側の例

private void Button1_Click(object sender, EventArgs e)
{
	// ボタンがクリックさせた場合にクラスライブラリの処理が走る想定
    SampleClassLib.Debug.DebuggerLaunch();
}

結果

  • アプリケーション起動後にボタンをクリックすると接続先を選ぶウィンドウが表示されデバッガに接続可能。
  • 1度デバッガに接続した後はボタンをクリックしても接続先を選ぶウィンドウはでない。(継続)
  • デバッグを停止後再度ボタンをクリックすると、 接続先を選ぶウィンドウが表示され再度デバッガに接続が可能。(再接続)

うまくいった。これは便利。

複数のクラスライブラリ、プラグイン開発時

結果の「1度デバッガに接続した後はボタンをクリックしても接続先を選ぶウィンドウはでない。(継続)」より1つのアプリケーションから2つのデバッガには接続できなさそう。

しかし、1つのアプリケーションに対して2つ以上のクラスライブラリを作成する場合もある。
その場合は1つのソリューション内で複数のクラスライブラリプロジェクトを管理すれば同時にデバッグ可能。

visual-studio-debugger-2lib