2

今日、奇妙なケースがあり、デルファイのオブジェクトモデルが実際にどのように機能するかを考えさせられました。

ケース:

オブジェクトをパラメーターとして使用して、いくつかのメソッドを公開するSOAPサービスをインポートしました。Delphiは、soapサービスとの通信に使用するクラス/インターフェイスを生成し、パラメータとして使用されるオブジェクトはすべてTRemotableから継承します。

さまざまな理由で、soapサービスとのすべての通信をdllに入れました。

次に、メインの実行可能ファイルで送信する必要のあるオブジェクトをインスタンス化し、シリアル化して送信するためにライブラリに渡そうとしました。

さて、それはうまくいきませんでしたが、私が予期していなかった例外を与えました。

せっけんサービスに送信しようとしているオブジェクトは、TRemotableから継承する必要があると言われていますが、継承しています。オブジェクトを調べることにより、クラスがwsdlからインポートされたクラスであり、親クラスが実際にTRemotableであることがわかります。

パッケージを使用してビルドすると、この問題が解決します。

質問:

2つのライブラリ間で共有されるソースファイルで定義されたクラスが、実行時に異なるクラスとして終了するようにするためですか?もしそうなら、それはなぜですか?

私の知る限り、ライブラリ間でオブジェクトを渡しても問題ないはずです。では、どのようにして強い型付けが保証され、オブジェクトインスタンスはどの程度相互に互換性がありますか?

4

2 に答える 2

3

はい、異なるDLLの同じクラスは異なります。各DLLのクラスは実行時にロードされ、異なるメモリを指すA.ClassType = B.ClassTypeため、同じソースファイルであっても失敗します。オブジェクトを渡すことはできますが、クラス自体を比較するために「is」または「as」を使用しているこのような場合を除いて、オブジェクトは正しく機能します。強い型付けが保証されるのは、DLLとメインアプリケーションをコンパイルするときにコンパイラがクラスが一致すると想定する場合のみです。オブジェクトの1つのバージョンと、変更されたオブジェクト宣言を使用しようとする新しいアプリケーションを含むDLLをロードすることに対する保護はありません。それが必要な場合は、パッケージを使用する必要があります。

于 2010-04-09T19:16:30.010 に答える
0

パラメータをTObjectとして渡してみて、どちらの側でもTRemotableとしてキャストすることができます。私はこの特定のケースを試していませんが、TObjectをそのようなDLLに渡したことは知っています。私もSOAP用の同様のDLLを持っていますが、私の場合、SOAPDLLはD2007SOAPライブラリでコンパイルされており、複雑でレガシーな理由から、アプリの残りの部分はD2005です。

于 2010-04-09T19:38:29.693 に答える