Путаница в идентификаторе процесса OpenNETCF

Я использую OpenNETCF 2.3 в приложении для мобильных устройств .NET Compact Framework 3.5. При запуске программы я ищу повторяющиеся запущенные экземпляры моего приложения. Я не понимаю, почему текущий ProcessID, который я получаю из различных методов, кажется неверным примерно в половине случаев.

Public Shared Sub Main()
    Dim appName As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name & ".exe"
    Dim intCurrentProcessId As Integer = OpenNETCF.Diagnostics.ProcessHelper.GetCurrentProcessID
    'Dim intCurrentProcessId As Integer = Process.GetCurrentProcess.Id()

    For Each p As ToolHelp.ProcessEntry In ToolHelp.ProcessEntry.GetProcesses
        If p.ProcessID <> intCurrentProcessId AndAlso p.ExeFile.Contains(appName) Then
            MessageBox.Show("KILLING p.ExeFile: " & p.ExeFile & " p.processid: " & p.ProcessID & " intCurrentProcessId: " & intCurrentProcessId)
            'p.Kill()
        End If
    Next
End Sub

Почему так получается, что intCurrentProcessId случайно не соответствует p.ProcessId и является отрицательным числом?

У меня слишком мало репутации, чтобы опубликовать снимок экрана, на котором показаны p.ProcessID = 3459667490 и intCurrentProcessID = -835299806.

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


person Jason    schedule 02.02.2015    source источник
comment
Итак, вы хотите убить каждую процедуру, которая не имеет тот же PID и содержит appName?   -  person Mathemats    schedule 03.02.2015
comment
Правильный. Я также хотел бы знать, почему текущий идентификатор процесса возвращается неверно в половине случаев.   -  person Jason    schedule 03.02.2015
comment
Если у вас запущено несколько экземпляров вашего процесса, вы ожидаете, что будет что-то вроде p.ProcessID = 3459667490 и intCurrentProcessID = -835299806, потому что один - новый экземпляр, а другой - старый. И наличие отрицательного идентификатора процесса не имеет значения, относитесь к нему как к непрозрачному идентификатору.   -  person tcarvin    schedule 03.02.2015
comment
Я согласен, однако я не думаю, что это действительный PID. Он не отображается ни в одном диспетчере задач. Кроме того, в настоящее время существует небольшая вероятность того, что предыдущие экземпляры приложения будут работать в фоновом режиме, поскольку тестовый код только проверяет PID, отображает сообщение, а затем завершает работу. Примерно в 50% случаев PID не совпадают, в 100% случаев они подписаны / отрицательны.   -  person Jason    schedule 03.02.2015


Ответы (1)


Во-первых, быстрый взгляд на числа со знаком и без знака (не стесняйтесь использовать калькулятор на рабочем столе, чтобы проверить их).

3459667490 в десятичном формате без знака - 0xCE365622 в 32-битном шестнадцатеричном формате.
-835299806 в десятичном формате со знаком - 0xCE365622 в 32-битном шестнадцатеричном формате.

Видите сходство?

Если вы приведете так, что оба они либо подписаны, либо неподписаны, я готов поспорить, что в 100% случаев идентификаторы будут совпадать.

person ctacke    schedule 03.02.2015
comment
Именно то, что я искал. - person Jason; 04.02.2015