"сделать одно приложение", что это делает?

В vb 2008 express эта опция доступна в свойствах приложения. Кто-нибудь знает, какова его функция? делает ли это так, что невозможно открыть два экземпляра одновременно?

8 ответов

Решение

Есть даже более простой метод:

Используйте следующий код...

Imports System.IO

В основном событии загрузки формы сделайте следующее:

If File.Exist(Application.StartupPath & "\abc.txt") Then
    'You can change the extension of the file to what ever you desire ex: dll, xyz etc.
    MsgBox("Only one Instance of the application is allowed!!!")
    Environment.Exit(0)
Else
    File.Create(Application.StartupPath & "\abc.txt", 10, Fileoptions.DeleteonClose)
Endif

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

делает ли это так, что невозможно открыть два экземпляра одновременно?

Да.

Почему бы просто не использовать Mutex? Это то, что предлагает MS, и я использовал это в течение многих лет без проблем.

Public Class Form1
Private objMutex As System.Threading.Mutex
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'Check to prevent running twice
    objMutex = New System.Threading.Mutex(False, "MyApplicationName")
    If objMutex.WaitOne(0, False) = False Then
        objMutex.Close()
        objMutex = Nothing
        MessageBox.Show("Another instance is already running!")
        End
    End If
    'If you get to this point it's frist instance

End Sub
End Class

Когда форма в этом случае закрывается, мьютекс освобождается, и вы можете открыть другую. Это работает, даже если ваше приложение вылетает.

Да, это делает невозможным открытие двух экземпляров одновременно.

Однако очень важно знать об ошибках. С некоторыми брандмауэрами невозможно открыть даже один экземпляр - ваше приложение падает при запуске! См. Эту прекрасную статью Билла Маккарти для получения более подробной информации и техники для ограничения вашего приложения одним экземпляром. Его метод передачи аргумента командной строки из второго экземпляра обратно в первый экземпляр использует каналы в.NET 3.5.

    Dim _process() As Process
    _process = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName)
    If _process.Length > 1 Then
        MsgBox("El programa ya está ejecutandose.", vbInformation)
        End
    End If

Да, вы правы в том, что одновременно разрешено открывать только один экземпляр вашего приложения.

Я нашел отличную статью на эту тему: Приложение для одного экземпляра в VB.NET.

Пример использования:

Module ModMain

    Private m_Handler As New SingleInstanceHandler()
    ' You should download codes for SingleInstaceHandler() class from:
    ' http://www.codeproject.com/Articles/3865/Single-Instance-Application-in-VB-NET

    Private m_MainForm As Form

    Public Sub Main(ByVal args() As String)
        AddHandler m_Handler.StartUpEvent, AddressOf StartUp ' Add the StartUp callback
        m_Handler.Run(args)
    End Sub

    Public Sub StartUp(ByVal sender As Object, ByVal event_args As StartUpEventArgs)
        If event_args.NewInstance Then ' This is the first instance, create the main form and addd the child forms
            m_MainForm = New Form()
            Application.Run(m_MainForm)
        Else ' This is coming from another instance
             ' Your codes and actions for next instances...
        End If
    End Sub

End Module
      Public Function PrevInstance() As Boolean
    If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length > 1 Then
        Return True
    Else
        Return False
    End If
End Function
Другие вопросы по тегам