有没有办法让C#获取swf通过ExternaInterface公开的方法列表?
答案 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或开发人员,则某些道德反编译可能有所帮助。
另一种方法是使用其他开发人员开发的类来检查swfs。 以下是一些例子:
这些类可能无法提供您需要的确切功能,但它是您需要的良好起点,只有您将使用二进制数据(我现在不是很擅长)。您可以找到SWF文件规范here。
希望这有帮助。
答案 2 :(得分:0)
你必须通过从C#代码中读取SWF文件来做到这一点 - 而不是通过与它真正意义上的通信。这篇文章将指出你正确的方向,但可能还有很多工作要做。 (您需要反编译字节码并查看哪些函数传递给ExternalInterface.addCallback
。)
ActionScript字节码格式为documented,SWF format也是如此。