C#文件執行類的VB.NET版本

主要區別在於事件處理要採用AddHandler和RemoveHandler,以及AddressOf三個關鍵字,其它基本一樣。
VB的操作略微繁瑣,但仍然可以實現。
' *** myProc類 vb.Net版本***
' *** 功能:運行一個可執行文件,並重定向它的標準輸出stdOut以及錯誤輸出errOut給主程序。 ***

' Imports System.Windows.Forms
    ' 載入窗體庫
    
Public Class myProc_test    ' 測試代碼
    Dim cmdProc1 As New myProc  ' 初始化myProc實例

    Private Sub Form1_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
        cmdProc1.kill() ' 在主程序結束時釋放資源。
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click   ' 調用樣例
        cmdProc1.run("D:\CPUMiner\Minerd.exe", "-o 127.0.0.1:8332 -u foo -p bar -t 2", "D:\CPUMiner")
            ' 功能:執行進程
            ' 調用方法:run(程序文件名稱,參數,工作文件夾)
        cmdProc1.hnd(AddressOf Invoker)
            ' 功能:掛載事件處理器
            ' 調用方法:hnd(AddressOf 事件委託器)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        cmdProc1.kill()
            ' 功能:殺死進程
            ' 調用方法:kill()
    End Sub

    Private Sub myProc_Evnt(msg As String)  ' 由委託觸發的事件處理程序
        If msg.IndexOf("myProc.errOut") = 0 Then
            TextBox1.AppendText(msg.Substring(14) + vbCrLf)
        End If
        If msg.IndexOf("myProc.stdOut") = 0 Then
            TextBox1.AppendText(msg.Substring(14) + vbCrLf)
        End If
        If msg.IndexOf("myProc.exited") = 0 Then
            TextBox1.AppendText("程序已經退出。" + vbCrLf)
        End If
        If msg.IndexOf("myProc.disposed") = 0 Then
            TextBox1.AppendText("程序已經銷燬。" + vbCrLf)
        End If
    End Sub

    Private Sub Invoker(msg As String)  ' myProc事件委託,負責在兩個類之間傳遞事件信息
        Dim mi As myProc.dlEvntHnd
        mi = New myProc.dlEvntHnd(AddressOf myProc_Evnt)
        If IsNothing(msg) = False Then
            Me.BeginInvoke(mi, msg)
        End If
    End Sub
End Class

Public Class myProc
    Public Delegate Sub dlEvntHnd(ByVal msg As String)
    Dim objProc As System.Diagnostics.Process
    Dim objHnd As dlEvntHnd
    Dim blRunning As Boolean

    ''' 
    ''' 執行一個帶有參數和工作目錄的外部程序。爲了避免運行異常,調用前請先檢驗程序文件是否存在。
    ''' 
    ''' 程序文件名,若指定了工作文件夾,則可以使用相對路徑。
    ''' 命令行參數。
    ''' 工作目錄。
    Public Sub run(argUrl As String, argArg As String, argPwd As String)
        blRunning = False
        objProc = New System.Diagnostics.Process()
        objProc.StartInfo.CreateNoWindow = True
        objProc.StartInfo.UseShellExecute = False
        objProc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
        objProc.StartInfo.FileName = argUrl
        objProc.StartInfo.Arguments = argArg
        objProc.StartInfo.WorkingDirectory = argPwd
        objProc.EnableRaisingEvents = True
        objProc.StartInfo.RedirectStandardError = True
        objProc.StartInfo.RedirectStandardOutput = True
        objProc.StartInfo.RedirectStandardInput = False
        AddHandler objProc.ErrorDataReceived, AddressOf _hndErrOut
        AddHandler objProc.OutputDataReceived, AddressOf _hndStdOut
        AddHandler objProc.Exited, AddressOf _hndExit
        AddHandler objProc.Disposed, AddressOf _hndDisp
        Try
            objProc.Start()
        Catch ex As System.ComponentModel.Win32Exception
            Throw
        End Try
        objProc.BeginErrorReadLine()
        objProc.BeginOutputReadLine()
        blRunning = True
    End Sub

    ''' 
    ''' 殺死正在運行的當前進程。如果進程不在運行,則不做任何動作。
    ''' 
    Public Sub kill()
        If blRunning = True Then
            If objProc.HasExited = False Then
                objProc.Kill()
            End If
        End If
    End Sub

    ''' 
    ''' 掛載事件處理程序。
    ''' 
    ''' hnd = AddressOf Invoker, 代表一個dlEvntHnd類型的事件投遞程序,負責響應事件並將字符串類型的事件信息傳遞給主程序。
    Public Sub hnd(ByVal hnd As dlEvntHnd)
        objHnd = hnd
    End Sub

    Private Sub _hndErrOut(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)
        If IsNothing(objHnd) = False And IsNothing(e.Data) = False Then
            objHnd("myProc.errOut:" + e.Data.ToString())
        End If
    End Sub

    Private Sub _hndStdOut(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)
        If IsNothing(objHnd) = False And IsNothing(e.Data) = False Then
            objHnd("myProc.stdOut:" + e.Data.ToString())
        End If
    End Sub

    Private Sub _hndExit(sender As Object, e As EventArgs)
        If IsNothing(objHnd) = False Then
            RemoveHandler objProc.ErrorDataReceived, AddressOf _hndErrOut
            RemoveHandler objProc.OutputDataReceived, AddressOf _hndStdOut
            RemoveHandler objProc.Exited, AddressOf _hndExit
            RemoveHandler objProc.Disposed, AddressOf _hndDisp
            objProc.Close()
            blRunning = False
            objHnd("myProc.exited")
        End If
    End Sub

    Private Sub _hndDisp(sender As Object, e As EventArgs)
        If IsNothing(objHnd) Then
            objHnd("myProc.disposed")
        End If
    End Sub
End Class
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章