COM オブジェクトをインターフェイス型 'Excel._Worksheet' にキャストできません。

ExcelのCOMコンポーネントを利用し.NETのアプリケーションからExcelへデータを出力する機能を作成している途中に、下記の実行時例外が発生した。
failed: System.InvalidCastException : 型 'Excel.WorksheetClass' の COM オブジェクトを
インターフェイス型 'Excel._Worksheet' にキャストできません。
IID '{000208D8-0000-0000-C000-000000000046}' が指定されたインターフェイスの
COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、
この操作に失敗しました: インターフェイスがサポートされていません
(HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。

例外が発生するのは下記の部分である。シートの名前を変更しているだけなのだが、なぜかキャストエラーになってしまう。
よくよく調べてみると、どうもCOMコンポーネントはSTA(シングルスレッドアパートメント)から呼び出さないとうまくゆかないらしい。アプリケーションとExcelアプリケーションのスレッドが異なるため、シートのインスタンスを作ってあとからワークブックに追加するようなことはできないのかと考え、次のように修正すると例外は発生しなくなった。.NETのアプリケーション側でシートを生成するのではなく、Excelのアプリケーション内でワークシートを追加するようにしている。


参考URL
Unable to cast COM object of type 'System.__ComObject' to interface

OLE スレッド モデルの概要としくみ

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/336

関連情報

・Microsoft JScript 実行時エラー:オブジェクトを指定してください。
・このログインで要求されたデータベースXXX を開けません。ログインに失敗しました。ASPNET はログインできません
・Logging Application Blockのトラブルシューティング
・IISのログ出力先
・このログインで要求されたデータベースXXX を開けません。ログインに失敗しました。ASPNET はログインできません
・C# 3.5 yieldの読み方
・ASP.NET サーバーサイドのイベント処理の順番
・ASP.NETのWebページでグーグルアドセンスを貼り付ける方法
・IIS メタベースにアクセスできませんでした
・VSSで管理されているプロジェクトは、ファイルの名前の変更や移動は極力行わない方が良い
・Oracle 9.2へOLE DB接続する方法
・単体テストのデータ
・この行は既に別のテーブルに属しています
・データベースのバージョンは 655 なので、開けません。
・証明書ストアでマニフェスト署名用の証明書が見つかりません。
・次のモジュールは最適化を有効にされて、またはデバッグ情報なしでビルドされました
・String.Concatメソッドを使った文字列の連結
・ファイルの存在をチェックする
・テキストファイルをロードし文字列を読み込むサンプル
・任意の数の引数を受け取るメソッド

Copyright(C) 2007 アーキテクト360 Allrights reserved.