Dot-Net-4.5

為什麼在 EventSource 的子類上實現介面會在執行時拋出異常?

  • April 18, 2019

我正在嘗試通過.NET 4.5 中包含的EventSource類在我的 .NET 應用程序中使用Windows 事件跟踪 (ETW) 。我將子類化為並嘗試實現一個介面(用於模擬目的),如下所示:EventSource``MyEventSource``IMyEventSource

public interface IMyEventSource
{
 void Test();
}

public class MyEventSource : EventSource, IMyEventSource
{
 public static MyEventSource Log = new MyEventSource();

 [Event(1)]
 public void Test()
 {
   this.WriteEvent(1);
 }
}

當我執行PerfView並執行此程式碼時,我收到了IndexOutOfRangeExceptionWriteEvent. 如果我通過修改程式碼來刪除介面……

public class MyEventSource : EventSource
{
 public static MyEventSource Log = new MyEventSource();

 [Event(1)]
 public void Test()
 {
   this.WriteEvent(1);
 }
}

…然後一切正常。

這是我在這兩種情況下用於測試的程式碼:

static void Main(string[] args)
{
 MyEventSource.Log.Test();
}

EventSource如果我的子類只是實現一個介面,為什麼它會中斷?

這是一個相關的文章

在提出問題時,@LarsSkovslund 的回答是正確的。然而,隨著微軟.Diagnostics.Tracing.EventSource的穩定版本,微軟根據他們的部落格文章改變了這一點

在 RTM 版本中,我們放寬了一些事件源驗證規則,以啟用某些高級使用場景。

這方面的兩個變化:

  • EventSource 類型現在可以實現介面,以便在高級日誌系統中使用事件源類型,這些系統使用介面來定義公共日誌目標。
  • 引入了實用程序事件源類型(定義為派生自 EventSource 的抽像類)的概念,以支持在項目中跨多個事件源類型共享程式碼(例如,用於優化的 WriteEvent() 重載)。

System .Diagnostics.Tracing.EventSource 隨 .NET Framework 提供,從.NET 4.6開始支持這些方案

引用自:https://stackoverflow.com/questions/16301553