“制作单实例应用程序”这是做什么的?

时间:2009-08-25 14:48:42

标签: vb.net winforms

在vb 2008 express中,此选项在应用程序属性下可用。有谁知道它的功能是什么?这样做是为了不可能同时打开两个实例吗?

7 个答案:

答案 0 :(得分:19)

  

这样做是为了不可能同时打开两个实例吗?

答案 1 :(得分:11)

是的,它makes it impossible同时打开两个实例。

然而,了解错误非常重要。对于某些防火墙,甚至可以打开一个实例impossible - 您的应用程序在启动时崩溃了!有关详细信息,请参阅Bill McCarthy的this excellent article,以及将应用程序限制为一个实例的技术。他将命令行参数从第二个实例传递回第一个实例的技术使用.NET 3.5中的管道。

答案 2 :(得分:11)

为什么不使用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

当表单在此情况下关闭时,互斥锁将被释放,您可以打开另一个互斥锁。即使你的应用程序崩溃,这也可以。

答案 3 :(得分:3)

    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

答案 4 :(得分:2)

是的,你是正确的,因为它只允许你的应用程序的一个实例一次打开。

答案 5 :(得分:1)

我找到了一篇关于这个主题的精彩文章:Single Instance Application in 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

答案 6 :(得分:-3)

甚至有一种更简单的方法:

使用以下代码......

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

这将处理单个实例以及瘦客户端,并且在应用程序运行时无法删除该文件。关闭应用程序或者如果应用程序崩溃,文件将自行删除。