1

AS3/Flex では、クライアント アプリケーションが SWC の 2 つのバージョンを (外部的または「静的に」) リンクすることを妨げるものは何もないようです。歴史的に、これが発生した場合、コンパイラの警告は発生しませんでした。最終的な SWF で異常な「混合」動作が観察されるまで、何かが間違っていることがわかりません。ライブラリの 2 つのバージョンがアプリケーションに含まれないようにするためにできることはありますか?

4

1 に答える 1

1

リンクには 2 つの異なる方法があります。

  • 静的リンク (プログラムのすべてのコードがコンパイル時にコンパイラーに認識されている場合)。
  • 動的リンク (コードがコンパイルされたアプリケーションに読み込まれるが、それを読み込んだアプリケーションでコンパイルされているとは限らない場合)。

    1. コードがデータとして (実際のコードではなく埋め込み SWF として) リンクされていない限り、同じコードの 2 つの異なるバージョンをリンクすると、ほとんどの場合失敗することを心配する必要はありません。彼らが何をしているかを知っています。

    2. 異なるバージョンのライブラリをロードすると、いくつかの異なることが発生する可能性があります。マトリックスの片側には、「異なるセキュリティ ドメインにロード」、「子セキュリティ ドメインにロード」、「同じセキュリティ ドメインにロード」、マトリックスの反対側には、「新しいバージョンが古いバージョンをロード」、「古いバージョンが新しいバージョンをロードします。」

現在、異なるセキュリティ ドメインにロードするすべてのケースで、ライブラリの異なるバージョンがロードされる可能性がありますが、それについては何もする必要はありません。それがセキュリティ ドメインの目的です。同じドメインにロードすると、最初にロードされたコードが優先されます。子ドメインにロードすると、両方のドメインに同時に 2 つのバージョンが存在します。

私がすること:

class Version {

private static var version:String;

public static function setVersion():void {
    if (version) trace("Another library was loaded");
    else version = "1.0.0";
}}
import Version;
Version.setVersion();

クラス定義の外側のコードは、SWF がロードされるとすぐに実行されます。このクラスが以前にロードされている場合、version変数が設定されます。明らかに、バージョンに応じて、より洗練されたアプローチを使用して、何をすべきか、次に進むことが安全かどうかを判断できます。一般的に言えば、「子ドメインへのロード」などの状況では、コードは複数のバージョンをサポートする必要があります。そうでない場合、または何らかの方法で回避しようとすると、バグと見なされます。

于 2013-02-07T06:23:06.017 に答える