|
分類:[C#]
お世話になります。DD.です。
C#からExcel操作を行っているのですが、タイミングや箇所もマチマチにエラーが発生してしまい困っております。 原因等をご教授頂ければと思います。 エラーは以下のようなものとなります。
@「RPC サーバーを利用できません。 」 A「リモート プロシージャコールに失敗しました」 B「System.InvalidCastException : 型 'XXXXXXX' の COM オブジェクトをインターフェイス型 'XXXXXX' にキャストできません。IID '{000208D8-0000-0000-C000-000000000046}' が指定されたインターフェイスのCOM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません」(XXXXXX部はWorksheetやRange)
エラーはいずれもCOMオブジェクトのメソッドやプロパティを介した際に発生します。(主にWorksheet.get_Item()、Worksheet.get_Range()、Range.Value2、Range.Value)
COMの解放に関しては、じゃんぬさんのサイトを参考にさせて頂きながら、参照を得る度にReleaseするようにしています。
処理としては、同ブック内のシートAのセル値を加工してシートBに設定するものです。(COMオブジェクトは参照する度に随時解放しており、ためておいて後でまとめて解放...ということはありません)
エラーが発生するのは、シートやセルの操作をある一定量(毎回ある程度同じくらい)行った後です。 少しの操作量で処理が完結する場合は発生しません。 また、エラーが起こる一定量に達する前に、ブックをClose()し、ExcelをQuit()してやり、 再度ブックをOpen()し直して、処理を継続するとエラーにはなりません。
あと、関係あるかわかりませんが気になった点として、WorksheetやRangeなど参照を持っていてかつ参照カウントも0になっていないのに、GC.Collect()を行うと直後から、オブジェクトを操作しようとするとエラーになってしまいます。 動作としてはこんなものなのでしょうか?
その関係もあり、GCが動いてしまうとRCWが強制的にリリースされてしまう?という疑問や、例えばCOMのオブジェクトをReleaseしつつも作成できる限界量があったりする?など懸念しております。
以上です。よろしくお願いします。
|