タイトル : Re: Exeファイルの挙動が途中で止まる 投稿日 : 2020/03/13(Fri) 15:17 投稿者 : 魔界の仮面弁士
> 本プログラムはテンプレートのExcelファイルを読み込み、それに対し、 > 書き込みを行った後、PDF出力を行うプログラムとなっております。 > (PDFの出力にはExportAsFixedFormat メソッドを使用しています。) Excel を参照設定して呼び出しているのですね。 現象を再現可能な短い実験用プログラムを提示することはできますか? また、Excel は Visible = True にて動作させていているでしょうか。 > 当初はComObjectの解放漏れが原因であると考えていたのですが、プログラムを確認すると > 解放漏れはなく、Excelは正常に終了しておりました。 コードを見ていないので何とも言えませんが、すべての COM オブジェクトに対して 処置を行っていて、それでも動作不良を引き起こしているのであれば、 RelaseComObject メソッドの戻り値が「0」になっていることを確認してみてください。 すべての RelaseComObject 呼び出しにおいて、 0 が返される実装になっている必要があります。 0 未満の値になった時は、どこかで過解放を引き起こしています。 1 以上の場合は、型指定のミスなどにより参照カウントが予期せず増加することで、 解放不良を引き起こしている可能性があります。 > 1回目は正常に終了し、2回目以降にExcelが原因でプログラムが停止する理由には何が考えられるか。 Selection や Active 何某に頼ったコードを書いていると、Delete 処理などのタイミングで、 何も選択されていない状態が一時的に引き起こされることで Exception に繋がることが ありますが…今回の事象はそれとは違っている印象。 良くあるのは、コーディングミスによって暗黙の Global オブジェクトへの参照が発生し、 それが残ってしまうケースです。この事故は .NET 空の呼び出しだけではなく、 VB6 からの呼び出しであっても生じます。下記は VB6 向けの情報ですが参考までに。 hhttps://support.microsoft.com/ja-jp/help/178510/excel-automation-fails-second-time-code-runs なお、参照設定せずにレイトバインドで呼び出している場合は、 Global オブジェクトへの暗黙的な参照が発生することが無いため、 この問題には行き当たらないはずです。(レイトバインドだと参照カウントが 予期せず増加しやすいので、通常は型を明示したアーリーバインドにすることを推奨) > A「ネイティブフレームが呼び出し履歴の最初にあるため式を評価できません。」というのは スレッドの Abort 等によってその表示になるケースだとか、あるいは 一時停止していた時間が長すぎて COM 通信がタイムアウトで続行できなくなったりなど、 幾つかのパターンで発生するようですが、具体的な理由までは分からないですね。 > デバッグモードで式が最適化されているため適切に評価出来ないという理解であっているか。 最適化されるのはどちらかというと Debug ビルドよりも Release ビルドな気がします。 |