2009-06-09 2 views
0

Поднял старый проект VB.NET, первоначально написанный для версии 1.1 платформы .NET. Я запускаю Vista с .NET 3.5. Я очистил всю исходную ошибку, и проект будет построен; он просто не бежит.IndexOutOfRangeException в VB.NET

Насколько я могу судить, он пытается запустить «LoginForm», но установка точек останова не работает, потому что ошибка возникает до того, как точки останова будут достигнуты независимо от того, где они находятся в файле.

Действительно не может понять, что делать! Любая помощь оценивается.

StackTrace:

 
System.IndexOutOfRangeException was unhandled 
    Message="Index was outside the bounds of the array." 
    Source="FirstLine" 
    StackTrace: 
     at FirstLine.LoginForm.main() 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

EDIT: Жутко извиняюсь, не оценил код будет много пользы, поскольку этот вопрос более, что я не могу добраться до него. Однако, вот основная функция:

 
Shared Sub main() 
     Dim p As Process() = Process.GetProcessesByName("FirstLine") 
     If p.Length = 1 Then 
      'START COPYMINDER 
      'Dim expirydate As Date = CDate("01/01/1970") 
      'Dim expiry As Integer 
      'Try 
      ' GetCopyMinderExpiryDate(expiry) 
      ' If Not expiry = 0 And Not expiry = 1 Then 
      '  expirydate = expirydate.AddSeconds(expiry) 
      '  Dim diff As Integer = DateDiff(DateInterval.Day, Date.Now, expirydate) 
      '  If diff >= 0 And diff 0 Then 
      ' DisplayError((ret_code)) 
      ' End 
      'End If 

      'Dim did As String 
      'GetCopyMinderDeveloperID(did) 
      'If did "IT" Then 
      ' MessageBox.Show("Invalid Developer ID " & did & ". Firstline will now shutdown", "Firstline", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      ' End 
      'End If 

      'END COPYMINDER 


      Dim lf As New LoginForm 
      If LoginSettings.setting("loginShowErrorOnLine") = "TRUE" Then 
       lf.ShowDialog() 
      Else 
       Try 
        lf.ShowDialog() 
       Catch ex As Exception 
        MsgBox(ex.Message) 
        Config.UnlockByUser(Config.currentUser.username) 
        Config.currentUser.UserLoggedOff() 
       End Try 
      End If 
     Else 
      Dim prc As Process = p(0) 
      SwitchToThisWindow(prc.MainWindowHandle, True) 
     End If 

    End Sub 

Спасибо за ваши ответы. Отрадно видеть такое полезное сообщество!

+0

Опубликовать код. Что входит в LoginForm.main()? Тем временем это может помочь: http://stackoverflow.com/questions/964566/vs-2008-addon-to-temporarily-disable-remove-all-catch-block/964579#964579 –

+0

Некоторые исходные коды FirstLine .LoginForm.main(), вероятно, будет полезным :-). – bang

ответ

0

Попробуйте включить отладочную сборку; это даст вам возможность добавить точки останова, а также даст вам некоторые номера строк в трассировке стека.

Ваша проблема в том, что вы не обрабатываете случай, когда p.Length = 0. Это происходит, если нет процесса с именем «FirstLine».

Вы также переименовали свой процесс/приложение?

+0

На самом деле я не получил фон .NET, поэтому не знал, что я мог бы сделать ошибки более наглядными! Я попробую это сейчас. Большое спасибо! – 2009-06-09 11:07:28

+0

Простое чтение процессов в рамках .NET Framework. Я вернусь к тебе, как только я обернусь вокруг. До сих пор я положил elseif p.length = 0 в, и тогда я предполагаю, что я только начинаю новый процесс? Я думаю, что это правильно. Большое спасибо за вашу помощь, это глубоко оценено! – 2009-06-09 11:33:18

4

Dim prc As Process = p(0) - это ваша проблема, так как она находится в операторах else, где длина массива может быть не более 1 (например, 0).

, когда длина равна 0, он даст вам IndexOutOfRange при попытке доступа к первому элементу.

+0

Вы совершенно правы! Я полагаю, что мой вопрос будет заключаться в том, почему он не реагирует на контрольные точки? Он определенно выполняет этот код (console.writeline дает выход), но, похоже, полностью игнорирует точки останова. Извиняюсь, если это глупый вопрос = / – 2009-06-09 11:17:30

Смежные вопросы