遅延バインディング(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, 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も同様だと思われます。

 

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

少し気持ち悪いですね。

 

 

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

 

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

<Codecampの特徴>

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

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

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

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

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

 

 

 

コメント

タイトルとURLをコピーしました