はじめまして。
VB.NETからExcelを操作する業務アプリを作っているのですが、
1点、どう考えていいのか、分からないところがありました。
以下の考え方って間違えているのでしょうか?
■やりたいこと
業務アプリを立ち上げる際に、backgroundworkerを使って、
別スレッドにて、Excelを起動して、そのインスタンスをグローバルな変数としてアクセスしたい。
こうすることで、Excelが立ち上がる処理を、業務アプリが立ち上がる処理に
重ねることができ、順々に立ち上げるよりも高速に立ち上げることができる。
上記やりたいことは、実験してみたところ、いい感じに動作しました。
何か目に見える不具合が出ているわけではないのですが、
COMの概念から言うと、以下の疑問が出てきます。
・VB.NETで作ったフォームは、STAで動いている。
・BackgroundWorkerはMTAである。
・Officeは、STAである。
■疑問①
上記の通りだと認識していますが、このとおりだとすると、
MTAのBWからSTAのCOMオブジェクトを生成することになります。
これって、問題ないのでしょうか?
厳密には問題あるけど、これが原因で変な動作をすることはぶっちゃけないでしょう。って感じなのか?
■疑問②
疑問①がOKだったとして、BWで作ったCOMオブジェクトに、
メインスレッドから特別な細工無しでアクセスしていますが、これって問題ないのでしょうか?
厳密には、Invok等を使わないと、いけないとか、あるような気がするのですが。。。
COMについて、調査をしてみたのですが、どんどんディープな世界に入ってしまい、
理解することが難しいです。
知見者の方のご意見を聞かせていただけたら、うれしいです。
よろしくお願いします。
業務用アプリは面白くない。
以上。
能書きより、動くコードを見せてよね。
あまりCOMの深い話はわかっていないのですが……。
Office自体はSTAですが,COMのマーシャリング機構によって,一応MTAからもアクセス可能なようです。
MSDN: Office でのスレッドのサポート
http://msdn.microsoft.com/ja-jp/library/8sesy69e.aspx
この上記の記事がお役に立てば幸いです。