http://www.scripter.co.kr/entry/FlashExternal-c-안에-as3-AVM2-넣기
에서 같은주제를 아주 예전에 다루었지만 내용이 너무 부실하고, 철없었기 때문에 보강을 해야겠다.
사실 구글에 많이 올라와 있는 "AxShockwaveFlashObjects" 관련글들을 그대로 따라했다가는
이유도 모르는 FileNotFoundException 이 나올것이다.
그런 분들은 아래의 DLL 을 사용하기 바란다 .
코드를 살펴 보겠다.
c#
Created with colorer-take5 library. Type 'csharp' using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using TRACE_Lib; using Flash.External; using AxShockwaveFlashObjects; using System.IO; using System.Collections; namespace FlashTEST_1 { public partial class Form1 : Form { public TRACE.TRACE_DELE trace = TRACE.getTrace; public Form1() { InitializeComponent(); } //[0] private AxShockwaveFlash flash; private ExternalInterfaceProxy proxy; protected override void OnLoad(EventArgs e) { //[1] flash = new AxShockwaveFlash(); this.Controls.Add(flash); //[2] string swfPath = Environment.CurrentDirectory + Path.DirectorySeparatorChar+ "TestCS.swf"; flash.LoadMovie(0, swfPath); flash.Width = 500; flash.Height = 400; //[3] proxy = new ExternalInterfaceProxy(flash); //[4] proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCall); base.OnLoad(e); } object proxy_ExternalInterfaceCall(object sender, ExternalInterfaceCallEventArgs e) { //[5] string name = e.FunctionCall.FunctionName; object[] args = e.FunctionCall.Arguments; if (name == "ready") { trace("#", name, (args[0] as ArrayList)[0], (args[0] as ArrayList)[1]); } //[6] if (name == "testCall") { //[7] TxReceive.Text += (args[0] as ArrayList)[0].ToString() + Environment.NewLine; } //[8] return null; } private void button1_Click(object sender, EventArgs e) { //[9] proxy.Call("CallAS3", TxSend.Text); } } }/* [0] : Form 으로 플래시를 불러오기위해서는 AxShockwaveFlash 라는 윈도우 컨트롤과
* 그것을 제어하는 ExternalInterfaceProxy 를 사용하여야 정확하게 AS3과 통신할수 있다.
*
* [1] : flash 컨테이너를 선언하고 메인폼에 붙였다.
*
* [2] : TestCS.swf 의 위치를 획득하여 LoadMovie 하였다.
*
* [3] : 프록시를 선언하여 플래시의 ExternalInterface 과 연결하기로 하였다.
*
* [4] : 프록시에 이벤트를 선언하여 플래시에서 오는 신호를 받아 들인다. *
* [5] : ExternalInterfaceCallEventArgs 의 멤버로 FunctionCall에서 * FunctionName 과 Arguments를 얻을수 있다. *
* [6] : "testCall" 은 AS3 코드에서 보면 알겠지만 "Call("testCall" , input.text);" 처럼
* 서로의 이름이 같게 하여 원하는 값을 추출 한다. 이는 c# 이 값을 받는 상황 과 보내는 상황
* 모두 적용 된다.
* * [7] : 플래시에서 "...args" 형으로 매개변수를 받는것이 c# 으로 넘어오면 args[0] 로 된다. * 그리고 그타입은 ArrayList 이다
* ※ AS3 의 Array는 배열의 타입을 따로 지정하지 않는 ArrayList 이다.
*
* [8] : 이유는 모르겠지만 라이브러리 상의 이벤트 델리게이트 반환타입이 오브젝트 이어서
* 불가피하게 return 하였다. * * [9] : "[6]"참고 , 플래시로 값을 보낸다. * * */그다음은..AS3
/**Created with colorer-take5 library. Type 'csharp' package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.external.ExternalInterface; import flash.system.fscommand; import flash.text.TextField; import flash.text.TextFieldType; import flash.utils.Timer; public class TestCS extends Sprite { private var tx: TextField; private var input : TextField; private var bt : Sprite; public function TestCS() { //[0] //view.. tx = new TextField(); addChild(tx); tx.border = true; tx.multiline = true; tx.width = stage.stageWidth; tx.height = stage.stageHeight-50; tx.text = "string!"; input = new TextField(); input.type = TextFieldType.INPUT; input.x= 0 ; input.y = tx.y + tx.height + 10; input.width = 200; input.border = true; input.height = 30; input.text = "Hellow C#! Iam AS3"; addChild(input); bt = new Sprite(); bt.graphics.beginFill(0x0); bt.graphics.drawRect(0,0,100,30); bt.x = input.x + input.width + 30; bt.y = input.y; bt.buttonMode = true; addChild(bt); //[1] //Event addEventListener(Event.ADDED_TO_STAGE , ready); bt.addEventListener(MouseEvent.CLICK , bt_call); //[2] //callback CallBack("CallAS3" , callBackFromCSharp); } //EventHandler & CallbackMethod private function ready(e:Event = null):void { Call("ready" , stage.stageWidth , stage.stageHeight); } //[3] private function callBackFromCSharp(msg : String):void { tx.text += " \n" + msg; } //[4] private function bt_call(e:MouseEvent):void { Call("testCall" , input.text); } //[5] //Exception Local Error private function Call(ParamName : String ,...args):void { try{ ExternalInterface.call(ParamName , args); }catch(e:Error){tx.text += e.toString() +"\n";} } private function CallBack(ParamName : String , CallBack:Function):void { try{ ExternalInterface.addCallback(ParamName , CallBack); }catch(e:Error){} } } }
* [0] : 화면구성에 필요한 요소들을 생성 , 배치 하였다.
*
* [1] : 간단한 문자열을 보낼 버튼 이벤트와 초기화 이벤트를 작성하여 상황에 맞게 c# 으로 값을
* 보낼것이다.
* 그러나 초기화 이벤트 (Event.ADDED_TO_STAGE) 는 c# 에서 동작하지 않는다.(?왜그런지..)
*
* [2] : c# 에서 올 신호를 받는 콜백을 선언하였다.
*
* [3] : "[2]" 를 받는 메서드
*
* [4] : 버튼을 누르면 간단히 C# 으로 문자열을 보내는 이벤트 핸들러 "[1]" 참고
*
* [5] : 코드를 이처럼 처리한 이유는 swf 를 감싸는 무언가가 없는 상황에서 ExternalInterface 는 에러를 발생시킨다.
*
* */
'C#' 카테고리의 다른 글
[c# ThreadApartment] ActiveX 컨트롤 , COM 객체를 새로운 쓰레드에서 접근할때 (67) | 2011.01.20 |
---|---|
[new Thread in new Form] 새로운 쓰레드 안에 새로운 윈도우폼 (110) | 2011.01.19 |
[AxShockwaveFlashObjects] AS3 in C# (122) | 2011.01.17 |
[.Net Profiler] ANTS Memory Profiler 사용해보기 (158) | 2011.01.16 |
[LINQ _ XML] 간략한 LINQ to XML 사용법 (167) | 2011.01.10 |
[Zxing , QR Sample ] C# 에서 QR 라이브러리 사용하기 (256) | 2011.01.07 |
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
이용약관위배로 관리자 삭제된 댓글입니다.
우있冒险岛服务端奇迹mu服务端传奇外传服务端风云无双服务端神迹服务端
英雄王座travia服务端暗黑修仙服务端仙境传说ro服务端弹弹堂服务端
蜀门服务端RF服务端丝路传说服务端倚天2服务端决战服务端征服-SF端
传奇私服开服一条龙开区服务-
魔域私服一条龙开区服务-
传奇广告代理-
IDC服务器以及空间租用-
破天私服开服一条龙服务-
客服咨询QQ(企鹅扣扣)1124999543
Email:1124999543@qq.com
更多商业版本免费开放下载
遨腾科技梦幻真彩5D堡垒王国玛法战场韩国连击版传奇服务端
遨腾科技新传奇全新3D界面装备打孔座骑技能镶嵌宝石英雄合击特别版传奇服务端
遨腾科技已开5区独家传承宝盒2.06装备精炼属性转移特色赌神轻变升级版传奇服务端
마버
일없大话西游服务端凡人修真服务端大话西游服务端页游服务端问道服务端
跑跑卡丁车服务端英雄远征服务端幻灵游侠私服务端洪荒神话私服务端
完美世界服务端烈焰服务端洛汗服务端新魔界服务端绝对女神私服务端
魔兽私服开区一条龙服务-
传奇私服开传奇一条龙服务-
传奇广告代理-
IDC服务器以及空间租用-
魔域开区sf一条龙开区服务-
客服咨询QQ(企鹅扣扣)1325876192
Email:1325876192@qq.com
商业版本免费开放下载
紫川科技最新毁灭天下1.85狂雷独家合击热血复古三职业新装传奇服务端
紫川科技20星大极品良装+80麒麟锻造中变传奇服务端
紫川科技独家轻变1.89奥妙转生神龙锻造珍珑元素版传奇服务端
紫川科技独家九转1.85四皇冠加倍装备特戒龙卫알에
기그剑侠情缘服务端密传服务端街头篮球服务端A3私服务端破天一剑服务端
魔域服务端魔兽世界服务端天龙八部服务端RF服务端传奇归来私服务端
风云雄霸天下服务端天之炼狱一条龙大话西游服务端精灵复兴私服务端
传奇世界私服开服一条龙服务-
魔兽私服开区一条龙服务-
IDC服务器以及空间租用-
魔域开区sf一条龙开区服务-
传奇广告代理-
客服咨询QQ(企鹅扣扣)1292124634
Email:1292124634@qq.com
商业版本免费开放下载
前沿科技1.80怀旧复古赤月终极烟花教主淘宝秒杀商城升级版
前沿科技1.76雄霸特色大极品+50元素倚天辟地狂风连击传奇
前沿科技3D真彩无英雄中变靓装元素傲天朱雀神龙毒血斩
前沿科技至尊中变1.89无英雄元素立法之殿版
마일
마히Pierre Park n'a pas chemise burberry femme de fleurs, les hommes et les femmes ". quelques un livre Ito cadeau - il a publié "Confucius". alors de gauche à droite, ne peut pas acheter,Il est supposé que Festival des lanternes, que de nouveaux Shun Wang.L'argent est le temps?robot de soudage à sac burberry pas cher l'arc Mais pas le dernier, mais la plupart du temps de r리가