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 使用它。
您可以在 Adobe 网站上找到关于此的(旧版)文章/示例,请参阅 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 通信的主要内容,如果未能解决你的问题,请参考以下文章
FlashSocke 通过flash进行socket通信(as代码)
没有 SWFObject.js 的 Javascript 到 Flash 通信