C#和Flash通信

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

更新:

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

关于ExternalInterface我现在没有答案,但您可以查看Fun with C#和Flash Player 8 External API ,以了解如何通过C#首先使用此API。 (另一个有用的示例可能是在Python和C#应用程序中使用Flash 8的外部接口 。)

从我在前一篇文章中读到的内容来看,可能没有直接的解决方案,并且通过将精心设计的XML片段传递给CallFunction()的调用约定有些古怪,但你原则上应该能够将Georges 解决方案转换为此(因为我说,它可能不会很漂亮;)

祝好运!


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

SWF for Windows是通过Adobe Flash Player ActiveX控件实现的 ,因此您可以通过COM互操作性从.NET中使用它。

您可以在Adobes网站上找到关于此的(遗留)文章/示例,请参阅在C#应用程序中嵌入Macromedia Flash Player以显示库存信息以获取概述(请注意有关示例代码不可用的文章的介绍性说明),但见下文。

更具体地说,您可以在本文的另一页上找到实现目标所需的初始步骤,请参阅在C#Windows应用程序中嵌入和与Macromedia Flash Player通信 – 特别是请按照文章/步骤进行操作使Visual Studio .NET中可用的Macromedia Flash Player ActiveX控件

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

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

如果您无法访问swf源,可以创建另一个swf,使用ExternalInterface进行设置,以便可以调用它。 将原始swf加载到新的swf并在INIT处理程序中,开始scavanging可能使用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链接的所有方法声明为public

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

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

  • senocular的SWFReader
  • Thibault Imbert的SWFExplorer
  • Denis Kolyako的getDefinitionNames

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

希望这可以帮助。

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

记录了ActionScript字节码格式, SWF格式也是如此 。

Interesting Posts