是否可以将链接到文档的类(又名文档类)放入 RSL 并仍将其作为文档类?

Posted

技术标签:

【中文标题】是否可以将链接到文档的类(又名文档类)放入 RSL 并仍将其作为文档类?【英文标题】:Is it possible to put a Class linked to a document (aka Document Class) into a RSL and still have it as Document Class? 【发布时间】:2016-09-18 01:21:59 【问题描述】:

首先,我的环境。我的问题是,是否可以使用 Flash Professional 而不是 Flex、FlashBuilder 等(我目前没有这些环境)。


事情是这样的:我们有几个带有文档类集的 .fla 文件。具有类的 .as 文件与所有这些 .fla 文件共享,因此它们都具有相同的类集作为它们的文档类。关键是因为 Class 被编译到每个生成的 .swf 文件中,因此对 Class 所做的任何更改都需要重新编译所有 .fla 文件。

经过一些研究,我发现了 RSL。但我想知道是否可以将类作为 RSL,同时将其作为每个文件的文档类?它会简化一些事情,因为如果需要在类中进行更改,我们不需要重新编译每个文件,或重新生成每个 .swf 文件。

此外,如果可能的话,我如何通过 Flash Professional 实现 RSL?我找到的所有文档都通过 Flex 和其他人证明了这一点。

如果我不够清楚,请告诉我。

【问题讨论】:

【参考方案1】:

如前所述,您不能将 RSL 与文档类一起使用。但是,您可以将类放在 RSL 中,并在运行时加载这些类,可能会实现您想要的。

这是一个非常简单的例子:


1.创建 RSL 资产:

假设您有一个不时更改的类,并且您希望在运行时加载它的功能:

//TestyMcTestFace.as
package  
    public class TestyMcTestFace 
        public static function go():String
            return "I'm Testy McTestFace";
        
    

所以,您可以做的是在 FlashPro/AdobeAnimate CC 中创建一个新的 AS3 项目。链接您的类文件,以便您的项目找到它(在这种情况下,我只是将我的 TestyMcTestFace.as 放在与我创建的新 .fla 相同的目录中)。

在时间线代码中添加对您想要包含的类的引用。 如果没有这个引用,类将不会在生成的 swc/swf 中导出。

所以对于这种情况,我有一个新的 AS3 项目,时间轴的第一帧只有一行:

TestyMcTestFace;

现在,转到您的发布设置,并设置为只检查 Flash (swf)SWC

发布这个新项目(您现在有一个 swf/swc 可以用作其他应用程序的 RSL)。

2。设置您的其他应用程序以将 swf/swc 用作 RSL。

在您现有的 Flash 项目中,转到“高级 Actionscript 设置”(单击发布设置中“Actionscript 3.0”旁边的扳手图标)。

单击库路径选项卡,单击加号按钮,然后单击“浏览到 SWC 文件”按钮(目前它是一个带有 flash 'f' 的图标)。从上一步中找到您的 swc 文件。

现在,突出显示您的新条目,单击信息图标(链接选项)。将其从“合并到代码”更改为“RSL”。然后添加 swf 文件的路径(该应用程序运行时的路径)。

现在,在您的应用程序中,您可以引用 RSL 中的类。所以如果我们这样做:

trace(TestyMcTestFace.go());

你应该得到输出“I'm Testy McTestFace”。

FlashPro 会自动为您加载 RSL。但请注意,如果您不让 Flash 自动预加载您的应用,则它不会立即可用。

如果您从第一步更改并重新导出了 swc/swf,则这些更改应在您再次运行现有 swf 时反映出来(无需重新编译)。


注意事项:

小心 RSL 中的代码。很容易获得冲突的课程。作为最佳实践,仅将完全独立/解耦的代码放入 RSL 中。应避免包含大量导入的代码。最好不要在您正在加载 RSL 的已编译 swf 中引用具有相同名称的类。

另外请记住,如果不是来自同一个域,RSL 可能会有 sanbox/安全限制。

【讨论】:

这与文档类或手头的问题有何关系?很多打字都是白费的。 感谢您的回答,它也阐明了我的疑问。所以也许我可以使用的最接近的方法是拆分我的主类,然后我可以将功能传播到 RSL,也可以像主加载器一样使用主类 .swf 并通过它加载所有其他文件?我要实现的主要目的是共享代码。 是的,最好还是将您的功能封装到许多类中(利益分离),因此最好的架构是将所有通用代码放在自包含类中(可以根据 RSL 使用我的回答)并且只让您的文档类包含特定于该应用程序的代码 好的,这似乎是要采取的方法。只是它不是我制作的代码,原作者将所有东西都放在一个 .as 文件中。谢谢。虽然这两个答案都回答了我的问题,但这个答案超越了我,为我指明了一条可以遵循的道路。【参考方案2】:

不可能,RSL 仅用于运行时共享而不是编译时共享,您需要访问该类。

第一件事是,一个类在大小方面并没有那么大,所以没有必要让它独一无二,在 swfs 之间共享。

现在您确认,如果您进行任何更改,则必须重新编译所有 swf,但这实际上并不准确,因为在一个给定的运行时中只能存在一个类定义。第一个运行的 swf 默认是加载类定义的,后面所有加载的 swf 都会默认丢弃它们的类定义,所以理论上你不必重新编译它们。

所以要恢复是,如果您对类进​​行了重大更改,则必须重新编译所有 swfs,但对于较小的更改则不需要。但这种情况是您的应用设计的症状,这可能不是最有效和最合乎逻辑的。

【讨论】:

感谢您的回答!稍微澄清一下我的情况。我所拥有的不是加载其他文件的 swf 加载器,它们都是单独的 .swf 文件,它们单独用于另一个应用程序(通过 ActiveX)。共享的 .as 文件更多的是所有文件都使用相同的基本代码,然后定义为 Document Class 的类最终被编译到每个文件中,这就是为什么我说如果进行了更改,所有文件都需要重新编译。我正在寻找的是一种类似于 dll 的实现,只是为了使共享代码更容易,实际上与大小无关。 编译代码 (swc) 在这种情况下也无济于事,因为它仅在编译时使用。我在这里找不到解决方案。 嗯,好的,我明白了。谢谢。

以上是关于是否可以将链接到文档的类(又名文档类)放入 RSL 并仍将其作为文档类?的主要内容,如果未能解决你的问题,请参考以下文章

是否有 Django 字段集的类选项的文档?

安森美RSL10开发-DSP

NSBundle 中的类

将数据库模型放入到.Net Core的类库中

从网页链接到 PDF 文档中的特定部分(锚点)

[AS3]使用RSL进行AS瘦身编程