AS3/Flex では、クライアント アプリケーションが SWC の 2 つのバージョンを (外部的または「静的に」) リンクすることを妨げるものは何もないようです。歴史的に、これが発生した場合、コンパイラの警告は発生しませんでした。最終的な SWF で異常な「混合」動作が観察されるまで、何かが間違っていることがわかりません。ライブラリの 2 つのバージョンがアプリケーションに含まれないようにするためにできることはありますか?
1 に答える
リンクには 2 つの異なる方法があります。
- 静的リンク (プログラムのすべてのコードがコンパイル時にコンパイラーに認識されている場合)。
動的リンク (コードがコンパイルされたアプリケーションに読み込まれるが、それを読み込んだアプリケーションでコンパイルされているとは限らない場合)。
コードがデータとして (実際のコードではなく埋め込み SWF として) リンクされていない限り、同じコードの 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
変数が設定されます。明らかに、バージョンに応じて、より洗練されたアプローチを使用して、何をすべきか、次に進むことが安全かどうかを判断できます。一般的に言えば、「子ドメインへのロード」などの状況では、コードは複数のバージョンをサポートする必要があります。そうでない場合、または何らかの方法で回避しようとすると、バグと見なされます。