Как сохранить и использовать собственный исполняемый файл в SWC с AIR?

#actionscript-3 #air #flash-builder

#actionscript-3 #воздух #flash-builder

Вопрос:

Я разрабатываю приложение AIR. Для этого приложения требуется некоторый аппаратный доступ, который невозможен с AIR. Я решил использовать класс NativeApplication в AIR, который запускает исполняемый файл C #. Затем приложение AIR и «родное» приложение обмениваются данными со стандартными выходными и стандартными входными потоками.

Что — то в этом роде:

 private var np:NativeProcess = new NativeProcess();
private var npi:NativeProcessStartupInfo = new NativeProcessStartupInfo();
private var args:Vector.<String> = new Vector.<String>();

private function creationCompleteHandler(event:FlexEvent):void {
   args.push("myCommand");
   args.push("myParameter");
   npi.arguments = args;
   npi.executable = File.applicationDirectory.resolvePath("MyNativeExe.exe");
   np.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onData);
   np.start(npi);
}

private function onData(e:ProgressEvent):void {
   while(np.standardOutput.bytesAvailable != 0) {
     trace(String.fromCharCode(np.standardOutput.readByte()));
   }
}
 

Я положил MyNativeExe.exe файл в каталоге приложения, установите значение «extendedDesktop» в поле *-app.xml Поддерживаемые профили, и это работает нормально.

Теперь я хотел бы создать своего рода библиотеку AS3 SWC, которая встраивает MyNativeExe.exe и которые предоставляют класс AS3 для управления взаимодействием с MyNativeExe.exe . Поэтому я мог бы легко повторно использовать эту работу в других проектах AIR, просто добавив SWC-файл в качестве библиотеки. Возможно, мне придется вручную добавить значение «extendedDesktop» к новым проектам AIR, но это не проблема.

И я застрял. Я могу встроить EXE-файл в SWC-файл, вручную выбрав ресурсы для встраивания с помощью Flash Builder, но…

  • он не будет автоматически встроен в конечный SWF-файл, поскольку только необходимые части SWC-файла объединяются с SWF
  • даже если это так (принудительное слияние с тегом [Embed], …), как я могу получить доступ к встроенному EXE-файлу и выполнить его? NativeProcessInfo.executable нуждается в файловом объекте, а не в потоке байтов.

Единственная идея, которая у меня есть, — это встроить EXE-файл с помощью [Embed], загрузить его как массив байтов, создать новый файл с массивом байтов в качестве данных, а затем выполнить файл. Я не знаю, работает ли это, но мне не нравится эта идея, так как она подразумевает дублирование EXE-файла.

У кого-нибудь есть идея?

Спасибо!

Ответ №1:

Вам следует изучить собственные расширения Air. Проще говоря, одной из новых функций в Air 3.0 была возможность компиляции и ссылки на пользовательские языковые расширения непосредственно из air. Я не нашел примера прямого использования C #, но на этой странице есть ссылка на использование управляемого C .

Комментарии:

1. На данный момент кажется, что создание собственного расширения немного сложно. Нет автоматизированного инструмента, много чего нужно делать вручную или писать сценарии. Это может быть решением, но на данный момент меня скорее интересует ответ на NativeProcess и удобство использования инструментов, предоставляемых Flash Builder 🙂

2. @VincentHiribarren если вы не собираетесь использовать ANE, то ваша другая идея — практически единственный способ сделать это. Я бы создал временную папку (с File.createTempDirectory() ), а затем записал ByteArray ее в файл в этой папке, а затем изменил NativeProcess способ, которым вы это делаете. Просто убедитесь, что очистили эту временную папку, когда закончите. Не самое красивое решение, но оно будет работать.