索引超出数组的范围

时间:2013-01-02 10:30:10

标签: .net vb.net winforms visual-studio-2010 process

我正在尝试监控用户选择的流程。我正在做的是尝试从进程名称获取文件名,因此当找不到进程时它可以再次启动它。现在我不明白我的问题。我在这里收到错误:Dim s As String = ProcessArray(0).MainModule.FileName

我不明白的是它正在返回文件名。任何人都可以帮我解决这个问题吗?

    Dim ProcessArray As Process()
    ProcessArray = Process.GetProcessesByName(procName)
    Dim s As String = ProcessArray(0).MainModule.FileName
    Dim f As Process
    Dim p As Process() = Process.GetProcessesByName(procName)

    For Each f In p
        If p.Length > 0 Then
            For i As Integer = 0 To p.Length - 1
                ProcessID = (p(i).Id)
            Next
        Else
            ProcessID = 0
        End If
        If ProcessID = 0 Then
            BotRunning = False
            Process.Start(s)
            watchdogbool = True
            RunBot(watchdogList, ItemClicked.Text, -1)
        End If
    Next

4 个答案:

答案 0 :(得分:1)

如果找不到该进程,则找到的进程数组将为空。因此,您无法访问其第一个元素。在s的声明中,你假设你总是至少有一个结果。

答案 1 :(得分:1)

正如其他人已经说过的那样,当没有找到给定名称的进程时,就会发生错误。因此,s在发生错误时具有有效值的唯一方法是,如果在循环内执行代码并且s具有上一次迭代的值(进程仍在运行中),则实际的错误发生了。

最重要的是,您希望实现的代码和描述不匹配。基本上如果你想在你的程序找不到它时再次启动它,那么我会期待某种循环。

我猜你想要这样的东西:

Public Sub WatchProcess(procName As String)
    Dim processArray As Process() = Process.GetProcessesByName(procName)
    ' The process must be running when your program starts. If not, throw an exception
    If processArray.Length = 0 Then Throw New ArgumentException("no such process", "procName")

    Dim fileName As String = processArray(0).MainModule.FileName

    While True ' Looking for the process endlessly. Use other conditions proper for you.
        If Process.GetProcessesByName(procName).Length = 0 Then
            ' The process is not running anymore, start it again!
            ' Do all the other stuff you wanna do (set bool flags etc.)
            Process.Start(fileName)
        End If
        Thread.Sleep(5000) ' Wait 5 seconds until the next check
    End While
End Sub

重要的是,这将永远阻止调用线程。因此,您需要使用多线程,让一个线程调用一个procName的方法(如果您想在UI中提供反馈或观察多个进程)。

正如您在评论中所说,您可以获得Win32Exception声明您无法使用32位进程访问64位进程。要解决此问题,请以与观察过程相同的模式启动您自己的程序(在项目设置=> Compile =>高级编译选项=>目标CPU 下强制目标CPU)。有关详细信息,请参阅相应的其他问题like this one

答案 2 :(得分:0)

在获得filename检查之前ProcessArray不为空,然后继续返回

答案 3 :(得分:0)

此行不返回任何元素

  

ProcessArray = Process.GetProcessesByName(procName)

这就是为什么当你访问数组的第一个元素(哪个是空的)然后它会给你错误

  

索引超出数组范围   的解决方案   检查对象null

if(ProcessArray !=null)
   Dim s As String = ProcessArray(0).MainModule.FileName
   MessageBox.Show("File name is " & ProcessArray(0).MainModule.FileName)

OR
if(ProcessArray.Length>0)
   Dim s As String = ProcessArray(0).MainModule.FileName