1

私はFlashBuilder4.6を使用しており、http//eval.hurlant.com/のAS3Evalv0.3ライブラリを使用しています。

ライブラリは、私のFlex 4.6.0プロジェクト1つでは完全に機能していますが、他のプロジェクトでは機能していません(EvalES4.swcライブラリの同じライブラリリンケージ「Mergeintocode」)。

最初のプロジェクトでは、次のコードが機能します。

private var compiler:CompiledESC = new CompiledESC;

public function compile(code: String) : ByteArray {
  return compiler.eval(code);
}

他のプロジェクトでは、次のように失敗ます 。ReferenceError:エラー#1065:変数のコンパイルが定義されていません。

エラーは、AS3Evalライブラリ(そのEvalES4.swcファイル)の次の行を参照しています。

var compile:Function = getDefinitionByName("ESC::compile") as Function;

ライブラリに、他のプロジェクトでTamarinESCを完全にロードするのに問題があるようです。

両方のプロジェクト(同じライブラリを使用していますが、まだチェックされています)がTamarinESCを正常にロードすることを確認しました。

    // inside CompiledESC.as
    private function loadESC():void {
        var a:Array = [
            new debug_abc as ByteArray,
            new util_abc as ByteArray,
            new bytes_tamarin_abc as ByteArray,
            new util_tamarin_abc as ByteArray,
            new lex_char_abc as ByteArray,
            new lex_scan_abc as ByteArray,
            new lex_token_abc as ByteArray,
            new ast_abc as ByteArray,
            new parse_abc as ByteArray,
            new asm_abc as ByteArray,
            new abc_abc as ByteArray,
            new emit_abc as ByteArray,
            new cogen_abc as ByteArray,
            new cogen_stmt_abc as ByteArray,
            new cogen_expr_abc as ByteArray,
            new esc_core_abc as ByteArray,
            new eval_support_abc as ByteArray,
            new esc_env_abc as ByteArray,
        ]
        ByteLoader.loadBytes(a, true);
    }

これらのByteArrayクラスは、[Embed](ライブラリコードを調べる)を使用してSWC内に埋め込まれ、すべてのByteArrayは、どちらの場合もByteLoaderを介して初期化およびロードされます。

これまでのところ、コンパイルが私の最初のプロジェクトで機能しているのに、他のプロジェクトでは機能していない理由はわかりません。誰かが同様の経験や問題を引き起こす可能性のあるいくつかのヒントを持っていますか?

最高、ヤクブ

4

2 に答える 2

1

ハ!

私は必死でした、解決策が見つかりました。

CompiledESCは、作成されたのと同じフレームでは使用できないようです。


つまり、このようなものは機能しません

public function compile(code: String) : ByteArray {
    var compiler:CompiledESC = new CompiledESC();
    return compiler.eval(code);
}

ただし、次のコードは機能します(アプリケーションが読み込まれ、CompileESCが初期化されてから、ユーザーが[実行]ボタンをクリックします。これは、CompileESCが作成されたフレームとは異なるフレームで発生します)。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
>
<fx:Script>
    <![CDATA[
        import com.hurlant.eval.CompiledESC;

        import mx.events.FlexEvent;

        private var compiler:CompiledESC = new CompiledESC();

        protected function button1_clickHandler(event:MouseEvent):void
        {
            compiler.eval("trace(\"hello!\")");
        }

    ]]>
</fx:Script>
<mx:Button label="RUN!" click="button1_clickHandler(event)" />
</s:Application>

正確な理由はわかりませんが、Flashがバイトコードをロードする方法と関係があるのではないかと思います。コードをVMに挿入して同じフレームで使用しようとすると、コードがまだロードされていないため、問題が発生します。スレッドを「譲り」、別のフレームを待つ必要があります。TamarinESCコードがロードされる間のどこかです。

同じことが、ByteBufferを介してロードされるコンパイル済みコードにも当てはまることに注意してください。あなたが何かをするときはいつでも

ByteLoader.load(compiler.eval(myAS3Code));

myAS3Codeがすぐに実行されることを期待しないでください。この場合も、スレッドを「生成」してVMにコードを実際にロードさせるたびに、コードがロードされます。

これが同じ状況の誰かに役立つことを願っています。

最高、ヤクブ

于 2012-08-09T11:39:01.947 に答える
0

権限が最初のプロジェクトと同じであるかどうかを確認する必要があります。あなたは(私が正しく理解していれば)外部からライブラリをマージしていますが、これは許可されていますか?

于 2012-08-09T11:16:11.937 に答える