Airの制約を越えるFlashアプリを作る。C#とFlashをExternalInterface経由で相互通信。

何が良いって、Adobe Airとかの制約も一切受けずにもっとディープなアプリケーション作れちゃうよ!

Flashでできないポートのリッスンとかいろいろな実装をC#に委譲できちゃうし!


簡単にExternalInterfaceをC#で使うためのライブラリをダウンロードする

http://www.adobe.com/support/documentation/jp/flash/samples/
Programming_ActionScript3.0_samples.zipをダウンロード


解答したしたフォルダの
/Samples/IntrovertIM_CSharp/ExternalInterfaceProxy
以下のCSクラス群がC#でExternalInterfaceを簡単に実装するためのラッパー実装

DLLの配置

id:toytools:20070906 で述べているような方法でFlashアクセス用のDLLを配置する。

DLLはダウンロードしたファイル内に含まれているので上記の記事のところからダウンロードしなくても大丈夫(なはず)。
※今回は前に作ったものの修正にExternalInterfaceを使いたかったので、DLL再配置などはしていないので未確認

FlashからC#への通信

C#
private ExternalInterfaceProxy proxy;

public void InitializeExternalInterfaceCallBack(){
	/*
	 * this.flashは配置したAxShockwaveFlashフラッシュオブジェクトインスタンス
	 */
	proxy = new ExternalInterfaceProxy(this.flash);
	/*
	 * コールバックを追加.
	 */
	proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCallBack);
}
private object proxy_ExternalInterfaceCallBack(object sender, ExternalInterfaceCallEventArgs e){
	/*
	 * e.FunctionCall.FunctionNameにコールされたメソッド名が格納されている
	 * e.FunctionCall.Argumentsに引数のリストが格納されている
	 */
	switch (e.FunctionCall.FunctionName){
		case "SomeMethodName1":
			/*
			 * こんな感じで引数は取得
			 */
			string firstArgument = (string)e.FunctionCall.Arguments[0];
			break;
		case "SomeMethodName2":
			break;
		case "SomeMethodName3":
			break;
	}
	return null;
}
ActionScript3.0
/*
 * 通常のExternalInterfaceのcallの実装
 */
ExternalInterface.call( "SomeMethodName1" , "someArgumentValue" );

C#からFlashへの通信

C#
/*
 * proxyは上記で作成したproxyと同様のもの
 * private ExternalInterfaceProxy proxy;
 */
proxy.Call("someCStoFlashMethod", someArgumentVar );
ActionScript3.0
/*
 * 通常のExternalInterfaceのリッスンの実装
 */
ExternalInterface.addCallback( "someCStoFlashMethod" , _someCStoFlashMethod);
public function _someCStoFlashMethod( someArgumentVar:Number ):void{
	//do some function.
}