メッセージファイルDLLを利用してイベントログを書き込む - C#

C#でメッセージファイルDLLを利用してイベントログを書き込むコードを紹介します。+

事前準備

こちらの記事で紹介している手順でメッセージファイルDLLを作成します。

メッセージのIDの確認

メッセージファイルDLLを作成した際に生成されるヘッダファイル(*.h)を開き、メッセージのIDを確認します。下図の例では、MSG_BAD_COMMAND のIDは 0xC0021001 であることがわかります。

プログラム

Windows フォームアプリケーションを作成します。

メッセージファイルDLLの追加

先に作成したメッセージファイルDLLをソリューションに追加します。追加したDLLファイルのプロパティの[出力ディレクトリにコピー]の値を"常にコピーする"に変更します。

UI

下図のUIを作成します。フォームにボタンを一つ配置します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace WriteEventLog
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string SourceName = "WriteEventLogC";

      if (EventLog.SourceExists(SourceName) == false) {
        EventSourceCreationData escd = new EventSourceCreationData(SourceName, "Application");
        escd.MessageResourceFile = "LogMessages.dll"; 
        //escd.MessageResourceFile = @"d:\data\LogMessages.dll";//相対パスでも絶対パスでも可
        EventLog.CreateEventSource(escd);
      }
      EventInstance ei = new EventInstance(0xC0021001L, 0, EventLogEntryType.Information);
      EventLog.WriteEvent(SourceName, ei, "Values 123456");
    }
  }
}

解説

ソース名からイベントソースが作成されているか確認します。イベントソースが作成されていない場合はイベントソースを作成します。
  string SourceName = "WriteEventLogC";
  if (EventLog.SourceExists(SourceName) == false) {
    //...中略...
  }

イベントソースの作成は下記のコードになります。EventSourceCreationData オブジェクトを作成します。コンストラクタの第一引数にソース名を与えます、第二引数にイベントを記録するログの種別を指定します。種別は"Application" "System" またはカスタムログの名称を与えます。省略して空文字にした場合は"Application"が設定されます。
MessageResourceFile プロパティに作成したメッセージファイルDLLのパスを設定します。
EventLog.CreateEventSource() メソッドでイベントソースを作成します。メソッドの引数にEventSourceCreationData オブジェクトを与えます。
  EventSourceCreationData escd = new EventSourceCreationData(SourceName, "Application");
  escd.MessageResourceFile = "LogMessages.dll";
  EventLog.CreateEventSource(escd);

イベントログへの書き込みコードは下記になります。EventInstance オブジェクトを作成します。コンストラクタの第一引数に書き込むメッセージのメッセージIDを与えます、メッセージIDは先に調べたメッセージファイルDLLのヘッダファイルの値になります。第二引数にカテゴリ番号、第三引数にログのタイプを与えます。
ログの書き込みは EventLog.WriteEvent メソッドで実行します。第一引数にイベントソース名を、第二引数に EventInstance オブジェクト、第三引数にログの値を与えます。
  EventInstance ei = new EventInstance(0xC0021001L, 0, EventLogEntryType.Information);
  EventLog.WriteEvent(SourceName, ei, "Values 123456");

実行結果

管理者(Administrator)としてプロジェクトを実行します。Administratorとして実行する方法はこちらの記事こちらの記事を参照して下さい。下図のウィンドウが表示されます。[button1]をクリックします。


イベントビューアーを確認します。指定したソースでイベントの書き込みがあることが確認できます。


イベントの詳細を確認します。メッセージDLLに設定したメッセージが書き込まれていることが確認できます。


EventDataには、EventLog.WriteEvent() メソッドの第三引数で与えた値が設定されていることも確認できます。


メッセージファイルDLLを利用して、イベントログの書き込みができました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2020-02-01
作成日: 2018-08-28
iPentec all rights reserverd.