0

アプリケーションで、静的な Main メソッドの先頭で Process クラスを使用しています。Process クラスを使用して、アプリケーションの別のインスタンスが現在実行されているかどうかを確認しています。アプリケーションが既に実行されている場合は、終了します。私はこれを変更する方法を探しているわけではありません。これは何年もの間機能しています

しかし、最近、ユーザーの一部のコンピューターでこれが機能しません。「共通言語ランタイム デバッグ サービス: アプリケーションが処理できない例外を生成しました」というエラーが表示されます。

私はすでにアセンブリを完全に信頼しており、ユーザーはシステムの管理者です。

どんなアイデアでも役に立ちます ありがとう!!

編集: WMI パフォーマンス アダプター サービスは、エラーがスローされる前にオンになり、エラーが発生した後にオフになります。何らかのアクセス許可がありませんか?.

これはFramework 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() を実行できるようにするには、ユーザーはパフォーマンス グループのメンバーである必要がありました。これは実際には望ましくありません。

2 つの回避策があったと思います。1 つ目はコードの先頭で、コードが既に実行されているかどうかをテストする VB スクリプトからコードを実行することでした。

2 番目の回避策は、ウィンドウのフォーカスを設定するコードの一部でした。ここでは、try / catch ブロック内で AppActivate() を実行するだけです。これは実行できると思いますが、AppActivate が失敗した場合は、アプリケーションを実行する必要があります。

お役に立てれば!

于 2009-03-25T17:31:54.307 に答える
0

Process クラスを使用して、アプリケーションの別のインスタンスが現在実行されているかどうかを確認しています。

.Net は、StartupNextInstanceこの目的のためにアプリケーション イベントを提供します。

うーん...気にしないでください。これは、Visual Basic からのみ利用できるようです。他の誰かに役立つ場合に備えて、ここに答えを残します。

于 2009-03-25T16:16:27.063 に答える