C # и Flash связь - PullRequest
       50

C # и Flash связь

3 голосов
/ 30 августа 2009

Есть ли способ для C # получить список методов, которые swf предоставляет через ExternaInterface?

Ответы [ 3 ]

3 голосов
/ 08 сентября 2009

Обновление:

Только что понял, что я неправильно понял ваш вопрос, поскольку вы ищете методы, определенные с помощью Flex ExternalInterface class, а не методов самого Shockwave ActiveX control; Я оставлю свой исходный ответ ниже, так как он может быть полезен в отношении SWF использования через C # в целом.

Относительно ExternalInterface У меня нет ответа на данный момент, но вы можете изучить Забавность с C # и внешним интерфейсом Flash Player 8 , чтобы получить представление о том, как использовать этот API через C # на первом месте. (Другим полезным примером может быть Использование внешнего интерфейса Flash 8 в приложениях Python и C # .)

Из того, что я читаю в предыдущей статье, вероятно, нет прямого решения, а соглашения о вызовах посредством передачи специально созданных фрагментов XML в CallFunction() несколько странны, но все же Вы должны быть в состоянии перевести Жоржа решение на это в принципе (как я уже сказал, это, вероятно, не будет красиво;)

Удачи!


Как получить доступ к SWF из .NET через COM-совместимость:

SWF для Windows реализовано с помощью Adobe Flash Player ActiveX control , следовательно, вы будете использовать его из .NET через Совместимость COM .

Вы можете найти (унаследованную) статью / образец по этому вопросу на сайте Adobes, см. Внедрение Macromedia Flash Player в приложение C # для отображения информации об акциях для обзора (обратите внимание на вступительное примечание к статье. о недоступности примера кода), но см. ниже.

Более конкретно Вы можете найти начальные шаги, которые необходимо предпринять для достижения своей цели, на другой странице этой статьи, см. Встраивание и связь с Macromedia Flash Player в приложениях C # для Windows - в частности, следуйте статье / шагам вплоть до раздела Обеспечение доступности элемента управления ActiveX Macromedia Flash Player в Visual Studio .NET .

После того как вы выполнили описанные шаги, чтобы добавить Shockwave ActiveX control к вашей панели инструментов и к ссылкам на конкретные проекты, вы можете просто дважды щелкнуть эту ссылку (с именем ShockwaveFlashObjects в Visual Studio 2008), и откроется Браузер объектов Visual Studio с подсветкой assembly Interop.ShockwaveFlashObjects; затем перейдите вниз к namespace ShockwaveFlashObjects, где вы найдете, среди прочего, interface IShockwaveFlash, предоставляя (в зависимости от фильтра представления) все его члены, включая требуемые внешние методы с соответствующими сигнатурами C # .

2 голосов
/ 30 августа 2009

Если вы можете получить доступ к своему SWF (иметь источник к нему), тогда все, что вам нужно сделать, это добавить обратный вызов в функцию, которая возвращает все методы, которые вы настроили для использования с ExternalInterface, в качестве Array, String и т. Д.

Если у вас нет доступа к источнику swf, вы можете создать другой swf, настроить его с ExternalInterface, чтобы вы могли вызывать его. Загрузите оригинальный SWF-файл в свой новый и в обработчике INIT начните поиск методов, которые могут быть вызваны как связанные с ExternalInterface.addCallback, используя descriptionType .

Вот что я имею в виду:

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========================');
        }
    }
}

Это будет работать, если:

  • загружаемый файл не имеет DocumentClass, функции, которые может быть добавлено, поскольку обратные вызовы находятся в график, следовательно, публичный
  • загружаемый файл имеет все методы связан с ExternalInterface.addCallback объявлен публичным

Если у вас нет доступа к swf или разработчику, может помочь некоторая этическая декомпиляция.

Другой подход заключается в использовании классов, разработанных другим разработчиком, для проверки SWF-файлов. Вот несколько примеров:

Эти классы могут не предлагать именно ту функциональность, которая вам нужна, но это хорошая отправная точка для того, что вам нужно, только вы будете искать, используя двоичные данные (что я сейчас не очень хорошо умею). Вы можете найти спецификации SWF-файла здесь .

Надеюсь, это поможет.

0 голосов
/ 11 сентября 2009

Вам придется делать это, читая SWF-файл из кода C #, а не общаясь с ним в каком-либо реальном смысле. Этот пост укажет вам правильное направление, но, вероятно, будет много работы. (Вам нужно будет декомпилировать байт-код и посмотреть, какие функции передаются ExternalInterface.addCallback.)

Формат байт-кода ActionScript задокументирован , как и SWF-формат .

...