在 AS3/Flex 中,似乎没有任何现成的东西可以阻止客户端应用程序链接(外部或“静态”)我的 SWC 的两个版本。从历史上看,当这种情况发生时,它是在没有任何编译器警告的情况下发生的,直到我们在最终的 SWF 中观察到异常的“混合”行为,我们才知道出了问题。我可以做些什么来严格防止我的库的两个版本包含在应用程序中?
问问题
64 次
1 回答
1
有两种不同的链接方式:
- 静态链接(当编译器在编译时知道程序的所有代码时)。
动态链接(当代码加载到已编译的应用程序中,但不一定与加载它的应用程序一起编译时)。
您可能不必担心,链接同一代码的两个不同版本很可能会失败,除非代码作为数据链接(作为嵌入式 SWF 而不是真实代码),在这种情况下,无论是谁这样做都可能知道他们在做什么。
如果您加载不同版本的库,则可能会发生几种不同的事情。在矩阵的一侧有:“加载到不同的安全域”、“加载到子安全域”、“加载到相同的安全域”,在矩阵的另一侧:“新版本加载旧版本”、“旧版本加载新版本”。
现在,加载到不同安全域的每种情况都可能加载不同版本的库,而无需做任何事情:这就是安全域的用途。当加载到同一个域时,第一个加载的代码获胜。加载到子域时,两个域中将同时存在两个版本。
我会做什么:
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 回答