tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル初回例外について
記事No7311
投稿日: 2008/04/11(Fri) 09:55
投稿者皐月
いつもお世話になっています。VB2005について質問させてください。

前日まで動作していたプログラムが

System.InvalidOperationException はハンドルされませんでした。
Message="フォームの作成中にエラーが発生しました。詳細については、Exception.InnerException を参照してください。
エラー: 共通言語ランタイムが無効なプログラムを検出しました。"

というエラーがでて動かなくなってしまいました。

エラーが出る場所なのですが、
スタートアップオブジェクトはモジュールのSub Mainに設定して、Sub MainよりプログラムのメインとなるFormをshowするように作成してあります。この、「Form1.show」の位置にくると停止して上記のようなエラーが検出されます。

イミディエイトウィンドウには
'System.InvalidOperationException' の初回例外が test.exe で発生しました。
と表示されます。
動作しなくなる前にセットアッププロジェクトを作成したのですが、なにか関係があるのでしょうか?
それとも「フォームの作成中にエラーが発生しました。」と出ているのでフォームに問題があるのか(実際にフォームのLoadイベントまで実行することができません)
フォームを呼び出しているモジュールに問題があるのか・・・。

問題点が絞り込めずに困っています。
エラー文にException.InnerExceptionを参照しろとあったので、調べてはみたものの使い方がわからず、情けない限りです。どうかご存知の方よろしくお願いします。

参考にしたURL
http://msdn2.microsoft.com/ja-jp/library/system.exception.innerexception(VS.80).aspx

[ツリー表示へ]
タイトルRe: 初回例外について
記事No7312
投稿日: 2008/04/11(Fri) 10:15
投稿者魔界の仮面弁士
Form のコンストラクタ(Sub New)、特に、InitializeComponent 内で
問題が発生している可能性が高いです。

たとえば、データバインドをしているが、元データの構造や名前が変更になったことで、
バインドに失敗している場合とか、コントロールを切り貼りしているうちに、余計な
ゴミ変数が残ってしまった場合とか。

Form1.designer.vb の内容を再チェックしてみましょう。

> 前日まで動作していたプログラムが
前日までのプログラムとは、1bitたりとも変更されていないのでしょうか?

Team Foundation や SourceSafe を使っているなら、以前のバージョンのソースを
再取得し、もう一度試してみてください。

[ツリー表示へ]
タイトルRe^2: 初回例外について
記事No7313
投稿日: 2008/04/11(Fri) 11:55
投稿者皐月
魔界の仮面弁士さんお返事ありがとうございます。

> Form のコンストラクタ(Sub New)、特に、InitializeComponent 内で
> 問題が発生している可能性が高いです。

恥ずかしながら、InitializeComponentの存在を知らなかったので、調べながらやってみました。

1.[ツール]-[オプション]-[デバック]-['マイコード'のみ設定を有効にする]のチェックを外す

2.Form1.designer.vbにある。

 <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()

 の、<System.Diagnostics.DebuggerStepThrough()> _ 部分をコメントにする。

3.Private Sub InitializeComponent()にブレークポイントを設定。

の順に操作して、デバッグしてみましたが、やはりモジュールファイルのForm1.showでひっかかってしまいInitializeComponentまで実行することができません。
他のきちんと動作するプログラムで同じことを試してみたところ、Form1.designer.vbはForm1のLoadイベントよりも先に実行されているようなので、Form1を呼び出す以前の問題なのでしょうか?

ちなみに、動作しなくなる前に作成したセットアッププロジェクトから作成したインストールファイルから動作させてみましたところ、こちらは(表面上は)問題なくFormの画面が開き動作するようです。

> Team Foundation や SourceSafe を使っているなら、以前のバージョンのソースを
> 再取得し、もう一度試してみてください。

こんな便利なものがあるんですね。今度使えるように検討してみます。

[ツリー表示へ]
タイトルRe^3: 初回例外について
記事No7314
投稿日: 2008/04/11(Fri) 13:47
投稿者皐月

> ちなみに、動作しなくなる前に作成したセットアッププロジェクトから作成したインストールファイルから動作させてみましたところ、こちらは(表面上は)問題なくFormの画面が開き動作するようです。

すみません。
古いバージョン立ち上げて見ていたようです。
再インストールしたところ同様の場所で停止、強制終了していました。
ごめんなさい><

[ツリー表示へ]
タイトルRe^3: 初回例外について
記事No7315
投稿日: 2008/04/11(Fri) 14:55
投稿者るしぇ
> の順に操作して、デバッグしてみましたが、やはりモジュールファイルの
> Form1.showでひっかかってしまいInitializeComponentまで実行することができません。
> 他のきちんと動作するプログラムで同じことを試してみたところ、Form1.designer.vb
> はForm1のLoadイベントよりも先に実行されているようなので、Form1を呼び出す以前の
> 問題なのでしょうか?

InitializeComponent にはコントロールの初期化処理が書いてあると思います。
つまりフォームのインスタンスを生成した時点=(暗黙的なものも含めて)Newされた
時点で実行されます。

インスタンスの生成から廃棄までの流れについては理解してますか?
> モジュールファイル
というのがバグの検出を困難にしているかもしれませんが、
> Form1.showでひっかかってしまいInitializeComponentまで実行することができません。
InitializeComponent にブレークポイントを置いても止まらないですか?
Show 以前に Form1 のメンバにアクセスしてませんか?

どうしてもデバッグできない場合は、以下の方法を試してみてください。
これから書く方法はデザイン画面が壊れる場合があるので、プロジェクトのフォルダごと
コピーしたバックアップを残してから実行してください。
1)デザイン画面を全て閉じる。
2)InitializeComponent のコードを部品(コントロール)毎にコメントアウトして実行してみる
3)コメントアウトしてエラーが出ない部品があれば、その設定を確認する

[ツリー表示へ]
タイトルRe^4: 初回例外について
記事No7316
投稿日: 2008/04/11(Fri) 17:13
投稿者皐月
るしぇさん、こんにちは。よろしくお願いします。

> インスタンスの生成から廃棄までの流れについては理解してますか?
> > モジュールファイル
> というのがバグの検出を困難にしているかもしれませんが、
> > Form1.showでひっかかってしまいInitializeComponentまで実行することができません。
> InitializeComponent にブレークポイントを置いても止まらないですか?
> Show 以前に Form1 のメンバにアクセスしてませんか?

とのことですので、モジュールファイルにあるSub Mainを呼び出した直後にForm1を呼び出してみましたが、同様のエラーが出てしまいました。Show以前のアクセスはないように思います。
InitializeComponentにブレークポイントは設置してあります。<System.Diagnostics.DebuggerStepThrough()> _ 部分はコメントにしてありますし、[ツール]-[オプション]-[デバック]-['マイコード'のみ設定を有効にする]のチェックも外してある状態ですので、InitializeComponentを通れば停止するはずなのですが、それ以前にエラーが出てしまうため、(モジュールファイルでForm1.Showの部分に実行の黄色い帯が乗った時点です)他に原因があるのではないかと考えているのですが・・・。

> どうしてもデバッグできない場合は、以下の方法を試してみてください。
> これから書く方法はデザイン画面が壊れる場合があるので、プロジェクトのフォルダごと
> コピーしたバックアップを残してから実行してください。
> 1)デザイン画面を全て閉じる。
> 2)InitializeComponent のコードを部品(コントロール)毎にコメントアウトして実行してみる
> 3)コメントアウトしてエラーが出ない部品があれば、その設定を確認する

「デザイン画面をすべて閉じる」というのはフォームにはりつけてあるコントロールをすべて削除することでいいのでしょうか?
タブとボタンとラベルをたくさん配置しすぎているせいか、消そうとすると「応答なし」の状態になってしまいました><
そういえば、Form1の呼び出しがまだできていた状態のときも呼び出すのに10秒近くかかっていました。もしやコントロールの配置のしすぎでうまくいかないのでしょうか?
仕方がないので、同じ「Form1」という名前でフォームを作成し、呼び出すようにしてみたのですが、こちらは動作しました。

あれから、他のPCにエラーが出る状態のプログラムをそのままコピーして動作させたところ(コピーした先のPCはXP、VB2005が入っていて最初にプログラムを作成していたPCとほぼ同じスペックのPCです)動作したので、ますますわからなくなってきてしまいました。
私のVB2005の設定がなにか関係があるのでしょうか・・・・。

[ツリー表示へ]
タイトルRe^5: 初回例外について
記事No7319
投稿日: 2008/04/11(Fri) 18:47
投稿者るしぇ
うーん。InitializeComponent より前。。。うーん。。。分からないですね。
モジュール内で暗黙のインスタンスを生成しても、1回は InitializeComponent() に止まりますし、
関数の先頭であればコントロールは作成前ですから、コントロールの数は関係ないはずです。
New() で止めたらどうなります?・・・といっても InitializeComponent を呼び出すだけなので
現状から進展があるような気はしませんが。

> 「デザイン画面をすべて閉じる」というのはフォームにはりつけてあるコントロールを
> すべて削除することでいいのでしょうか?
いえ、Form1 のデザイン画面を表示していなければOKです。
しかし沢山コントロールを貼っているのであればどちらにしろチェックは困難ですね。
コントロールの種類で特別な物は使ってませんか?
サードパーティ製のライセンスが必要なコントロールを体験版で使っているとか。
> たとえば、データバインドをしているが、元データの構造や名前が変更になったことで、
> バインドに失敗している場合とか、
テキストボックスやボタンが不具合を起こす可能性は低いと思うので、データベースの
参照をウィザードを使って設定しているコントロールや、何かにバインドしている
コントロールはありませんか?

[ツリー表示へ]
タイトルRe^6: 初回例外について
記事No7329
投稿日: 2008/04/15(Tue) 11:44
投稿者皐月
魔界の仮面弁士さん、るしぇさんこんにちはお世話になっております。

あれから、まだ動作する状態だったプログラムを使用して以下のようなことをしてしまいました。

動作しないプログラムのモジュールファイルに動作するモジュールファイルを[既存項目の追加]で追加する。 →動作に変化なし

動作しないプログラムのForm1ファイルに動作するForm1ファイルを[既存項目の追加]で追加する。 →正常に動作

動作しないプログラムのForm1ファイルに動作するForm1.Designer.vbファイルを[既存項目の追加]で追加する。 →正常に動作

原因はForm1.Designer.vbで間違いないようなのですが、やはりInitializeComponentで停止できません。
<System.Diagnostics.DebuggerStepThrough()> _の部分はコメントにしてありますし、[ツール]-[オプション]-[デバック]-['マイコード'のみ設定を有効にする]のチェックも外してある状態です。

一度<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _の部分をコメントにして、Form1のロードイベントからInitializeComponentの呼び出しをおこなってみましたが、InitializeComponent()の部分に実行の黄色い帯が乗るとエラーがでてしまい、やはりInitializeComponentまで飛べません。

ちなみに検出されたエラーは以下の通りです
System.InvalidProgramException はハンドルされませんでした。
  Message="共通言語ランタイムが無効なプログラムを検出しました。"

> New() で止めたらどうなります?・・・といっても InitializeComponent を呼び出すだけなので
> 現状から進展があるような気はしませんが。

Formをデザイナから作成したので New がないのです><
代わりに、<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _にブレークポイントを設置してみましたが停止しませんでした。

> コントロールの種類で特別な物は使ってませんか?
> サードパーティ製のライセンスが必要なコントロールを体験版で使っているとか。
> > たとえば、データバインドをしているが、元データの構造や名前が変更になったことで、
> > バインドに失敗している場合とか、
> テキストボックスやボタンが不具合を起こす可能性は低いと思うので、データベースの
> 参照をウィザードを使って設定しているコントロールや、何かにバインドしている
> コントロールはありませんか?

コントロールはツールボックスにあるもののみ使用しています。呼び出そうとして上手くいっていないForm1にあるコントロールはタブやラベルが主です。ただ、貼り付けてあるコントロールの数が非常に多いのが気になるところですが・・・。
恥ずかしながら、バインドというのがよくわからないのですが、データの受け渡しや連結と考えていてよいのでしょうか?

[ツリー表示へ]
タイトルRe^7: 初回例外について
記事No7330
投稿日: 2008/04/15(Tue) 14:40
投稿者癒耶
> Formをデザイナから作成したので New がないのです><
> 代わりに、<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _にブレークポイントを設置してみましたが停止しませんでした。
デザイナから作成しても確実にNewはあるはずですよ。
よく探してみてください。
バインドはそのまま連結ですね。

[ツリー表示へ]
タイトルRe^8: 初回例外について
記事No7331
投稿日: 2008/04/15(Tue) 15:27
投稿者皐月
癒耶さん、こんにちは。レスありがとうございます。

> > Formをデザイナから作成したので New がないのです><
> > 代わりに、<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _にブレークポイントを設置してみましたが停止しませんでした。
> デザイナから作成しても確実にNewはあるはずですよ。
> よく探してみてください。
> バインドはそのまま連結ですね。

VB2005はNewでインスタンスを作成しなくてもshowでそのまま呼び出せてしまうので、そのまま呼び出してしまっているのですが、どこかで自動生成されるのでしょうか?
自力で見つけ出すことができなかったので、もう少しヒントを頂けると嬉しいです。

あれから、ずっとInitializeComponentとにらめっこをしていて気づいたのですが、他のラベルは

Me.Lbl_T001 = New System.Windows.Forms.Label

という風に作成されているのに

Dim Lbl_T002 As System.Windows.Forms.Label

と記述されている部分をいくつか発見しました。
コントロールの記述についても以下のように違いがあります。

'
'Lbl_T001
'
Me.Lbl_T001.BackColor = System.Drawing.SystemColors.ActiveCaptionText
Me.Lbl_T001.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
resources.ApplyResources(Me.Lbl_T001, "Lbl_T001")
Me.Lbl_T001.Name = "Lbl_T001"
Me.HelpProvider1.SetShowHelp(Me.Lbl_T001, CType(resources.GetObject("Lbl_T001.ShowHelp"),Boolean)

'
'Lbl_T002
'
Lbl_T002.BackColor = System.Drawing.SystemColors.ButtonFace
resources.ApplyResources(Lbl_T002, "Lbl_T002")
Lbl_T002.ForeColor = System.Drawing.Color.Black
Lbl_T002.Name = "Lbl_T002"
Me.HelpProvider1.SetShowHelp(Lbl_T002, CType(resources.GetObject("Lbl_T002.ShowHelp"),Boolean))

記述が違っていたラベルは「数字1」のようにテキストボックスの中に入っている数値がわかるように、項目が入るラベルとして利用していました。
特に手を加えたり変更した覚えがなく、プログラム上でも途中でなにかを代入するような処理はありません。あるとすれば、Visibleを切り替えるくらいでしょうか・・・。

修正の仕方がよくわからなかったので、一度問題のあるコントロールを削除して、作り直してみました。InitializeComponentを確認すると他のコントロールと同じような記述に変化しており、プログラムが正常に動作するようになりました。

Lbl_T002のほうは「Me.」という記述がないのでひょっとしてForm1のコントロールとして認識されていなかったのでしょうか?

[ツリー表示へ]
タイトルRe^7: 初回例外について
記事No7332
投稿日: 2008/04/15(Tue) 15:27
投稿者るしぇ
>Formをデザイナから作成したので New がないのです><
隠れてるだけですね。イベント関数を作るときの要領で、画面上部の
コンボボックスで、クラス名をForm1、メソッド名をNewにすれば
New のコードが出力されると思います。

>一度<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
>の部分をコメントにして、Form1のロードイベントからInitializeComponentの
>呼び出しをおこなってみましたが、InitializeComponent()の部分に実行の黄色い
>帯が乗るとエラーがでてしまい、やはりInitializeComponentまで飛べません。
これをやってるなら結果は同じでしょうね。デザイン画面からの自動書込み処理
が失敗して InitializeComponent の内部のコードが壊れたのではないでしょうか?

>動作するForm1.Designer.vbファイル
動作しないファイルと差分を取って分かることはありませんか?
ごっそり抜け落ちてるコードとかありませんか?

>コントロールはタブやラベルが主です。
主かどうかを聞いているのではなくって、特別な設定をしてるものが1つでも
ありませんか?と聞いています。

>貼り付けてあるコントロールの数が非常に多いのが気になるところですが・・・。
原因である可能性は低いと思います。ですが気になるというだけで具体的に
どのコントロールが何個あるのか?示されない以上、こちらでテストは
できませんが?

>恥ずかしながら、バインドというのがよくわからないのですが、データの
>受け渡しや連結と考えていてよいのでしょうか?
そんなかんじ。InitializeComponent は関数の上にメモとしてコメントで
書いてある通り、Windows フォーム デザイナが変更してます。自分で編集した
のでなければ、デザイン画面での変更が原因である可能性が高いので、コード
からではなく、デザイン画面からデータベースにバインドしてたりしますか?
って質問です。
デザイン画面のツールボックスから[データ]のグループに BindingSource とか
ありますよね?この辺の話です。

[ツリー表示へ]
タイトルRe^8: 初回例外について
記事No7333
投稿日: 2008/04/15(Tue) 16:31
投稿者皐月
るしぇさん、レスありがとうございます。
同じ時間に投稿しているの見かけてびっくりしました(笑)

> >Formをデザイナから作成したので New がないのです><
> 隠れてるだけですね。イベント関数を作るときの要領で、画面上部の
> コンボボックスで、クラス名をForm1、メソッド名をNewにすれば
> New のコードが出力されると思います。
>
おかげさまで見つけることができました。
Newの中でInitializeComponentの呼び出しを見つけました。
ここから、InitializeComponent関数は呼び出されていたのですね。

> >一度<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
> >の部分をコメントにして、Form1のロードイベントからInitializeComponentの
> >呼び出しをおこなってみましたが、InitializeComponent()の部分に実行の黄色い
> >帯が乗るとエラーがでてしまい、やはりInitializeComponentまで飛べません。
> これをやってるなら結果は同じでしょうね。デザイン画面からの自動書込み処理
> が失敗して InitializeComponent の内部のコードが壊れたのではないでしょうか?
>
> >動作するForm1.Designer.vbファイル
> 動作しないファイルと差分を取って分かることはありませんか?
> ごっそり抜け落ちてるコードとかありませんか?
>

あれから、Wordで文章比較で調べてみたところ、Re^8のような違いを見つけることができました。そうなってしまった原因までは残念ながら思いつかないのですが・・・・。

> >コントロールはタブやラベルが主です。
> 主かどうかを聞いているのではなくって、特別な設定をしてるものが1つでも
> ありませんか?と聞いています。

ありません。VB2005にあるコントロールのみを使用しています。

> >恥ずかしながら、バインドというのがよくわからないのですが、データの
> >受け渡しや連結と考えていてよいのでしょうか?
> そんなかんじ。InitializeComponent は関数の上にメモとしてコメントで
> 書いてある通り、Windows フォーム デザイナが変更してます。自分で編集した
> のでなければ、デザイン画面での変更が原因である可能性が高いので、コード
> からではなく、デザイン画面からデータベースにバインドしてたりしますか?
> って質問です。
> デザイン画面のツールボックスから[データ]のグループに BindingSource とか
> ありますよね?この辺の話です。

わかりやすい解説ありがとうございます。
このお話を伺うまでバインドを知らなかったように、このコントロールの存在もよく知りませんでした。未だに使用したことがないので、可能性はないと思います。

[ツリー表示へ]
タイトルRe^9: 初回例外について
記事No7350
投稿日: 2008/04/17(Thu) 18:49
投稿者るしぇ
Me の削除だけが原因ではないと思います。
動くコードから Me を削除した場合どうでしょうか?
# こちらでは問題なく動作しました。

ただ、意図的にこの部分のコードを書き換えたのでないのであれば、
思い浮かぶのは Module ということです。共有化(Shared)でも同じ
ですが、インスタンスという概念から外れます。

Module Module1
    Dim TextX As New TextBox
    Sub testSub()
        Me.TextX.Text = ""
    End Sub
End Module
このコードではコンパイルエラーになります。
エラーメッセージ『'Me' は、モジュール内では有効ではありません。』

このようなコードになってしまうと Me が都合が悪くなります。
デザイナが気を利かして(?)削除することがあるのかもしれません。
ただ、最初に書きましたように Me のあるなしだけではエラーに
ならないと思います。
もう1ピース足りない感じ。。。

。。。あと気になったのは
> resources.ApplyResources
[VB2005 Express Edition]では
『'ApplyResources' は 'Resources' のメンバではありません。』
と出ます。小文字で始まってるのも気になります。
オブジェクトブラウザで検索すると System.ComponentModel.ComponentResourceManager
にあるけど、System.Resources ってクラスがあるんですよね。もしかして
名前空間かぶって追加してませんか?バージョンの違いかなぁ?

[ツリー表示へ]
タイトルRe^10: 初回例外について
記事No7360
投稿日: 2008/04/18(Fri) 14:43
投稿者皐月
るしぇさん、こんにちは!お返事ありがとうございます。

> Me の削除だけが原因ではないと思います。
> 動くコードから Me を削除した場合どうでしょうか?
> # こちらでは問題なく動作しました。
>
> ただ、意図的にこの部分のコードを書き換えたのでないのであれば、
> 思い浮かぶのは Module ということです。共有化(Shared)でも同じ
> ですが、インスタンスという概念から外れます。
>
はい、こちらでも問題なく動作いたしました。
あと、問題が出ていたプログラムなんですが、問題が出る前にとったバックアップが残っていましたのでForm1.Designer.vbを立ち上げて確認してみました。

そちらにも、Meはない状態だったのですが、正常に動作いたしました。
でも、問題のでた状態のプログラムはMeの記述を加えると正常動作・・・うぅーん、謎です。

> 。。。あと気になったのは
> > resources.ApplyResources
> [VB2005 Express Edition]では
> 『'ApplyResources' は 'Resources' のメンバではありません。』
> と出ます。小文字で始まってるのも気になります。
> オブジェクトブラウザで検索すると System.ComponentModel.ComponentResourceManager
> にあるけど、System.Resources ってクラスがあるんですよね。もしかして
> 名前空間かぶって追加してませんか?バージョンの違いかなぁ?

こちらではそのメッセージはみたことがないですねぇ。ちなみに私が使用しているのはStandard Editionです。デバッグの設定が初期設定のままなので、スルーされているのでしょうか?
でも、それだとリソースにあるデータがラベルに反映しないような??

[ツリー表示へ]