c#

位置:IT落伍者 >> c# >> 浏览文章

使用.NET Framework 从VB6 中访问事件日志


发布日期:2020年07月30日
 
使用.NET Framework 从VB6 中访问事件日志

作者Swigart Consulting LLC 的 Scott Swigart

简介

Visual Basic 可通过AppLogEvent写入事件日志但是此 API 有许多严格的限制首先不能为事件定义来源(在事件查看器中始终显示为VBRuntime而且不能指定事件 ID 或事件类别还限制您只能写入应用程序事件日志不能创建自己的自定义来源和日志

通过使用 NET Framework 免费提供的类可以克服所有这些限制这样可以使您有效地编写应用程序以便用户管理员或其他支持人员都可以查看日志来诊断问题

NET Framework EventLog 类

NET Framework 提供了一个强大的 EventLog 类用它可以轻松地处理事件日志不过您不能直接从 VB 访问此类依照 VB Fusion(英文)系列文章中的精神可以通过创建封装 NET 类的 COM 包装从 VB 中访问此功能

我还创建了一个练习此事件日志功能的示例 VB 应用程序

使用事件日志功能的 VB 应用程序

创建包装类时大部分工作只是将 NET 类型转换为 VB 可以理解的类型GetEventLogs 方法通常返回一组 EventLog 对象不过不能直接从 VB 中使用这些 EventLog 对象但是下列 VBNET 函数将计算机上的所有事件日志的列表转换为一组字符串VB 很容易就可以使用这些字符串通常您拥有系统事件日志安全性事件日志和应用程序事件日志但是某些应用程序还会创建自己的自定义事件日志而此方法还可以显示这些事件日志

清单 使用 VBNET 列出计算机上的所有事件日志

Public Function GetEventLogs() As String()Dim logs(EventLogGetEventLogsLength ) As StringDim i As Integer = For Each el As EventLog In EventLogGetEventLogs()logs(i) = elLogi += NextReturn logsEnd Function

您可以看到EventLog 类使您能够通过 GetEventLogs 函数访问所有事件日志调用此函数后它就会遍历结果并将所有事件日志名称转换为一组字符串然后可以将此 VBNET 代码作为 COM 对象进行公开从而允许从 VB 中调用它

从 VB 中调用此代码以及(例如)用结果填充列表框就像下面这样简单

清单 使用 VB 在列表框中显示日志名称

Dim eventLog As NetFrameworkWrappersEventLogWrapperSet eventLog = New NetFrameworkWrappersEventLogWrapperlstEventLogsClearDim logs() As Stringlogs = eventLogGetEventLogsDim log As VariantFor Each log In logslstEventLogsAddItem logNext

方法

由于各种原因您可能希望应用程序能够写入事件日志当然应该将任何灾难性错误都记录到事件日志中因为此信息以后可以用来诊断问题您可能经常希望将不适合显示给用户的详细信息写入该事件日志中

首先需要选择使用哪个日志可以从系统事件日志安全性事件日志或应用程序事件日志中进行选择应用程序事件日志几乎总是正确的选择但是如果需要也可以创建自己的自定义事件日志事件日志包装中的下列 VBNET 代码使您能够创建自己的自定义日志

清单 使用 VBNET 创建自定义事件日志

Public Sub CreateEventSource(ByVal source As String ByVal logName As String)If EventLogSourceExists(source) ThenEventLogDeleteEventSource(source)End IfEventLogCreateEventSource(source logName)End Sub

您可以看到使用 NET Framework 可以轻松创建事件日志NET CreateEventSource 方法帮您完成了所有工作此方法只提供了该功能以便可以从 VB 中轻松调用

清单 使用包装类从 VB 创建事件日志

Dim eventLog As NetFrameworkWrappersEventLogWrapperSet eventLog = New NetFrameworkWrappersEventLogWrappereventLogCreateEventSource MyApplication MyCustomLog

向事件日志写入条目同样很简单WriteEntry VBNET 方法可以实现该事件日志功能并提供该功能以便可以从 VB 中调用该方法

清单 在 VBNET 中向事件日志写入条目

Public Sub WriteEntry(ByVal source As String _ByVal message As String _Optional ByVal type As String = Information _Optional ByVal eventID As Integer = _Optional ByVal category As Short = )Dim typeEnum As EventLogEntryType = _SystemEnumParse(GetType(EventLogEntryType) type)m_eventLogWriteEntry(source message typeEnum eventID category)End Sub

此包装方法提供了许多可选参数因此从 VB 中调用该方法时您可以仅传递事件日志来源和消息也可以传递消息类型事件 ID 和/或事件类别

可以使用下列代码从 VB 中调用此方法

清单 在 VB 中写入事件日志条目

Dim eventLog As NetFrameworkWrappersEventLogWrapperSet eventLog = New NetFrameworkWrappersEventLogWrappereventLogWriteEntry cboLogText txtMessage cboTypeText _txtID txtCategory

读取日志

从事件日志中读取信息只是稍微有些复杂NET Framework EventLog 类有一个 GetEntries 方法它可以返回给定(应用程序系统等)事件日志的所有日志条目问题是每个条目都是作为 EventLogEntry 对象返回的不能将它们直接传递回 VB但是我可以简单地创建自己的 EventLogEntryInfo 类用于将每个事件日志条目复制到其中它是一个完整的 COM 类可以返回到 VB并且提供了条目来源消息类型ID 和类别属性然后VBNET 代码将使用事件日志条目数据填充这些属性并将其返回以便可以从 VB 中使用

清单 在 VBNET 中读取并转换事件日志条目

Public Sub GetEntries(ByRef entries() As EventLogEntryInfo)ReDim entries(m_eventLogEntriesCount )For i As Integer = To m_eventLogEntriesCount Dim ent As EventLogEntry = m_eventLogEntries(i)entries(i) = New EventLogEntryInfoentries(i)Category = entCategoryNumberentries(i)Message = entMessageentries(i)Source = entSourceentries(i)EventID = entEventIDentries(i)EntryType = entEntryTypeNextEnd Sub

完成此函数后VB 便可以完全访问事件日志条目了

清单 在 VB 中获取事件日志条目

Dim eventLog As NetFrameworkWrappersEventLogWrapperSet eventLog = New NetFrameworkWrappersEventLogWrappereventLogInit logNameDim entries() As NetFrameworkWrappersEventLogEntryInfoeventLogGetEntries entries

结论

我相信您不需要重写现有的 VB 应用程序便可利用 NET F ramework 提供的扩展功能正如 VB Fusion 系列文章中所说的使用这些简单的包装类便可以通过 COM 对象提供 NET Framework 的功能该 COM 对象可以用于 VBVBAASP 或可以访问 COM 对象的任何环境在本文中您看到了如何将功能丰富的事件日志功能添加到现有的 VB 应用程序中欢迎下载相关的示例代码以便将事件日志添加到现在的应用程序中

Scott Swigart 传记

Scott Swigart 从事合并技术和聚合技术的咨询写作和讲解工作Scott 在其职业生涯中涉及的技术范围很广 岁开始 Commodore 编程工作用 C++ 语言为 UNIX 系统编写硬件诊断建立 Windows 桌面和 Web 应用程序在这些年里Scott 涉及了组件开发XML 技术NETWeb 服务以及其他语言平台和模式由于他的这些经历Scott 已经体会到技术是如何随着时间而不断发展进步的他致力于帮助组织从当今的技术中获得最大利益同时为明天的技术做准备Scott 还是 Microsoft MVP并且是许多书籍和文章的合着者Scott 的联系方式scott@s

上一篇:最简单的C#快速入门教程

下一篇:C#实现IE浏览器添加快捷菜单