C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Excel操作で「RPC サーバーを利用できません。 」


(過去ログ 93 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■55878 / inTopicNo.1)  Excel操作で「RPC サーバーを利用できません。 」
  
□投稿者/ DD. (41回)-(2010/12/16(Thu) 21:40:59)

分類:[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しつつも作成できる限界量があったりする?など懸念しております。

以上です。よろしくお願いします。
引用返信 編集キー/
■55879 / inTopicNo.2)  Re[1]: Excel操作で「RPC サーバーを利用できません。 」
□投稿者/ shu (301回)-(2010/12/16(Thu) 21:54:50)
No55878 (DD. さん) に返信

ReleaseComObject
ではないですか?
引用返信 編集キー/
■55880 / inTopicNo.3)  Re[2]: Excel操作で「RPC サーバーを利用できません。 」
□投稿者/ DD. (44回)-(2010/12/16(Thu) 22:12:31)
>shuさん
回答させて頂きます。
例えばWorksheet.get_ItemやRange.get_Rangeなどで得た参照は随時、変数へ保持し解放(ReleaseComObject)しております。

また、例えばget_Rangeで得たものを、Range.Valueするならば、その間で解放してしまっているということもありません。
使用用途が済んでから解放し、解放後にそれを参照するようなこともしておりません。

よろしくお願いします。

引用返信 編集キー/
■55881 / inTopicNo.4)  Re[1]: Excel操作で「RPC サーバーを利用できません。 」
□投稿者/ 魔界の仮面弁士 (1990回)-(2010/12/16(Thu) 22:28:32)
2010/12/16(Thu) 22:29:53 編集(投稿者)

No55878 (DD. さん) に返信
> C#からExcel操作を行っているのですが、
デスクトップアプリでしょうか?

> タイミングや箇所もマチマチにエラーが発生してしまい困っております。
Main に [STAThread] が付与されていますか?
あるいは、ワーカースレッドから操作しようとしていませんか?

> IID '{000208D8-0000-0000-C000-000000000046}' が
_Worksheet のインターフェイス ID ですね。

> XXXXXX部はWorksheetやRange)
どの型の場合も、IID は {000208D8-0000-0000-C000-000000000046} でしたか?

> 参照を得る度にReleaseするようにしています。
Marshal.ReleaseComObject と Marshal.Release は別物ですが、それは置いといて。

別の場所で参照されているオブジェクトを解放していたりはしませんか?
子階層のオブジェクトを使用している最中は、親オブジェクトの参照も保持するようにしてみてください。

また、イベントを利用している場合には、解放前にイベントの解除も行っておいてください。

> エラーが発生するのは、シートやセルの操作をある一定量(毎回ある程度同じくらい)行った後です。
親オブジェクトを修飾せずに、下位のオブジェクトを呼び出すようなコードが記述されていた場合、
暗黙的にグローバルオブジェクトへの参照が生成され、二回目以降の操作が失敗する事があります。
http://support.microsoft.com/kb/319832/ja
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
http://yakinikunotare.boo.jp/orebase/index.php?Excel%A4%F2COM%B7%D0%CD%B3%A4%C7C%A2%F4%A4%AB%A4%E9%C1%E0%BA%EE%A4%B9%A4%EB

> 少しの操作量で処理が完結する場合は発生しません。
その「少し」に含まれていないコードを通過した場合に、問題が起きているのだと思います。
コードを少しずつ削って、原因箇所を探ってみてください。
引用返信 編集キー/
■55882 / inTopicNo.5)  Re[2]: Excel操作で「RPC サーバーを利用できません。 」
□投稿者/ DD. (45回)-(2010/12/16(Thu) 23:09:11)
>魔界の仮面弁士さん
回答させて頂きます。

> デスクトップアプリでしょうか?
はい。そうです。

> Main に [STAThread] が付与されていますか?
> あるいは、ワーカースレッドから操作しようとしていませんか?
[STAThread]は付与されております。
ワーカースレッドからの操作ではありません。


> どの型の場合も、IID は {000208D8-0000-0000-C000-000000000046} でしたか?
すいません。今は確認できないのですが、確か異なっていたと思います。
主にエラーが出ていたのは、WorksheetとRangeになります。

> Marshal.ReleaseComObject と Marshal.Release は別物ですが、それは置いといて。
Marshal.ReleaseComObjectを使用しています。

> 別の場所で参照されているオブジェクトを解放していたりはしませんか?
一応、なかったと思います。

> 子階層のオブジェクトを使用している最中は、親オブジェクトの参照も保持するようにしてみてください。
子階層というのは、ブック→シート→セル のような関係と思っていてよいでしょうか?
子に親を持たせるようにしてみます。

> また、イベントを利用している場合には、解放前にイベントの解除も行っておいてください。
イベントは使用しておりません。

> 親オブジェクトを修飾せずに、下位のオブジェクトを呼び出すようなコードが記述されていた場合、
> 暗黙的にグローバルオブジェクトへの参照が生成され、二回目以降の操作が失敗する事があります。
> http://support.microsoft.com/kb/319832/ja
> http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
> http://yakinikunotare.boo.jp/orebase/index.php?Excel%A4%F2COM%B7%D0%CD%B3%A4%C7C%A2%F4%A4%AB%A4%E9%C1%E0%BA%EE%A4%B9%A4%EB
ありがとうございます。参考にしてみます。

> その「少し」に含まれていないコードを通過した場合に、問題が起きているのだと思います。
> コードを少しずつ削って、原因箇所を探ってみてください。
少しずつ箇所を絞っていってみたいと思います。

今日は実際に確認することができませんので、また明日再度確認してみたいと思います。
引用返信 編集キー/
■55925 / inTopicNo.6)  Re[3]: Excel操作で「RPC サーバーを利用できません。 」
□投稿者/ DD. (47回)-(2010/12/18(Sat) 00:22:56)
問題が解決しましたので報告します。

どうやらExcel操作を担っていたクラスのデストラクタでExcelプロセスをKillしていたみたいで、
別の用途で使用されていたインスタンスがGCで回収される際にデストラクタが動いてプロセスが死んでいたため、
アクセス不可となりエラーになっていたようです。。。

回答を下さった方、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -