Вызов функции ActionScript 3 из С#

У меня есть Flash-фильм, встроенный в форму Windows (с использованием компонента "Shockwave Flash Object, включенного в Visual Studio 8" ). Flash-фильм был создан с помощью Flash CS4 и использует ActionScript 3.

Можно ли использовать С# для вызова функции ActionScript в фильме Flash, который возвращает значение?

Кроме того, возможно ли, чтобы мой Flash-фильм вызывал функцию С# в главном приложении, которое возвращает значение?

Ответы

Ответ 1

Чтобы сделать функцию ActionScript вызываемой с вашего хоста Flash Player, вы должны использовать функцию ExternalInterface.addCallback, например:

ExternalInterface.addCallback("testCallback", function (text : String) : String
{
    var helloText : String = "Hello, " + text;
    myTextField.text = helloText;
    return helloText;
});

Чтобы вызвать эту функцию из приложения Windows Forms на С#, вам необходимо использовать метод CallFunction, открытый компонентом Flash Player. Метод имеет один строковый аргумент, который должен содержать XML, который описывает вызов; он возвращает строку, которая содержит XML, который описывает возвращаемое значение. Используя приведенный выше пример, это будет способ вызова функции testCallback:

textBox1.Text = flash.CallFunction("<invoke name=\"testCallback\" returntype=\"xml\"><arguments><string>" + textBox1.Text + "</string></arguments></invoke>");

Предположим, что ваше текстовое поле (textBox1) содержит текст "World", после выполнения вышеописанного кода будет содержаться текст "Hello, World".

Если вы хотите вызывать код С# из Flash, история похожа: вам нужно определить обработчик события для Flash Player Flash Player. Затем вы должны использовать следующий тип вызова из ActionScript:

ExternalInterface.call("MyCSharpFunction", 17);

Это заставит Flash-плеер поднять событие FlashCall и вызвать обработчик событий. Аргумент события, получаемый вашим обработчиком, имеет общедоступное поле под названием "запрос", тип которого является строкой. Поле запроса содержит XML, который описывает вызов, сделанный из Flash. В приведенном выше примере это будет выглядеть так:

<invoke name="MyCSharpFunction" returntype="xml"><arguments><number>17</number></arguments></invoke>

Если вы хотите вернуть значение, все, что вам нужно было бы сделать в обработчике событий FlashCall, - вызвать метод SetReturnValue Flash Player до того, как обработчик события вернется, передав ему строку с XML, который описывает возвращаемое значение, например

<string>Works like a charm!</string>

Ответ 2

ExternalInterface.addCallback(functionName: String, close: Function): void регистрирует метод actioncript, который может быть вызван из него.

Я не уверен, сможет ли он вернуть значение. Мои мысли в том, что это не сработает. Если бы это было так, вы могли бы просто сделать еще один ExternalInterface.call, который отправляет контейнеру информацию, которую вы хотите в качестве аргумента.

Я не знаю, как на самом деле делать вызов с С#, но я видел, как это сделал один из моих коллег для проекта флэш-установки, над которым мы работали, поэтому я знаю, что это возможно... некоторые как!