最終更新日 2024-09-25

Trace.WriteLine("...")やConsole.WriteLine("...")の確認方法

概要

print的で原始的なデバッグ手法となるTrace.WriteLineはどのように確認すればよいのでしょうか。
また、最も広く利用されているConsole.WriteLineを利用する方法はあるのでしょうか。

方法① HmDebugMonitorを使う方法

Trace.WriteLine による出力を確認する方法が一般的です。
この出力を捕捉するためには、秀丸エディタ・デバッグ出力モニターを利用します。
そちらを参照してください。

方法② Visual Studio でデバッグ実行して、出力で確認する方法

別記事「DllExport.bat」に対しての解説とはなりますが、設定の仕方などは同じです。
Visual Studio でのデバッグ も有力な候補となります。

方法③ コンソールを表示し、Console.Output.WriteLine を出力してしまう方法

以下の数行を追加するだけで、この.dllを呼び出すマクロを実行した際に、コンソールも一緒に表示されるようになります。
この方法は「該当マクロ製作中の一時的な簡便対処」として意外とおすすめです。

NET5COMServer.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace NET5COMServer
{
    [ComVisible(true)]
    [Guid("C144B4C1-27CB-401F-ABE8-55378564E18D")]
    public class NET5COMServer
    {
        [DllImport("kernel32.dll")]
        private static extern bool AllocConsole();

        // 静的コンストラクタ(static付きコンストラクタ)でコンソール表示を読んでおけば良い。
        static NET5COMServer()
        {
            AllocConsole();
        }

        public string str_add(string a, string b)
        {
            // コンソール枠にちゃんと出力される。
            Console.WriteLine(a+b);
            return a + b;
        }

        public int int_add(int a, int b)
        {
            // コンソール枠にちゃんと出力される。
            Console.WriteLine(a+b);
            return a + b;
        }
    }
}

この方法は、最初に1回ソースをいじくれば、以降コンソール出力があるかのように制作・確認していけるため、
お手軽です。

方法④ コンソールを表示し、Console.Output.WriteLine も Trace.WriteLine も 両方出力してしまう方法

この方法は1つ前の発展です。

NET5COMServer.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace NET5COMServer
{
    [ComVisible(true)]
    [Guid("C144B4C1-27CB-401F-ABE8-55378564E18D")]
    public class NET5COMServer
    {
        [DllImport("kernel32.dll")]
        private static extern bool AllocConsole();

        // 静的コンストラクタ(static付きコンストラクタ)でコンソール表示を読んでおけば良い。
        static NET5COMServer()
        {
            AllocConsole();

            // コンソールにトレース出力の受信能力を追加
            ConsoleTraceListener myWriter = new ConsoleTraceListener();
            Trace.Listeners.Add(myWriter);
        }

        public string str_add(string a, string b)
        {
            // コンソール枠にちゃんと出力される。
            Console.WriteLine(a+b);
            Trace.WriteLine("Traceもコンソールに出す:" + a + b);
            return a + b;
        }

        public int int_add(int a, int b)
        {
            // コンソール枠にちゃんと出力される。
            Console.WriteLine(a+b);
            Trace.WriteLine("Traceもコンソールに出す:" + (a + b).ToString());
            return a + b;
        }
    }
}

本来はConsoleを使うならConsoleだけ、Traceを使うならTraceだけと統一した方がよいですが、
ソースの切り貼りなどで一旦混じっている際の簡易な暫定処置としては有効利用できるでしょう。