3

我在加载和编译现有类的新版本时遇到问题。在加载它们时,没有任何对它们的引用。“Test.Extended”类扩展了“Test.Base”类。“Extended”类调用“Base”类的 ClassMethod。问题是,即使在两个类上加载并执行强制编译之后,被调用的“Base”中的 ClassMethod也不是新编译类的方法,而是它的旧版本(通过写入控制台确认)。

为了编译两者,我在终端使用以下命令(f:表示强制,c:表示加载时编译):

NAMESPACE>w $system.OBJ.Load("C:\Test.Base.cls.xml","fc")

Load started on 01/27/2009 10:10:34
Loading file C:\Test.Base.cls.xml as xml
Imported class: Test.Base
Compiling class Test.Base ..................
Compiling routine Test.Base.1
Load finished successfully.
1

NAMESPACE>w $system.OBJ.Load("C:\Test.Extended.cls.xml","fc")

Load started on 01/27/2009 10:10:34
Loading file C:\Test.Extended.cls.xml as xml
Imported class: Test.Extended
Compiling class Test.Extended ..................
Compiling routine Test.Extended.1
Compiling routine Test.Extended.2
Load finished successfully.
1

我们需要系统自动加载和编译这两个文件,但我们不能这样做,因为系统一直在使用旧版本。有人知道如何强制 Intersystems Caché 使用最新版本的编译类吗?

谢谢,路易斯

4

1 回答 1

1

这里有几件事可以尝试:

不要单独加载/编译每个类,而是在不编译的情况下加载它们,然后同时编译它们。

像这样:

W $SYSTEM.OBJ.Load("C:\Test.Base.cls.xml")
W $SYSTEM.OBJ.Load("C:\Test.Extended.cls.xml")
W $SYSTEM.OBJ.CompileList("Test.Base.cls,Test.Extended.cls","ckf")

“k”标志告诉编译器保留类的生成源(.INT 文件)。这将让您看到 Cache 实际生成的内容(在 Studio 中:查看->查看其他代码)。你的方法被编译成以“z”为前缀的标签,所以方法 ABC 变成了标签 zABC。编译后的源代码中还有一个时间戳,可以帮助确认它确实做了什么。

“b”标志也可能有帮助。(包括子类)。

于 2009-03-11T15:23:13.627 回答