謎のエラー

弊社で開発した、とある制御のソフトウェアを新しいパソコンにインストール中、嫌なメッセージが表示されました。

「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」

インストールしたパソコンはNEC MATE J TYPE ME。新品です。ハーフサイズの拡張ボードが2枚入る省スペースタイプデスクトップが必要だったんでチョイスしました。Windows 7 32bit、メモリは2GB。他のソフトウェアで32bitでしか動かないソフトウェアがあるとのことで、お客様の要望によりこのOSを選択。ボードはContec社製のAnalog I/Oボード(AI-1216AL-PCI)とDigital I/Oボード(DIO-1616L-PE)。開発環境は、Visutal Studio 2010 (C#)とContecの各種APIを使用しました。

当方はよく、データ記憶用にaccessデータベースファイルを使用します。所謂、mdbファイルやaccdbファイルです。mdbファイルはJetというOLE DBを使用し、accdbファイルはACEというOLE DBを使用します。OLE DBというのは、データベースにアクセスするための開発環境です。mdbはAccess 2003までの仕様で、accdbはAccess 2007以降のファイルになります。データベースアクセスを使用する場合、ファイルタイプに応じてJetかACEかを選択すれば、そのほかのプログラム変更は特にありませんが、プログラム内でデータベースファイルの最適化を行う際にはJetの場合、64bitOSで使用できません。というのは、mdbファイルを最適化するのにMicrosoft Jet OLE DB Provider and Replication Objects (JRO) というCOMオブジェクトを参照することになりますが(JRO.JetEngine)、これがどうも64bitで機能しません。なので、32bitと64bitの両方で動作保障するためにはACEを使用するという選択肢になってしまいます。ちなみに、ACE OLE DBを使用するためには、Microsoft Access Database Engine 2010のインストールが必要になります。

http://www.microsoft.com/ja-jp/download/details.aspx?id=13255

で、これがまた厄介でして、64bit OSに32bitのOfficeがインストールされている場合(Accessに限らず)、64bitのDatabase Engineはインストールできないし、.NETからACEプロバイダも使えません。非常に面倒くさいです。クライアントPCが当方でコントロールできないようなパソコンの場合、ACEは使えないのかもしれません。

で、話は戻しまして今回の「保護されているメモリに・・・」ですが、とりあえネットで調べてもさっぱり解らないんで、今作ったソフトウェアを分解していって、どうやったら確実に発生するのかを徹底的に調べてみました。結果は驚くべきものでした。

?タイトル画面(Form)を表示

?メイン画面(Form)を表示

?メイン画面にはCombo Boxが1つ以上存在

?データベースに書き込み(INSERT, UPDATE等何でもよい)

?Contec製の各種I/OボードをOpen, Close(正常終了)

?メイン画面を×アイコンで閉じる

?Form_Closingイベントでダイアログ(MessageBox)を表示

?エラー発生。

このとき、エラーはCLRによるものでした。奇妙なことに、最初にエラーが出た後、終了させると画面に配置しているCombo Boxの数だけエラーが再発生します。また、.NET Framework 3.5で実行しましたが、4.0にするとCLRによるエラーではなく、Windowsのランタイムエラーで一発ダウンします。うーん。

ちなみに、上記のどれがかけてもエラーは出ません。だからといって、元のプログラムですと、タイトル画面を削除してもエラーは発生しました。ということは、フォーム等はエラーの直接的な原因ではなさそうです。但し、如何なる場合でも、データベースアクセスかI/OボードOpenのどちらかをしなければエラーは発生しません。ということは、データベースアクセスとI/OボードのOpenの相性ということになります。

ここからは勝手な推測ですが、ACEオブジェクトとI/Oボードの開発環境はアンマネージコードに対応していないため、相互に動かすとガベージコレクションが変に機能したものと思われます。これが正解と仮定した場合、当方の回避策としてはACEを使用しないというのが結論です。但し、今回は32bit版OSを使用しましたが、将来的にどう変わるかわかりません。というか、将来は確実に64bit版になるでしょう。なので、ソフトウェア内で32bitと64bitで分岐させ、32bitの場合はJet、64bitの場合はACEを使用するというふうに改良したところ、めでたし、めでたし、ということになりました。

ちなみに、当方所有のパソコンでインストールしてテストしたところ、そのようなエラーは出ませんでした・・・。これって、ハードウェアがおかしいということ???

 

 

2013-01-21 | Posted in 入江(社長)Comments Closed 

関連記事