Dot-Net-4.5
為什麼在 EventSource 的子類上實現介面會在執行時拋出異常?
我正在嘗試通過.NET 4.5 中包含的EventSource類在我的 .NET 應用程序中使用Windows 事件跟踪 (ETW) 。我將子類化為並嘗試實現一個介面(用於模擬目的),如下所示:
EventSource``MyEventSource``IMyEventSourcepublic interface IMyEventSource { void Test(); } public class MyEventSource : EventSource, IMyEventSource { public static MyEventSource Log = new MyEventSource(); [Event(1)] public void Test() { this.WriteEvent(1); } }當我執行PerfView並執行此程式碼時,我收到了
IndexOutOfRangeException對WriteEvent. 如果我通過修改程式碼來刪除介面……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開始支持這些方案