Vincent Hiribarren
Vincent Hiribarren

Reputation: 5294

How to store and use a native executable in a SWC with AIR?

I am developing an AIR application. This application needs some hardware accesses that are not possible with AIR. I decided to use the NativeApplication class in AIR, which launches a C# executable. The AIR application and the "native" application then communicate with the standard output and standard input streams.

A bit like that:

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()));
   }
}

I put MyNativeExe.exe file in the application directory, set the "extendedDesktop" value in the *-app.xml supportedProfiles, and it works fine.

Now, I would like to create a kind of AS3 SWC library that embeds MyNativeExe.exe and which provide an AS3 class to manage the interaction with MyNativeExe.exe. Therefore I could easily reuse this work in other AIR projects by simply addind the SWC file as a library. I may have to manually add the "extendedDesktop" value to the new AIR projects, but it is not a problem.

And I am stuck. I can embed an EXE file in a SWC file, by manually selecting the resources to embed with Flash Builder but...

The only idea I have would be to embed the EXE file with [Embed], load it as a byte array, create a new file with the byte array as data, and then execute the file. I don't know if it works, but I do not like the idea, as it implies having the EXE kind of duplicated.

Does someone have an idea?

Thank you!

Upvotes: 2

Views: 488

Answers (1)

J. Holmes
J. Holmes

Reputation: 18546

You should look into the Air Native Extensions. Simply put, one of the a new features in Air 3.0 was the ability to compile and link to custom language extensions directly from air. I haven't found an example of using C# directly, but there is a link on that page to doing with managed C++.

Upvotes: 1

Related Questions