- PR -

WinFormアプリが突然起動できなくなる!?

1
投稿者投稿内容
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2002-12-16 13:00
タスクトレイに常駐するWinFormアプリ(C#)を開発し、配布したのですが、ユーザーから突然アプリが起動できなくなったと報告を受けました。
System.InvalidOperationExceptionが発生し、「ハンドルされていない例外が発生しました」ダイアログが表示されて起動できなくなるらしいのですが、アプリ内ではすべての個所でSystem.Exceptionをtry-catchしているため、ハンドルされていない例外ダイアログが表示されるのは不自然であると考えています。

今まで2ユーザーから同じような報告を受けましたが、以下のことを行うことで再度起動できるように回復したそうです。

1. レジストリのバックアップを元に戻した
2. OSを再インストールした

レジストリ値が破壊されているようにしか見えないのですが、該当のアプリは、一切レジストリを操作しておらず、マイクロソフトサイトのヘルプとサポートページにあるようにSystem.InvalidOperationExceptionが発生するというDataSet、DataReaderは使用していません。
ただし、上記現象が発生した時でも他のWinFormアプリは起動できるようです。
また、他のドライブなどに新規にインストールしても同様に起動できないようです。

今まで報告のあったユーザーの環境をまとめると、以下の通りです。

1. Windows2000 SP3
2. .NET Framework Service Pack 2

常駐アプリなので、OS終了時に自動的に終了させられるのですが、その時に.NET Frameworkがレジストリ値を破壊しているのだと考えられます。
そこで、「レジストリを元に戻す」や「OSを再インストールし直す」以外にエンドユーザーでも簡単に修復できる方法をご存じの方がいらっしゃいましたらお教え下さい。
# もし、方法が見つからなくても、このような問題が発生することがあるということを
# 多くの開発者の方に認識してもらうことは重要だと考えています。
# (.NETのバグとして改善してもらうためにもね!)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-12-16 19:22
こんにちは。

 VB.NETでWindows Serviceを作成し、動作させていますが、そのような現象は確認していません。当然、常駐型で、Windows終了時に終了させられるアプリケーションです。

 ポストの内容では、二天さんご自身は現象を確認していないのですよね?デバッグモードであれば、メッセージウインドウの詳細表示で、例外が発生したソースの行まで確認できるのですが、それはもうとれませんか?


>>マイクロソフトサイトのヘルプとサポートページに
>>あるようにSystem.InvalidOperationExceptionが発生するという
>>DataSet、DataReaderは使用していません。

 SystemInvalidOperationExceptionは、『オブジェクトの現在の状態に対して無効なメソッド呼び出しが行われた場合にスローされる例外』です(Visual Studioのヘルプで、System.InvalidOperationExceptionで検索)。引数が無効であること(System.InvalidArgumentExceptionが発生する)以外の要因でメソッドが失敗すると発生します。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2002-12-16 20:23
>  ポストの内容では、二天さんご自身は現象を確認していないのですよね?
> デバッグモードであれば、メッセージウインドウの詳細表示で、例外が発生した
> ソースの行まで確認できるのですが、それはもうとれませんか?

 私自身は4ヶ月位使っていますが、同じ現象は一度も確認していません。それなので、エラーダイアログの画像を送ってもらった程度の情報しかないのですが、アプリは起動時には重点的にtry-catch、およびthrowを使って例外をハンドルしているため、アプリの問題で「ハンドルされていない例外」エラーダイアログが表示されることはあり得ないのです。もし、例外が発生すれば意図的に表示しているMessageBoxが表示されるはずです。


>  SystemInvalidOperationExceptionは、『オブジェクトの現在の状態に対して無効
> なメソッド呼び出しが行われた場合にスローされる例外』です(Visual Studioのヘ
> ルプで、System.InvalidOperationExceptionで検索)。引数が無効であること
> (System.InvalidArgumentExceptionが発生する)以外の要因でメソッドが失敗する
> と発生します。

 例外に関しては、私自身がJava開発者でもあるので、きちんと理解しています。それなので、「.NETの例外をハンドルしていなくてもコンパイルエラーにならないのは問題が多いなー」と実感しているため、try-catch、およびthrowを多用してアプリの信頼性を向上させています。

 さらに、他の場所にインストールしてもらっても直らないようなので、環境自体がおかしくなったと考えています。レジストリをバックアップしていたものに戻したら直ったというのが何よりの証拠かと思います。
 アプリの使用している設定ファイルなどはインストールしたところのファイルしか使用していないので、他の場所にインストールした同じアプリが同様に動かないというのはおかしいのです。
 ちなみに、前日までは問題なく動作していたという話です。

 報告を送ってくれたユーザーの内、片方の方はVisual Studio .NETが入っているPCで使っていたようで、それなりに詳細なダイアログ画像を送ってもらいましたが、「system.dll」がハンドルされていない例外を発生したと記載されています。ここまでくると、一般開発者の解決できる問題ではないのかなと思います。

 しかし、.NET SDKがインストールされている場合とされていない場合では「ハンドルされていない例外」エラーダイアログが少し違うと思いますが、それも面倒くさいですね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-12-17 14:14
 えと、レジストリモニタで調べてみました。フォームを表示するだけのアプリケーションですが、大量にレジストリにアクセスします。

HKLMハイブから、アプリケーションのパス(2kやxpの最適化関連?)
ターミナルサーバでの実行に関する情報(おいおい)
言語パッケージに関する情報
HKCU, HKLMハイブから、.NET Frameworkの情報
アプリケーションのバージョンに関する情報
ポリシーに関する情報

その他、IMEに関する情報や、一緒にコンパイルされているのであろうDLLの情報、AssemblyInfoにかかれているクラスIDの情報等々、1800近いアクセスがありました。

ご参考までに。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2002-12-17 15:13
引用:

Jittaさんの書き込み (2002-12-17 14:14) より:
 えと、レジストリモニタで調べてみました。フォームを表示するだけのアプリケーションですが、大量にレジストリにアクセスします。

HKLMハイブから、アプリケーションのパス(2kやxpの最適化関連?)
ターミナルサーバでの実行に関する情報(おいおい)
言語パッケージに関する情報
HKCU, HKLMハイブから、.NET Frameworkの情報
アプリケーションのバージョンに関する情報
ポリシーに関する情報

その他、IMEに関する情報や、一緒にコンパイルされているのであろうDLLの情報、AssemblyInfoにかかれているクラスIDの情報等々、1800近いアクセスがありました。

ご参考までに。



調べていただき、ありがとうございます。

私自身、元々がJava開発者(Javaに呆れて.NETに移行)なので、Windowsアプリについては良く知らないのですが、レジストリに1800近いアクセスというのは.NETより前のWindowsアプリでは当たり前の範囲なのでしょうか?
やたらに多い気がしますし、これだけアクセスしていればちょっとしたことでおかしくなって起動できなくなることもあり得る話かな、とも思います。

そうなると、どの辺りに該当アプリに依存する値が記載されているのかをある程度掴んでおかないと、またレジストリが壊れて「system.dll」がハンドルされていない例外を発生してしまった場合に対処できないですね。エンドユーザーにレジストリを書き換えることをさせたくはありませんが。

しかし、「system.dll」がハンドルされていない例外を出してくれては困るのですがね。しかも、例外が発生した時には私のアプリの名前でエラーダイアログがでますしね。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2002-12-17 15:43
補足ですが、片方のユーザーは該当のWinFormアプリが起動しなくなった後、.NET Frameworkを何度か再インストールした様ですが、現象は改善されなかったということです。
そう考えると、.NET Framework自体のレジストリ操作を何とか改善してもらわないと、この現象は至る所で発生する可能性がありますね。

ちなみに、同じくWinFormアプリでポップアップメニューを連続して何度か表示させていたら、急にOS(WinXP)が落ち、システムファイルを破壊されてしまったことがあります。
そう考えると、Java Appletが(おそらくJavaVMが原因で)落ちてブラウザだけを強制終了させてしまう方が安全と言えますね。どちらも嫌ですが。
JUNKUN
会議室デビュー日: 2003/12/18
投稿数: 1
投稿日時: 2003-12-18 10:42
同じ現象が発生したので色々と調べたところ
このような情報をみつけました。

レジストリの設定がおかしくなっているようです。

[キー]
\HKEY_LOCAL_MACHINE\SYSYTEM\CurrentControlSet\Services\PerfProc\Performance

[値名]
Disable Performance Counters

このデータを "0" にするかそれ自体を削除してみてください。

これを試したところ、動作するようになりました。

当方の環境の共通点は、JAVAの環境をインストールしていると
このレジストリが書き換えられているようなのですが・・。
(SunOneStudio5をインストールしているマシンで発生しています。)
参考になればと思い、投稿しました。
1

スキルアップ/キャリアアップ(JOB@IT)