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

これらの 2 つのファイルをシステムが自動的にロードしてコンパイルする必要がありますが、システムが古いバージョンを使用し続けるため、それができません。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 ファイル) を保持するようにコンパイラに指示します。これにより、キャッシュが実際に生成したものを確認できます (Studio の場合: [表示] -> [他のコードを表示])。メソッドは「z」で始まるタグにコンパイルされるため、メソッド ABC はタグ zABC になります。コンパイルされたソースには、実際に何かを実行したことを確認するのに役立つタイムスタンプもあります。

「b」フラグも役立つ場合があります。(サブクラスを含む)。

于 2009-03-11T15:23:13.627 に答える