C#のアプリに埋め込んだswfとの通信(ExternalInterface)


C#のアプリ(Windowsフォームアプリケーション)にswfを埋め込み方法を取り上げたので、今回はその間をExternalInterfaceで通信する方法を説明する。

昔は、fscommand()とSetVariableを使うやり方が多かったみたいだけど、今はExternalInterfaceがいいようだ。Adobeもお勧めしている。
ここで説明する内容は次の二つのページを参考にしている。
ActiveX コンテナでの外部 API の使用
http://livedocs.adobe.com/flex/3_jp/html/help.html?content=19_External_Interface_10.html
C#とFlashの連携その5
http://createwave.blog104.fc2.com/?no=128
より自分的に理解しやすい形で紹介してみる。

以前のエントリーC#のアプリにFlash(swf)を埋め込む。は理解していることを前提にしている。

◆はじめに

作例としては、C#側のフォームとswf側のフォームでチャットのようにメッセージを送受信するものだ。

上部がエリアがC#のフォーム。下部のピンクのエリアがswfのフォーム。
Adobeのサンプルと同じ趣旨なのだが、Adobeのサンプルは古いタイプのプロジェクトファイルだからか、手元のMicrosoft Visual C# 2010 Expressだと、変換したりアラート類がいろいろ出たりで、安心してリファレンスとして扱いにくい。また、本筋じゃないところでコードが増えているようにも見えたので、必要な要素に絞った作例で説明する。

FlashからはExternalInterfaceを用いるので、JSとの通信と全く代わりが無い。そのまま流用できるほどだ。
次の枠内のもので、実際に同じswfとjsでの通信ができていることが確認できる。

ただ、C#側にはFlashとの通信用のExternalInterfaceはデフォルトでは無いので、設定が必要だ。

◆ExternalInterfaceを使うための準備

C#とFlashでExternalInterfaceを用いて通信するためのクラスがAdobeによって提供されているので、手に入れて、使える状態にする。

・C#用のクラスを手に入れる。

Flash Developer CenterのSamplesのページ
Flash CS3 Professional samplesの項目にリンクされているProgramming_ActionScript3.0_samples.zipをダウンロードする。
http://www.adobe.com/devnet/flash/samples.html

展開して、IntrovertIM_CSharpの中のExternalInterfaceProxyから、次の4ファイルをコピーする。
ExternalInterfaceCall.cs
ExternalInterfaceCallEventArgs.cs
ExternalInterfaceProxy.cs
ExternalInterfaceSerializer.cs

・使える状態にする。

自分で作ったWindowsフォームアプリケーションディレクトリ内のProgramp.csと同階層にペーストする。

「ソリューション エクスプローラー」のメニュー上、「すべてのファイルを表示」ボタンを選択。

ペーストした4ファイルがソリューションエクスプローラーに表示される。
選択して、右クリックで「プロジェクトに含める」を選択。


これで準備完了。

◆Flash側

ここは、ブラウザ上のJS向けの書き方と全く同じ。

・C#への送信

次のようにC#上の関数名(”fromAS”)と引数(_nameField.text, message)を指定する。

ただし、実際にはJSと違って、C#上のfromASという関数を直接実行できるわけではない。

・C#からの受信

コールバック関数の登録もJSと同じ。

C#側からは「asFunction」を指定すると、AS内のcallbackFunctionが実行される。

・ソースコード全体

◆C#側

先日の(C#のアプリにFlash(swf)を埋め込む。)と同じ要領で、Form1.csファイルを改変する。

ExternalInterfaceのクラスを使うために、宣言をする。

まずは、ExternalInterfaceProxyをつくり、

どのswfと送受信するためのproxyかを登録する。

・ASからの受信

実行される関数は次のように書く。返り値はobjectにしないといけないみたい。voidにしてreturnを消したらエラーが出た。

AS上で指定した関数名は「e.FunctionCall.FunctionName」で取得できる。その名前の関数が実行されるわけではない。
どんな名前を指定しても、C#上で登録したイベントハンドラー(ここではproxy_ExternalInterfaceCall)が実行されるだけだ。

・ASへの送信

ASのExternalInterface.callと全く同じ書式。AS上の関数名(”asFunction”)と、引数(textBox1.Text, textBox2.Text)を指定する。

・ソースコード

◆ソースコード

AS

example.zip

C#

WindowsFormsApplication2.zip
(このzip圧縮ファイルにはExternalInterfaceのクラスファイルは同梱されていない。上の説明を参考にAdobeのサンプルからダウンロードして補完する必要がある)

Comments are closed.