2009-08-25 11 views

Respuesta

-3

Incluso hay un método más fácil:

Utilice el siguiente código ...

Imports System.IO 

En el evento principal de carga del formulario haga lo siguiente:

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 

Esto se encargará de instancias únicas, así como clientes ligeros, y el archivo no se puede eliminar mientras se ejecuta la aplicación. y al cerrar la aplicación o si la aplicación falla, el archivo se eliminará solo.

+1

Requiere acceso de escritura al directorio que contiene el EXE, que no está disponible si instala el archivo EXE en Archivos de programa y ejecuta el EXE como un usuario que no es administrador. – MarkJ

+16

No diría ** ** que esto es más fácil que marcar la casilla 'Hacer solicitud de instancia única' –

18

¿Lo hace de modo que sea imposible abrir dos instancias al mismo tiempo?

Sí.

2

Sí, tiene razón, ya que solo permitirá que una instancia de su aplicación esté abierta a la vez.

11

Sí, es makes it impossible para abrir dos instancias al mismo tiempo.

Sin embargo, es muy importante para tener en cuenta errores. Con algunos firewalls, es impossible para abrir incluso instancia de - ¡su aplicación falla al iniciarse! Consulte this excellent article de Bill McCarthy para obtener más detalles y una técnica para restringir su aplicación a una instancia. Su técnica para comunicar el argumento de la línea de comandos desde una segunda instancia a la primera instancia usa pipes en .NET 3.5.

+0

Interesante artículo, gracias! – Kaniu

10

¿Por qué no utilizar un Mutex? Esto es lo que MS sugiere y lo he usado por muchos años sin problemas.

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 

Cuando el formulario, en este caso, se cierra, se libera el mutex y puede abrir otro. Esto funciona incluso si tu aplicación falla.

+0

porque es solo .NET 4.5. ¡pero esta es una gran información! –

+0

¿Qué es .NET 4.5? He estado usando esto desde 1.1 y actualmente lo uso en VS2008, como se indica en la pregunta original. – Steve

+0

esto no funciona en usuarios múltiples –

0

Encontré un artículo excelente para este tema: Single Instance Application in VB.NET. el uso

Ejemplo:

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 
1
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