C#和Flash通信

时间:2009-08-30 09:50:42

标签: c# flash actionscript externalinterface

有没有办法让C#获取swf通过ExternaInterface公开的方法列表?

3 个答案:

答案 0 :(得分:3)

<强>更新

刚才意识到我误解了你的问题,因为你正在寻找通过Flex ExternalInterface class而不是Shockwave ActiveX control本身定义的方法;我将在下面保留我的原始答案,因为它通常可能对通过C#的SWF使用有所帮助。

关于ExternalInterface我现在没有答案,但您可以查看Fun with C# and the Flash Player 8 External API以了解如何通过C#首先使用此API。 (另一个有用的示例可能是Use External Interface of Flash 8 in Python and C# Applications。)

从我在前一篇文章中读到的内容可能没有直接的解决方案,并且通过将XML fragments传递给CallFunction()的调用约定有点古怪,仍然应该能够翻译Georges原则上solution(正如我所说,它可能不会很漂亮;)

祝你好运!


如何通过COM互操作性从.NET访问SWF:

用于Windows的

SWF是通过Adobe Flash Player ActiveX control实现的,因此您可以通过COM Interoperability从.NET中使用它。

您可以在Adobes网站上找到关于此的(遗留)文章/示例,请参阅Embedding Macromedia Flash Player in a C# Application to Display Stock Information以获取概述(请注意有关示例代码不可用的文章的介绍性说明),但请参见下文。 / p>

更具体地说您可以在本文的其他页面上找到实现目标所需的初始步骤,请参阅Embedding and Communicating with the Macromedia Flash Player in C# Windows Applications - 特别请按照文章/步骤进行操作并包括使Visual Studio .NET中可用的Macromedia Flash Player ActiveX控件

完成概述步骤以将Shockwave ActiveX control添加到工具箱和特定项目引用后,您只需双击此引用(在Visual Studio 2008中名为ShockwaveFlashObjects)即可打开Visual Studio object browser突出显示assembly Interop.ShockwaveFlashObjects;然后向下导航到namespace ShockwaveFlashObjects,您可以在其中找到interface IShockwaveFlash,其中包括所有成员的所有成员,包括所需的外部方法C#签名

答案 1 :(得分:2)

如果你可以访问你的swf(有源代码),那么你需要做的就是给一个函数添加一个回调函数,该函数返回你设置的所有方法,用作ExternalInterface作为数组,字符串等。

如果您无法访问swf源,可以创建另一个swf,使用ExternalInterface进行设置,以便调用它。将原始swf加载到新的swf中并在INIT处理程序中,使用describeType开始scavanging可能被称为链接到ExternalInterface.addCallback的方法。

这就是我的想法:

var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.INIT, loaded);
    loader.load(new URLRequest('externalInterfaceTest.swf'));
function loaded(e:Event):void{
    //get all the methods in the loaded swf
    var methods:XMLList = describeType(e.target.content).method;
    for each(var method:XML in methods){
        //get methods defined by the author/not belonging to flash.display.*,flash.events.*,etc
        if(method.@declaredBy.indexOf('flash') == -1){
            trace('\nmethod description start========================');
            trace('methodName: ' + method.@name);
            trace('returnType: ' + method.@returnType);
            for each(var param:XML in method.parameter){
                trace('parameter ' + param.@index + ' type: ' + param.@type + ' optional: ' + param.@optional);
            }
            trace('\nmethod description end\n========================');
        }
    }
}

如果符合以下条件,这将有效:

  • 你加载的swf没有 DocumentClass,其功能 可能会在回调中添加 时间表,因此公开
  • 你加载的swf有所有方法 与连接 ExternalInterface.addCallback 宣布公开

如果您无法访问swf或开发人员,则某些道德反编译可能有所帮助。

另一种方法是使用其他开发人员开发的类来检查swfs。 以下是一些例子:

这些类可能无法提供您需要的确切功能,但它是您需要的良好起点,只有您将使用二进制数据(我现在不是很擅长)。您可以找到SWF文件规范here

希望这有帮助。

答案 2 :(得分:0)

你必须通过从C#代码中读取SWF文件来做到这一点 - 而不是通过与它真正意义上的通信。这篇文章将指出你正确的方向,但可能还有很多工作要做。 (您需要反编译字节码并查看哪些函数传递给ExternalInterface.addCallback。)

ActionScript字节码格式为documentedSWF format也是如此。