C#到VB.Net的转换,RaiseEvent的烦恼

标签 c# vb.net

我已将进程创建观察器从 C# 转换为 VB.Net,但在转换给我带来麻烦的特定代码行时遇到问题。

这是原始的 C# 代码:

using System;
using System.ComponentModel;
using System.Collections;
using System.Globalization;
using System.Management;

namespace WMI.Win32
{
    public delegate void ProcessEventHandler(Win32_Process proc);
    public class ProcessWatcher : ManagementEventWatcher
    {
        // Process Events
        public event ProcessEventHandler ProcessCreated;
        public event ProcessEventHandler ProcessDeleted;
        public event ProcessEventHandler ProcessModified;

        // WMI WQL process query strings
        static readonly string WMI_OPER_EVENT_QUERY = @"SELECT * FROM 
        __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA'Win32_Process'";
        static readonly string WMI_OPER_EVENT_QUERY_WITH_PROC =
        WMI_OPER_EVENT_QUERY + " and TargetInstance.Name = '{0}'";

    public ProcessWatcher()
    {
        Init(string.Empty);
    }
    public ProcessWatcher(string processName)
    {
        Init(processName);
    }
    private void Init(string processName)
    {
        this.Query.QueryLanguage = "WQL";
        if (string.IsNullOrEmpty(processName))
        {
            this.Query.QueryString = WMI_OPER_EVENT_QUERY;
        }
        else
        {
            this.Query.QueryString =
                string.Format(WMI_OPER_EVENT_QUERY_WITH_PROC, processName);
        }

        this.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
    }
    private void watcher_EventArrived(object sender, EventArrivedEventArgs e)
    {
        string eventType = e.NewEvent.ClassPath.ClassName;
        Win32_Process proc = new 
            Win32_Process(e.NewEvent["TargetInstance"] as ManagementBaseObject);

        switch (eventType)
        {
            case "__InstanceCreationEvent":
                if (ProcessCreated != null) ProcessCreated(proc); break;
            case "__InstanceDeletionEvent":
                if (ProcessDeleted != null) ProcessDeleted(proc); break;
            case "__InstanceModificationEvent":
                if (ProcessModified != null) ProcessModified(proc); break;
        }
    }
}

// Auto-Generated running: mgmtclassgen Win32_Process /n root\cimv2 /o WMI.Win32
// Renaming the class from Process to Win32_Process
public class Win32_Process { ... }
}

这是 VB.Net 转换:

Imports System.ComponentModel
Imports System.Collections
Imports System.Globalization
Imports System.Management

Namespace WMI.Win32
Public Delegate Sub ProcessEventHandler(proc As Win32_Process)
Public Class ProcessWatcher
    Inherits ManagementEventWatcher
    ' Process Events
    Public Event ProcessCreated As ProcessEventHandler
    Public Event ProcessDeleted As ProcessEventHandler
    Public Event ProcessModified As ProcessEventHandler

    ' WMI WQL process query strings
    Shared ReadOnly WMI_OPER_EVENT_QUERY As String = "SELECT * FROM " & vbCr & vbLf & "__InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"
    Shared ReadOnly WMI_OPER_EVENT_QUERY_WITH_PROC As String = WMI_OPER_EVENT_QUERY + " and TargetInstance.Name = '{0}'"

    Public Sub New()
        Init(String.Empty)
    End Sub
    Public Sub New(processName As String)
        Init(processName)
    End Sub
    Private Sub Init(processName As String)
        Me.Query.QueryLanguage = "WQL"
        If String.IsNullOrEmpty(processName) Then
            Me.Query.QueryString = WMI_OPER_EVENT_QUERY
        Else
            Me.Query.QueryString = String.Format(WMI_OPER_EVENT_QUERY_WITH_PROC, processName)
        End If

        Me.EventArrived += New EventArrivedEventHandler(AddressOf watcher_EventArrived)
    End Sub
    Private Sub watcher_EventArrived(sender As Object, e As EventArrivedEventArgs)
        Dim eventType As String = e.NewEvent.ClassPath.ClassName
        Dim proc As New Win32_Process(TryCast(e.NewEvent("TargetInstance"), ManagementBaseObject))

        Select Case eventType
            Case "__InstanceCreationEvent"
                RaiseEvent ProcessCreated(proc)
                Exit Select
            Case "__InstanceDeletionEvent"
                RaiseEvent ProcessDeleted(proc)
                Exit Select
            Case "__InstanceModificationEvent"
                RaiseEvent ProcessModified(proc)
                Exit Select
        End Select
    End Sub
End Class


End Namespace

我在处理这行代码时遇到了问题:

Me.EventArrived += New EventArrivedEventHandler(AddressOf watcher_EventArrived)

我似乎无法弄清楚如何正确转换它,感谢您的帮助!

最佳答案

这一行:

Me.EventArrived += New EventArrivedEventHandler(AddressOf watcher_EventArrived)

应该是:

AddHandler Me.EventArrived , AddressOf Me.watcher_EventArrived

关于C#到VB.Net的转换,RaiseEvent的烦恼,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34277855/

相关文章:

c# - 还有另一种测试枚举位域的方法吗?

regex - 如何使用正则表达式在 HTML 文本中查找所有 url?

vb.net - 读取异步网络流

c# - 使用 .NET 进行 Excel 文件解析/抓取

c# - 是否可以将委托(delegate)作为属性参数?

c# - 如何在 C# 中实现基于苹果 token 的推送通知(使用 p8 文件)?

c# - 您如何知道 PayPal 购物车何时被遗弃?

asp.net - 无法理解从 HTML 导出 Excel 电子表格的代码

vb.net - 标记暂存站点以防止将其用作生产站点

vb.net - 控制台应用程序不想读取标准输入