C#とFlashの連携その4を書いてから、かなり間が空いてますね・・・・C#とFlashの連携その4では、C#とC#に貼り付けたFlashの連携において、Flash側からC#へは「fscommand」、C#側からFlash側へはと「SetVariable」で行いました。「ExternalInterface」を使って、もっと柔軟に連携する事が出来るハズじゃあと色々調べてみたら、http://livedocs.adobe.com/flex/3_jp/html/help.html?content=19_External_Interface_10.htmlとかを見ててようやっと判ったのでメモ。samples」の項目のとこの「Programming_ActionScript3.0_samples.zip」をダウンロードして解凍しておきます。下準備が終ったら、まずFlashを作ります。flaファイルの名前は、test.flaとしました。FlashCS3(ActionScript3)ファイルです。画面にムービークリップを作りインスタンス名「btn_mc」としてます。後、C#から来た値を確認する為に「debug」と名前を付けたダイナミックテキストを置いてます。ActionScriptなので、このままタイムラインに書いてしまいます。受け取りました";}ステージ上の"sv"と書いてあるところが、ダイナミックテキスト「debug」"sv"って文字に意味はありません・・・・ステージ下の真っ赤な■が、ムービークリップ「btn_mc」です。真ん中の1はただの目印。なんの意味もありません。("testFunction","a1","b2","c3");で、C#側のメソッド「testFunction」を呼び出します。その後に続く"a1","b2","c3"はメソッド呼び出す時の引数。いくつ付けても大丈夫です。testFunction);で、C#がFlash側のメソッド「testFunction」を呼び出します。引数の数はいくつでもいいように(...args)にしてます。次はC#VC#2005で、Windowsアプリケーションの新規プロジェクトを作成します。プロジェクト名は「FlaExternal」としました。.NETへのFlashの貼り付け方はこちらを参考に開発日記開始ただこの時は、張り付いた「axShockwaveFlash1」のプロパティ「Movie」に「c:\test.swf」と入れて読み込ませてますが、これだとswfの位置が、C#で作成したexeの位置に関係なくCドライブ上の「test.swf」固定されてしまいます・・・・これは不便。今回はexeと同じとこに置いてある「test.swf」を読み込ませます。プロパティ「Movie」は空白のまま。いう事で、とりあえずデバッグモードで動かすのでexeが出来上がる「bin」フォルダの中の「Debug」の中へ、さっきのflaをパブリッシュした「test.swf」を放り込んでおきます。出来上がったフォームをダブルクリックすると「Form1.cs」が立ち上がります。swfPath);の2行を書きます。実行するとフォームの中に「test.swf」が張り付いてるハズです。Flahなので、フォーム全体の大きさに、どうせならウィンドウサイズが変わってもFlashのサイズもピタっと会うようにしてしまいましょう・・・って事でForm1.cs[デザイン]を選んだ状態でプロパティウィンドウの「イベント」を選択。その中の「SizeChanged」をダブルクリック。this.Size.Height;の2行を書いてあげます。これでウィンドウサイズを変えた時にFlashのサイズがウィンドウにぴったりあうようになりますが起動時にもあわせたいので、さっきの2行をメソッド「Form1_Load」の中にも追加。FlashとC#の連携。「Programming_ActionScript3.0_samples.zip」を解凍して出来た「Samples」フォルダの中に「IntrovertIM_CSharp」フォルダがあります。これ自体がC#とFlashの連携見本のC#プロジェクトではあるのですが、その中の「ExternalInterfaceProxy」フォルダの中にExternalInterfaceCall.csExternalInterfaceCallEventArgs.csExternalInterfaceProxy.csExternalInterfaceSerializer.csの4ファイルがあります。これが、http://livedocs.adobe.com/flex/3_jp/html/help.html?content=19_External_Interface_10.htmlのヘルプで説明されている4ファイルです。今回この4ファイルをそのまま使います。この4ファイルを作ったプロジェクト「FlaExternal」の中にコピーしてあげます。プロジェクトのcsファイルとして認識させます。Flash.External;を追加Flashからの命令を受け取るメソッドを追加します。null;}System.Diagnostics.Debug.WriteLineはC#でtraceで紹介した、デバッグ用にメッセージをイミディエイトウインドウに出力する為の命令です。Flashから送られてきた引数を出力させてみます。ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCall);を追加します。結果は、ごらんの通り。Flashのムービークリップを押すと、C#のイミディエイトウインドウにActionScriptに書かれたメソッド名、引数が表示されます。これでFlashからC#への連携は終了しました。今度は、C#側からFlashへデータを渡すようにします。FlashからC#にデータが渡ってきたら、そのタイミングでC#からFlashにデータを渡すようにします。"Y1"付きで呼び出されます。これで、C#とFlashの双方で柔軟なやりとりが出来るようになりました。Sunおつかれさまです。Flashアプリだけじゃ、やれない機能があったりします。ファイルの読み書きもそうだし、常駐アプリとかもそう。Airを使えば一気に解決なのですが、そうもいかない事情があって.Netでラップすることにしました。Directorで包む手もあるんですが、DirectorだとDirector内部のFlashプレーヤーがActionScript2までしか使えないので、それ又不便。.NETの場合も、ActiveXプレーヤーを包むだけなので、同手法だとDirectorでもいけそうな気もするけど、あえてDirectorを選ぶ必要もない訳で・・・・.NET(VC#2005の場合)でのFlashの包み方はこちら開発日記開始VC#2005のフォームプログラムを組んでて、FlashでいうTraceってないのかなと思ってさがしてみたらあったSystem.Diagnostics.Debug.WriteLine("ここのメッセージ");まあ基本的な命令でしょうが、C#はあまりメインで触ってなかったのでメッセージボックスとかで表示させて確認したりしてましたよ。これで本とかみてるとイミディエイトウインドウに出力されるらしいんだけど、どううまくいかない・・・?と思って調べてみると出力ウィンドウ表示されておりました。出力ウィンドウだと、見たいメッセージ以外の色々なメッセージが混在してるので非常に見にくい。「ツール」メニューから「オプション」を選び、「デバッグ・全般」のなかから「出力ウインドウの文字をすべてイミディエイトウインドウにリダイレクトする」にチェックマークをつける。これで、FlashでTraceを使う感覚で使える・・・でもC#はC#で結構組み安いですね。Flashで組んでラップじゃなくても、C#でまんま組めばいいような気もしてきました。組み安いと言っても、FlashやDirector程、楽ではないんですけどね。基本的になんでも出来るのし、資料もネットで大体出てきて解決できますしね。今から路線変更は危ないか。