"сделать одно приложение", что это делает?
В 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