C# 和 Flash 通信

Posted

技术标签:

【中文标题】C# 和 Flash 通信【英文标题】:C# and Flash communication 【发布时间】:2010-11-24 02:56:25 【问题描述】:

C# 有什么方法可以获取 swf 通过 ExternaInterface 公开的方法列表?

【问题讨论】:

【参考方案1】:

更新:

刚刚意识到我误读了您的问题,因为您正在寻找通过 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 使用它。

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

更具体地说您可以在本文的另一页找到实现目标所需的初始步骤,请参阅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#签名强>。

【讨论】:

【参考方案2】:

您必须通过从 C# 代码中读取 SWF 文件来执行此操作,而不是通过任何真正意义上的与其通信。这篇文章将为您指明正确的方向,但可能还有很多工作要做。 (您需要反编译字节码并查看传递给ExternalInterface.addCallback 的函数。)

ActionScript 字节码格式为 documented,SWF format 也是如此。

【讨论】:

您好,感谢您的回复,但我正在寻找“高级”解决方案。【参考方案3】:

如果您可以访问您的 swf(有它的源代码),那么您需要做的就是向一个函数添加一个回调,该函数返回您设置的所有方法,用于以数组、字符串等形式与 ExternalInterface 一起使用。

如果您无权访问 swf 源,您可以制作另一个 swf,使用 ExternalInterface 进行设置,以便您可以调用它。将原始 swf 加载到新的和 INIT 处理程序中,开始搜索可能被调用的方法,这些方法使用 describeType 链接到 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 或开发人员,一些符合道德的反编译可能会有所帮助。

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

senocular's SWFReader Thibault Imbert's SWFExplorer Denis Kolyako's getDefinitionNames

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

希望这会有所帮助。

【讨论】:

哦,如果你的意思是一个通过你的 swf 查看并获取所有 c# 的类,恐怕我不知道,因为我不使用 c#。我的解决方案是让 swf 为您吐出数据。

以上是关于C# 和 Flash 通信的主要内容,如果未能解决你的问题,请参考以下文章

如何用 c# 控制 youtube flash 播放器?

FlashSocke 通过flash进行socket通信(as代码)

浅谈Flash Socket通信安全沙箱

没有 SWFObject.js 的 Javascript 到 Flash 通信

将 javascript 连接到 php 套接字以与 Flash 通信

Flash AS2.0 与 JavaScript/jQuery (ExternalInterface) 通信