如何阻止客户端应用程序链接我的库的两个不同版本?

时间:2013-02-06 20:29:16

标签: actionscript-3 flash flex flash-builder swc

在AS3 / Flex中,似乎没有任何开箱即用的东西阻止客户端应用程序链接(外部或“静态”)两个版本的SWC。从历史上看,当发生这种情况时,它发生时没有任何编译器警告,直到我们在最终SWF中观察到异常“混合”行为,我们才知道出现了问题。我有什么办法可以严格防止我的库的两个版本被包含在应用程序中吗?

1 个答案:

答案 0 :(得分:1)

有两种不同的链接方式:

  • 静态链接(当编译时编译器知道程序的所有代码时)。
  • 动态链接(当代码加载到已编译的应用程序中时,但不一定用加载它的应用程序编译)。

    1. 您可能不必担心,链接相同代码的两个不同版本很可能会失败,除非代码链接为数据(作为嵌入式SWF而不是实际代码),在这种情况下无论谁做到这一点,都可能知道他们在做什么。

    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变量。显然,您可以使用更复杂的方法来确定要做什么以及是否可以继续前进,具体取决于版本。一般来说,你的代码应该在“加载到子域”这样的情况下支持多个版本,它会被认为是一个bug,如果没有,或者试图以某种方式绕过它。

相关问题