具有单实例和多实例行为的应用程序

本文关键字:实例 应用程序 单实例 | 更新日期: 2023-09-27 18:34:05

我已经使用 VisualBasic 创建了一个单实例应用程序.dll但在某些情况下我需要创建多个实例。我需要单实例行为来处理上下文菜单行为,其中每个窗口上下文菜单命令将调用应用程序的新实例。我仍然需要一些上下文菜单来加载另一个实例。我通过创建一个新的应用程序上下文并在新线程上运行它来解决此问题。

示例代码

var thread = new Thread(() => ThreadOpenFile(args));
thread.TrySetApartmentState(ApartmentState.STA);
thread.Start();

线程内容

private static void ThreadOpenFile(string[] args)
{
  ApplicationContext appCnxt= new ApplicationContext(new newForm(args[1]));
  Application.Run(appCnxt);            
}

我和它一样

private static void ThreadOpenFile(string[] args)
{
  Application.Run(new newForm(args[1]));            
}

这将创建一个新的 ApplicationContext、ThreadContext 和新表单,Application.Run 会将 ThreadContext 链接到 ApplicationContext,就像启动应用程序一样。我找不到任何文档来解释会发生什么以及谁在管理我正在创建的这个"新线程"。如果我尝试启动一个新进程,它将调用单个实例处理程序

protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)

的 VisualBasic.dll并按预期永远进入递归循环。我想知道这是正确的方法还是有更好的方法?

此链接演示如何使用应用程序上下文挂钩初始屏幕行为。如果有好的参考资料,我可以找到内部结构也值得赞赏。

具有单实例和多实例行为的应用程序

通过@HansPassant评论来接受答案。

你会忘记 Application.EnableVisualStyles(( 和 Application.SetUnhandledExceptionMode((。就像你一样。而且你很容易调用让 SystemEvents 类在错误的线程上触发其事件的恐怖,这太难诊断了。让应用程序启动但等待第一个进程是一个坏主意。如果用户第 3 次或第 4 次启动它怎么办?或第 n 次