トップ回答者
VisualStudio2010環境でのexeの動作について

質問
-
お世話になります。
VisualStudio2010にて開発したVisualBasicのデスクトップアプリにつき以下の問題があります。ご存知の方がいらっしゃいましたら解決法などご教授いただければ幸いです。どうぞよろしくお願いいたします。
環境:Windows7 Professional SP1 / Visual Studio 2010 Professional SP1 / .NET Framework 4.0.3
状況:
VisualStudioにてソリューションのプロパティから「Visual Studioホスティングプロセスを有効にする」をアンチェックすると期待した動作をするのですが、上記チェックした場合、およびビルドした.exeから実行した場合には正常に動作しません。チェックした状態でデバッグすると、例外が発生しています。
例外は複数発生しています。
機能上問題がある場合:以下の例外が発生します。
TypeInitializationExceptionはハンドルされませんでした。'System.Data.Common.DataStorage' のタイプ初期化子が例外をスローしました。
この状態でデバッグを継続すると同じ個所で
AccessViolationExceptionはハンドルされませんでした。保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
例外発生個所は、以下のda.Fill(Table)のところです。
Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & appPath & mdbname)
Dim sqlCm As OleDbCommand = cn.CreateCommand
Dim da As New OleDbDataAdapter(sqlCm)
Dim Table As New DataTable
sqlCm.CommandText = "SELECT A FROM temp WHERE B = '" & class & "'"
Try
da.Fill(Table) ←ここ
DataGridView1.DataSource = Table
また、たまたま機能上問題なく動いた場合でも、フォームを閉じようとすると(フォームのクローズボタンから)VisualStudio2010の画面で新しいTABページが開き「利用可能なソースがありません」と表示され、ポップアップにはAccessViolationExceptionはハンドルされませんでした、と表示されます。
以上が発生している問題です。
上記「Visual Studioホスティングプロセスを有効にする」かしないか、で例外が発生するようなことが起こるのでしょうか?
このようなトラブルは初めてで、どうも対処の方法がわかりません。
どうぞよろしくお願いいたします。
回答
-
Windows 7は32bit版ですか? 64bit版ですか?
アプリケーションのアーキテクチャはx86ですか? x64ですか? それともAnyCPUですか? AnyCPUの場合32bit優先のフラグはどうしていますか?
アプリケーションのプロジェクト種別はWindows Formsですか?
コード中のappPath, mdbname, class, DataGridView1とは何者でしょうか?
質問するときはまず相手の立場に立って、情報に過不足がないかどうか、きちんと伝わるかどうかよく考えてください。
Visual Studioのホスティング機能は、デバッグ対象のアプリケーションアセンブリを直接実行してデバッガーをアタッチする代わりに、別のホストプロセス*.vshost.exeを介することでデバッグ情報を収集しやすくするためのものです。*.exe.configファイルも、*.vshost.exe専用に*.vshost.exe.configが自動生成されるので、注意していないとデバッグセッションでは意図しないアプリケーション設定を読み込んでいた、ということも往々にしてあります。
Windows APIの中には、ホスティングされた状態で実行すると正常に動作しないものもあります。AccessViolationExceptionはおそらく.NETライブラリが呼び出している内部のネイティブコードでNULL参照あるいはバッファオーバーランなどが発生した結果と思われます。ネイティブコードのアクセス違反例外 (0xC0000005) は通例ユーザーコードでハンドルすることはできず、結果としてアプリケーションは回復できずにそのまま異常終了するほかありません。
「ビルドした.exeから実行した場合」というのがよくわかりませんが、Visual Studio経由ではなくエクスプローラーから直接起動した場合、ということですか?
フォームクローズ時のアクセス違反例外に関しては、DB切断後にDBアクセスしようとしていたりしないですか? アンバインドと切断処理は正しく書いていますか? DB切断後に参照を残したままにしていたりしないですか?
まずDBファイル(MS Accessデータベースファイルか何かですか?)に正常に接続/切断できるかどうか(DBをオープン/クローズできるかどうか)を確認してください。
- 編集済み sygh 2017年11月9日 14:57
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月10日 1:53
- 回答としてマーク Kodanuki2727 2017年11月13日 6:37
すべての返信
-
Windows 7は32bit版ですか? 64bit版ですか?
アプリケーションのアーキテクチャはx86ですか? x64ですか? それともAnyCPUですか? AnyCPUの場合32bit優先のフラグはどうしていますか?
アプリケーションのプロジェクト種別はWindows Formsですか?
コード中のappPath, mdbname, class, DataGridView1とは何者でしょうか?
質問するときはまず相手の立場に立って、情報に過不足がないかどうか、きちんと伝わるかどうかよく考えてください。
Visual Studioのホスティング機能は、デバッグ対象のアプリケーションアセンブリを直接実行してデバッガーをアタッチする代わりに、別のホストプロセス*.vshost.exeを介することでデバッグ情報を収集しやすくするためのものです。*.exe.configファイルも、*.vshost.exe専用に*.vshost.exe.configが自動生成されるので、注意していないとデバッグセッションでは意図しないアプリケーション設定を読み込んでいた、ということも往々にしてあります。
Windows APIの中には、ホスティングされた状態で実行すると正常に動作しないものもあります。AccessViolationExceptionはおそらく.NETライブラリが呼び出している内部のネイティブコードでNULL参照あるいはバッファオーバーランなどが発生した結果と思われます。ネイティブコードのアクセス違反例外 (0xC0000005) は通例ユーザーコードでハンドルすることはできず、結果としてアプリケーションは回復できずにそのまま異常終了するほかありません。
「ビルドした.exeから実行した場合」というのがよくわかりませんが、Visual Studio経由ではなくエクスプローラーから直接起動した場合、ということですか?
フォームクローズ時のアクセス違反例外に関しては、DB切断後にDBアクセスしようとしていたりしないですか? アンバインドと切断処理は正しく書いていますか? DB切断後に参照を残したままにしていたりしないですか?
まずDBファイル(MS Accessデータベースファイルか何かですか?)に正常に接続/切断できるかどうか(DBをオープン/クローズできるかどうか)を確認してください。
- 編集済み sygh 2017年11月9日 14:57
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月10日 1:53
- 回答としてマーク Kodanuki2727 2017年11月13日 6:37
-
syghさん、
ご回答いただきありがとうございます。返信が遅くなりまして申し訳ありません。
また不備な点をご指摘いただき、ありがとうございました。今後、質問させていただく際には注意するよう肝に銘じます。
====================
本件、結果的にAccessの.mdbファイルが破損しており、.mdbファイルの新規作成にて正常動作しました。
なぜファイルが破損したかは不明です。Accessを開いてレイアウトを確認しても問題なく、クエリの実行でも問題ありませんでしたので原因の特定が遅くなってしまいました。その後Accessにてデザインビューでは作成時の列順になっていたもののデータシートビューではAccessを起動するたびに列が入れ替わっていたりしたため.mdbファイルを作成しなおした次第です。