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

l--*_*''' 9 vb.net winforms

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

sep*_*p2k 18

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

是.


Mar*_*rkJ 11

是的,这使得无法同时打开两个实例.

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


Ste*_*eve 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
Run Code Online (Sandbox Code Playgroud)

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


小智 -3

甚至还有一个更简单的方法:

使用以下代码...

Imports System.IO
Run Code Online (Sandbox Code Playgroud)

在主窗体加载事件上执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 我**不会**说这比勾选“制作单实例应用程序”复选框更容易 (24认同)
  • 需要对包含 EXE 的目录具有写访问权限,如果您将 EXE 安装在 Program Files 下并且以非管理员用户身份运行 EXE,则该权限不可用。 (2认同)