VB.NETからExcelをBackgroundWorkerにて、起動するには


中田  2011-06-06 17:39:53  No: 147330  IP: [192.*.*.*]

はじめまして。

VB.NETからExcelを操作する業務アプリを作っているのですが、
1点、どう考えていいのか、分からないところがありました。

以下の考え方って間違えているのでしょうか?

■やりたいこと
  業務アプリを立ち上げる際に、backgroundworkerを使って、
  別スレッドにて、Excelを起動して、そのインスタンスをグローバルな変数としてアクセスしたい。

  こうすることで、Excelが立ち上がる処理を、業務アプリが立ち上がる処理に
  重ねることができ、順々に立ち上げるよりも高速に立ち上げることができる。

上記やりたいことは、実験してみたところ、いい感じに動作しました。

何か目に見える不具合が出ているわけではないのですが、
COMの概念から言うと、以下の疑問が出てきます。

・VB.NETで作ったフォームは、STAで動いている。
・BackgroundWorkerはMTAである。
・Officeは、STAである。

■疑問①
  上記の通りだと認識していますが、このとおりだとすると、
  MTAのBWからSTAのCOMオブジェクトを生成することになります。

  これって、問題ないのでしょうか?

  厳密には問題あるけど、これが原因で変な動作をすることはぶっちゃけないでしょう。って感じなのか?

■疑問②
  疑問①がOKだったとして、BWで作ったCOMオブジェクトに、
  メインスレッドから特別な細工無しでアクセスしていますが、これって問題ないのでしょうか?

  厳密には、Invok等を使わないと、いけないとか、あるような気がするのですが。。。


COMについて、調査をしてみたのですが、どんどんディープな世界に入ってしまい、
理解することが難しいです。

知見者の方のご意見を聞かせていただけたら、うれしいです。

よろしくお願いします。

編集 削除
翔泳ミキオ  2011-06-06 22:31:48  No: 147331  IP: [192.*.*.*]

業務用アプリは面白くない。

以上。

能書きより、動くコードを見せてよね。

編集 削除
YuO  2011-06-19 00:02:35  No: 147332  IP: [192.*.*.*]

あまりCOMの深い話はわかっていないのですが……。

Office自体はSTAですが,COMのマーシャリング機構によって,一応MTAからもアクセス可能なようです。
MSDN: Office でのスレッドのサポート
http://msdn.microsoft.com/ja-jp/library/8sesy69e.aspx

この上記の記事がお役に立てば幸いです。

編集 削除