我试图编写一个简单的命令行C#程序,它在已编译的Flash ActionScript 3.0中调用函数,然后显示字符串输出。在我可以使用的SWF文件中已经注册了一个回调函数。
经过一些研究(mainly following the example here),这是我到目前为止所做的:
using AxShockwaveFlashObjects;
using System;
namespace ConsoleProg {
class ConsoleProg {
static void Main (string[] args) {
string path = "container.swf";
AxShockwaveFlash flash = new AxShockwaveFlash();
flash.LoadMovie(0, path);
string result = flash.CallFunction("<invoke name=\"api_function\" returntype=\"xml\"><arguments></arguments></invoke>");
Console.WriteLine(result);
}
}
}
(SWF文件中的回调函数不带参数并返回一个短字符串。)
编译并运行它会产生错误
ActiveX control cannot be instantiated because the current thread is not in a single-threaded apartment.
所以我环顾四周并尝试了两件事:我在[STAThread]
方法中添加了Main
。现在它给出了错误
Unhandled Exception: System.Windows.Forms.AxHost+InvalidActiveXStateException: E
xception of type 'System.Windows.Forms.AxHost+InvalidActiveXStateException' was
thrown.
我做的另一件事是将控制台程序分离成一个对象并在它自己的线程中实例化它,明确指定它的单元状态:
using AxShockwaveFlashObjects;
using System.Threading;
using System;
namespace ConsoleProg {
class ConsoleProg {
public string path;
public ConsoleProg (string path) {
this.path = path;
}
public void LoadFlash() {
AxShockwaveFlash flash = new AxShockwaveFlash();
flash.LoadMovie(0, this.path);
string result = flash.CallFunction("<invoke name=\"api_function\" returntype=\"xml\"><arguments></arguments></invoke>");
Console.WriteLine(result);
}
static void Main (string[] args) {
ConsoleProg cp = new ConsoleProg("api_container.swf");
Thread t = new Thread(cp.LoadFlash);
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
}
}
这给出了与我上面的其他尝试相同的错误。
此时我不知所措。我究竟做错了什么?如果有人可以向我指出一个简单但完整的例子,那将会有很大的帮助,因为我在网上看到的所有教程都有代码片段,我无法汇编成有效的东西。
我只需要程序,就是在控制台中打印flash文件输出的字符串。这应该是更大程序的一部分,但是现在我只想得到一个简单的例子。
答案 0 :(得分:1)
我的一个项目就是这样做的,所以我将与你分享一些代码片段来帮助你。 首先确保您的项目构建目标是x86。我无法让x64或AnyCpu工作。 谁知道,这可能会解决您的所有问题。
如果没有,请尝试使用我从项目中借来的代码来执行函数调用:
public string InvokeFlashFunction(string functionName, params object[] functionParameters)
{
//Creates the xml that will be sent to the flash movie
XmlDocument invokeDocument = new XmlDocument();
//Creates the invoke element that will be the root element of the xml
XmlElement rootElement = invokeDocument.CreateElement("invoke");
//Set both attributes of the invoke element
rootElement.SetAttribute("name", functionName);
rootElement.SetAttribute("returnType", "xml");
//Creates the arguments element
XmlElement childNode = invokeDocument.CreateElement("arguments");
//foreach parameter, creates a child node to the arguments element
foreach (object param in functionParameters)
{
XmlElement paramNode = GetParamXml(param, invokeDocument);
//appends the parameters
childNode.AppendChild(paramNode);
}
//Appends the arguments node
rootElement.AppendChild(childNode);
//Call the function
return _FlashMovie.CallFunction(rootElement.OuterXml);
}
您可以这样使用它:
InvokeFlashFunction("api_function", "your arguments here");