0

我正在尝试使用 ETW 日志编译一个简单的项目。已添加 EventSource 作为 NuGet 参考。当我有Event这样的属性时

[Event(1, Message = "开始时基地发生了什么事:{0}")]

它没有工作,但至少它成功编译了。然后我改变了属性,变成了这样

[Event(2, Level = EventLevel.Error, Message = "Base stp {0}", Keywords = EventKeywords.All)]

我开始得到

意外错误:算术运算导致溢出。

  1. 有没有办法解决它并且不改变我的课程结构?
  2. 有没有办法调试或至少以某种方式调查 eventRegister.exe 中的错误?

我的命令行是:

Documents\Visual Studio 2015\Projects\Console1\packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.28\build\eventRegister.exe" -DumpRegDlls @"Documents\Visual Studio 2015\Projects\Console1\Common\bin\Debug\ Common.eventRegister.rsp" "Documents\Visual Studio 2015\Projects\Console1\Common\bin\Debug\Common.dll"

可以在此处找到测试示例的代码。

4

1 回答 1

0

在这种情况下,问题是在事件定义中使用“Keywords = EventKeywords.All”。EventKeywords.All 不适用于事件。它的意思是“所有 64 个关键字”,实际上是非法的,因为保留了最高位。EventKeywords.All 值是为方便设置事件侦听器或检查事件掩码而定义的,但不应在定义事件时使用。在这种情况下,EventRegister 不希望事件将其用于关键字值,因此它遇到了异常。(这在运行时也会出现问题,因为 EventSource 会抱怨使用保留关键字。)

您是否在使用 EventRegister 创建的清单?EventRegister 工具反映您的程序集,并为程序集中从 EventSource 继承的每个类生成一个清单文件。如果您不使用它生成的清单,则不需要运行它。有几件事会混淆 EventRegister 工具并导致它失败。

如果您不使用清单,您可以在 .csproj 文件中禁用 EventRegister,或者您可以让您的项目依赖于“EventSource Redistributable”而不是“EventSource”,这样您就可以访问 EventSource DLL 而无需添加 EventRegister构建过程。

另请注意,EventSource 内置于 .NET 4.5 及更高版本 - 如果您需要在较旧的 .NET 运行时上运行项目,则仅需要 NuGet。内置版本的执行速度也快得多(因为它不需要太多 JIT ——所有内置运行时 DLL 在安装过程中都会进行 JIT)。

最后一点是,.NET 4.6 和 NuGet 1.1.24 及更高版本的 EventSource 有一个“无清单”选项,可以完全消除清单。它们还有一个 eventSource.Write 方法,允许您直接编写事件而无需跟踪事件 ID。所以而不是:

[EventSource]
class MyEventSource : EventSource
{
    [Event(...)]
    public void MyEvent(...)
    {
        WriteEvent(...);
    }
}

es = new MyEventSource();
es.MyEvent(23, "Hello");

你可以这样做:

es = new EventSource("MyEventSourceName");
es.Write("MyEvent", new {
    Number = 23,
    Name = "Hello"
});
于 2016-06-10T00:01:02.183 回答