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

プログラミング

Visual StudioでC#を使って、コーディング中に以下の現象に遭遇しました。

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

???

スポンサーリンク
スポンサーリンク

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

以下の記事で説明した通り、

ExcelやWordやPowerPointを扱うプログラムを書く際は遅延バインディングを使います。

遅延バインディング(late binding, dynamic binding)と事前バインディング(early binding)
ちょっと聞きなれない言葉ですが、プログラミングのメカニズムとして 遅延バインディング(late 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も同様だと思われます。

世界中で同じような事例は報告されていないのでしょうか。

少し気持ち悪いですね。

プログラミングの無料レッスン体験

約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp

<Codecampの特徴>

1 現役エンジニアによる指導

2オンラインでのマンツーマン形式の講義

3大手企業にも導入されている実践的なカリキュラム

↓無料体験レッスン実施中です。

プログラミングのオンラインスクールCodeCamp