Yo tambien estoy trabajando en un proyecto que requiere interoperabilidad entre C# y flash asi que te voy a decir algunos tips, que espero te sirvan.
Antes de empezar estuve buscando mucha info para saber cual era la mejor forma de hacerlo, y encontré, en la pagina de Adobe Flash, una librería bastante simple de usar, hecha en C#, que actua como un proxy para comunicarte con flash. No necesitas usar el GetVariables ni nada por el estilo.
La libreria la podes descargar desde acá:
http://livedocs.adobe.com/flash/9.0/main/samples/Programming_ActionScript3.0_samples.zip (Viene con codigo fuente y todo ^^ )
Dentro de este zip hay un proyecto llamado ExternalInterfaceProxy.csproj. La ruta es Samples/IntrovertIM_CSharp/ExternalInterfaceProxy/ExternalInterfaceProxy.csproj
Para comunicarte con flash tenes dos formas:
1) Llamar a una funcion de flash desde .Net invocando a una funcion de la clase ExternalInterfaceProxy:
Código :
//C#
public object Call(string functionName, params object[] arguments)
recibe un array de objects y se encarga de convertir la llamada en un xml que el flash entiende y puede decodificar.
2) Atender llamadas de flash agregando un handler al evento de la clase ExternalInterfaceProxy:
Código :
//C#
public event ExternalInterfaceCallEventHandler ExternalInterfaceCall
Con respecto al error que te sale:A mi me sucedió lo mismo (incluso despues de estar utilizando el proxy), pero lo pude solucionar. Este mismo error me saltó en dos oportunidades:
1) Cuando desde .Net intentaba invocar a una funcion de flash "funcionX" y me habia olvidado de agregar un handler en flash para esa funcion. Esto se hace así
Código :
//ActionScript
ExternalInterface.addCallback("funcionX", this, funcionX);
2) O bien, cuando no me habia olvidado nada, pero por alguna cuestión de multithreading (donde no tengo nada que ver), yo estaba invocando a una "funcionX" cuando, al parecer, todavia no se habia ejecutado el codigo de flash que registraba los handlers.
Esto ultimo lo solucioné poniendo un flag en C# que indicaba si el proxy estaba listo para ser usado o no. Este flag se ponia en true cuando recibía una llamada desde Flash que decia que se habian terminado de agrergar todos los handlers. Esta llamada estaba hecha a mano en el archivo flash/actionscript mas o menos así:
Código :
//ActionScript
import flash.external.ExternalInterface;
_root.onLoad=function(){
ExternalInterface.addCallback("miFuncion1", this, miFuncion1);
ExternalInterface.addCallback("miFuncion2", this, miFuncion2);
if(ExternalInterface.available){
ExternalInterface.call("NotifyLoaded", this );
}
}
function miFuncion1(){
}
function miFuncion2(arg1:String, arg2:Number){
}
Este es el codigo que llama al proxy
Código :
//C#
public class GraphicLayer{
private ExternalInterfaceProxy _proxy=null;
private bool _ExternalInterfaceEnabled=false;
public GraphicLayer(ExternalInterfaceProxy proxy) {
_proxy = proxy;
_proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(External_OnExternalInterfaceCall);
}
public object External_OnExternalInterfaceCall(object sender, ExternalInterfaceCallEventArgs e)
{
switch (e.FunctionCall.FunctionName)
{
case "NotifyLoaded":
this._ExternalInterfaceEnabled = true;
break;
}
return null;
}
protected void CallExternalFunction(string functionName, object[] args) {
if (this._ExternalInterfaceEnabled ) {
_proxy.Call(functionName, args);
}
}
}
Espero que te sirva!
Si no entendiste algo, me explique mal, o simplemente necesitas mas información no dudes en consultarme.
Saludos
NahuelGQ