読者です 読者をやめる 読者になる 読者になる

表示時にエラー発生。DLLの読み込みタイミングが問題か!?

昨日公開したaiOwaですが、いきなり問題が発生してしまいましたorz...
aiOwaを表示しようとしたところ、ウィンドウのアラートが発生するとのこと。

Silverlight error message
ErrorCode: 1001
ErrorType: ParserError
Message: AG_E_UNKNOWN_ERROR
XamlFile: Page.xaml
Line: 6
Position: 9

私の環境ではまったく再現できませんでした。。が、同じモジュールを別のサーバーにおいて実行すると発生するサーバーとしないサーバーがあることが発覚しました。(ちなみに私の環境では両サーバーともまったく正常に動いておりました。orz...)また、上記の現象を最初に教えて頂いた方も、たぶん社内で見て頂いていたのか、周囲の方も同様の現象が発生したとのこと。

と、いうことでネットワークが怪しいということで調査しました。ちなみに、これ以降は全く確証がない、私の感覚と予想で書いているので、多分に間違っている可能性があります。

ParserError ということで XAML がパースできていない、もしくはコントロールが見つからないような雰囲気です。ということは XAML が間違っているか、コントロールが見つからない、つまりコントロールのクラスが見つからないということが考えられます。しかし、動く環境と動かない環境があるので XAML が間違っていれば、すべての環境で動かないはずなので、その可能性はほとんどありません。単純にコントロールが見つからないということも上記の理由であり得なさそうです。しかし、DLLがダウンロードされる前に、そのコントロールを使うコードが走ってしまった場合は、見つからないという事態になってしまいます。つまりネットワークの環境の差異でダウンロードがいやに遅かったりした場合に、ダウンロードが終了していないのに終了しているとみなされてしまうってことも考えられます(自信ないですが)。あっ、ちなみに aiOwa はほとんどのボタンやウィンドウなどのコントロールは、それぞれに独立したコントロールクラスとして実装して、本体のアセンブリとは別のアセンブリになってます(Silverlightのプロジェクトの構成の仕方も試行錯誤中ですが、おいおいまとまり次第、載せていこうと思います)。

上記で、コントロールを含んでいる DLL のダウンロードのタイミングが怪しいという結論に至りました。それを確認するために、まずは HTTP 要求を Fiddler2 で覗いてみます。すると、メインのDLLがダウンロードされて、コントロールのDLLのダウンロードが開始される前に、上記のエラーが発生してしまいました。。Fiddlerを間に挟んだことで何かが変わったのでしょう。Fiddlerを落としてみるとエラーが発生しなくなりました。ものすごい微妙な動きです。しかし怪我の功名か、やはりコントロールのダウンロードができていない、もしくはできないためにエラーが出ていることがわかりました(しかし、おなじエラーだと言っても同じ原因かどうかはわからないので確信は持てないのですが・・・)。では、試しににということでコントロールのDLLを削除して(Fiddlerは起動せずに)実行してみたところ、おなじエラーが発生しました。

結論です。全く確信はもてずかつ非常にあいまいなのですが、ネットワークや実行しているマシンの環境・状態により、DLLがダウンロードされる前にコードが実行されてしまう可能性があります。

と、いうことは先にすべてのDLLがダウンロードされている状態で起動すれば、問題は発生しないと考えられます。そのような状態にするために、aiOwa起動の直前に一枚スプラッシュスクリーンをはさんで、そこでDLLをダウンロードするように変更しました。アプリケーションの読み込み時にスプラッシュ画面を使う

さて、この修正で本当にうまくいってるかどうかの自信が半々なのですが、しばらく様子を見たいと思います。


そうそう、今回の件で新たな発見があったので後日それも載せようと思っています。