遅延バインディング(late binding, dynamic binding)でCreateInstanceで固まる(フリーズ)

Visual StudioでC#を使って遅延バインディングを用いてコーディング中に奇妙な現象に遭遇しました。

スポンサーリンク

遅延バインディングでCreateInstanceで固まる

この記事で説明した通り、ExcelやWordやPowerPointを扱うプログラムを書く際は遅延バインディングを使います。

遅延バインディング(late binding, dynamic binding)と事前バインディング(early binding)
ちょっと聞きなれない言葉ですが、プログラミングのメカニズムとして遅延バインディングと事前バインディングという二つのバインディ...

そこでVisual StudioでC#を使って以下のようにコーディングしました。

ところが、デバッグ実行中に、clAppliClass = Activator.CreateInstance(clType);

のところで以下のメッセージを表示したまま、CreateInstanceメソッドで固まってしまいます。

WS000172

インフォメーション

しばらくお待ちください。

ここでclTypeは以下の通りです。

clType = {Name = "ApplicationClass" FullName = "Microsoft.Office.Interop.PowerPoint.ApplicationClass"}

image

不思議なことにデバッグモジュールではCreateInstanceで固まるものの、リリースモジュールでは問題なく実行されます。

ただ、デバッグモジュールが動かないとデバッグ出来ません。

CreateInstanceでPowerPoint 2013が強制終了

さらに不思議なことに以下の現象が発生します。

  1. PowerPoint 2013を起動して、プレゼンテーションを開かないでおいておきます。
  2. Visual Studioでデバッグ実行を開始します。
    clAppliClass = Activator.CreateInstance(clType);
    まで実行すると、CreateInstanceが呼び出されたタイミングでPowerPoint 2013が強制終了します。
  3. その後、以下のメッセージが表示されてCreateInstanceがフリーズします(固まります)。

WS000172

インフォメーション

しばらくお待ちください。

なんとPowerPoint 2013を起動して、プレゼンテーションを開かないでおいておくと、別プロセスで起動したはずのCreateInstanceがPowerPoint 2013を強制終了させました!!

別プロセスで実行してるはずなのに、こんなことが起こるんですね。

COMでMicrosoft.Office.Interop.PowerPoint.ApplicationClassが連携しているのでしょうか??

次に違うことを試してみます。

  1. PowerPoint 2013を起動して、プレゼンテーションを開いておきます。
  2. Visual Studioでデバッグ実行を開始します。
    clAppliClass = Activator.CreateInstance(clType);
    がすんなり実行されてCreateInstanceは正常に戻ってきます。

一瞬だけ以下のメッセージが表示されます。


WS000172

なんとPowerPoint 2013を起動して、何かプレゼンテーションを開いておくとCreateInstanceが固まらずに正常にメソッドの呼び出しが出来ました!!

これで正常にデバッグ出来ます。

まとめ

今回は現象の報告と回避方法だけです。

以下の事実だけ知っておけば、とりあえずはデバッグできます。

PowerPoint 2013を起動して、何かプレゼンテーションを開いておくとCreateInstanceが固まらずに正常にメソッドの呼び出しが出来ます。

今回は、Type clType = Type.GetTypeFromProgID("PowerPoint.Application");

でPowerPointのアプリケーションを遅延バインディングしましたが、ExcelやWordも同様だと思われます。
世界中で同じような事例は報告されていないのでしょうか。
少し気持ち悪いですね。

この記事、お役に立ちましたらシェアをお願いします。

スポンサーリンク
スポンサーリンク
Translate »