タイプイニシャライザって何でしょうか?

解決


初心者  2009-01-08 11:25:36  No: 141218  IP: 192.*.*.*

前回「Form1処理時にForm2の処理結果を考慮させるには?」でShowDialogを使用したのですが、Form2の処理からForm1処理に戻った後にCallでModule内のSubプロシージャを呼び出そうとしたのですが、「TypeInitializationException」はハンドルされませんでした(タイプ初期化子が例外をスローしました)となってしまいます。ShowDialogを使用するとなにか規制があるのでしょうか?ご教授願います。

編集 削除
YuO  2009-01-08 11:42:49  No: 141219  IP: 192.*.*.*

クラス初期化子 (Shared Sub New())が例外を投げると,この例外にラップされた例外が発生します。
http://msdn.microsoft.com/ja-jp/library/system.typeinitializationexception.aspx

InnerExceptionを確認してください。

編集 削除
初心者  2009-01-08 11:49:31  No: 141220  IP: 192.*.*.*

すみません、Module内でWordの作成処理を実施する為に
Public Word As New Word.Global  とインスタンスを生成すると発生するみたいです。

編集 削除
YuO  2009-01-08 13:50:26  No: 141221  IP: 192.*.*.*

Moduleというのは,インスタンスメンバが存在せず,かつインスタンス化不可能なClassです。
Moduleのメンバは,すべてShared修飾されたものとして扱われます。
# RefactorでC#に逆コンパイルしてみるとよくわかると思います。

で,SharedなフィールドでNewしているため,クラス初期化子が暗黙に存在し,そこで例外が発生したのでTypeInitializationExceptionが発生したのだと思います。


さて,追試してみました。

発生した例外のInnerExceptionプロパティから
System.Runtime.InteropServices.COMException
のオブジェクトが取得でき,メッセージが
CLSID {000209F0-0000-0000-C000-000000000046} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80040154。
とかだったりしませんか。
少し試してみたところだと,Wordのインスタンスが存在しない状況でGlobalオブジェクトを作成しようとすると,上記の例外が発生しました。
Applicationを先に作成して,その後でGlobalオブジェクトを作るようにしてみてはどうでしょうか。

編集 削除
初心者  2009-01-09 11:11:40  No: 141222  IP: 192.*.*.*

ご指摘の通り、
>CLSID {000209F0-0000-0000-C000-000000000046} を含むコンポーネントの >COM クラス ファクトリを取得中に、次のエラーが発生しました: 80040154。
が発生していました。ワードオブジェクト作成後にGlobalオブジェクトを作成したところエラーを回避できました。自分はよくModuleを使用するのですが、出来る限り使用しないほうがよろしいのでしょうか。ご教授いただきありがとうございました。

編集 削除