0

我在我的应用程序中使用 Process 类,就在静态 Main 方法的开头。我正在使用 Process 类来了解我的应用程序的另一个实例当前是否正在运行。如果我的应用程序已经在运行,我将退出。我不是在寻找改变这一点的方法,这已经工作了多年

但是最近这在我们用户的某些计算机上不起作用,我收到错误“公共语言运行时调试服务:应用程序生成了无法处理的异常”。

我已经完全信任程序集,并且用户是系统的管理员。

任何想法都会有所帮助谢谢!

编辑:WMI 性能适配器服务在引发错误之前打开,在错误发生后关闭,我是否缺少某种权限?

这是在框架 1.1 上

4

5 回答 5

4

虽然我无法推测您的进程崩溃的原因,但更好的解决方案是使用命名互斥锁:

static void Main()
{
  bool mutexWasCreated;
  using (Mutex mutex=new Mutex(true, AppID, out mutexWasCreated))
  {
    // check for single instance
    if (!mutexWasCreated)
      return;

    Application.Run(...);
  }
}
于 2009-03-25T16:15:40.370 回答
1

您能否添加一个顶级 try catch(或使用 UnhandledException 处理程序)来查看抛出了什么类型的异常?这会有很大帮助。

于 2009-03-25T16:13:27.130 回答
1

我同意布兰。如果您不知道引发了什么异常,则很难进行故障排除。我会听unhandledexception 事件并将问题记录为解决此问题的第一步。

于 2009-03-25T16:17:14.423 回答
1

我记得我正在处理的一些 .net 代码也有类似的问题。它是在一个 citrix 环境中。

用户必须是我相信的性能组的成员,才能运行 Process.GetProcessesByName()... 这真的不可取!

我认为我们有两个解决方法——第一个是在代码的开头,即从 VB 脚本运行代码,该脚本测试代码是否已经在运行。

第二个解决方法是设置窗口焦点的部分代码。在这里,我们只是在 try / catch 块中运行 AppActivate() - 我猜你可能能够做到 - 如果 AppActivate 失败,那么你需要运行应用程序。

希望这可以帮助!

于 2009-03-25T17:31:54.307 回答
0

我正在使用 Process 类来了解我的应用程序的另一个实例当前是否正在运行。

.NetStartupNextInstance为此提供了应用程序事件。

嗯……没关系。这看起来只能在 Visual Basic 中使用。我会在这里留下答案,以防它对其他人有用。

于 2009-03-25T16:16:27.063 回答