2

今天遇到一个奇怪的案例,这让我想到了 delphi 中的对象模型是如何工作的。

案子:

我们导入了一个 SOAP 服务,它公开了几个方法,将对象作为参数。Delphi 生成我们用来与soap 服务通信的类/接口,并且用作参数的对象都继承自TRemotable。

由于不同的原因,我们将所有与soap服务的通信都放在了一个dll中。

然后,我们尝试实例化应该在主可执行文件中发送的对象,并将其传递给库以进行序列化和发送。

现在,这不起作用,但给出了一个我没想到的异常。

它说我们试图发送到soap服务的对象必须继承自TRemotable,但确实如此。通过检查该对象,我们可以看到该类是从 wsdl 导入的类,并且父类确实是 TRemotable。

使用包构建解决了这个问题。

问题:

是不是一个在源文件中定义的类在两个库之间共享,最终在运行时成为不同的类?如果是这样,那是为什么?

据我所知,在库之间传递对象应该没问题。那么,如何确保强类型化,以及对象实例在多大程度上相互兼容?

4

2 回答 2

3

是的,不同DLL中的同一个类是不同的。每个 DLL 中的类将在运行时加载并指向不同的内存,因此A.ClassType = B.ClassType即使对于相同的源文件也会失败。您仍然可以传递对象并且它们会正常工作,除非在这种情况下它使用“is”或“as”来比较类本身。只有当您编译 DLL 和主应用程序时,编译器假定类匹配才能确保强类型。没有任何保护措施可以防止使用一个版本的对象加载 DLL 和尝试使用修改后的对象声明的较新应用程序。如果你愿意,你需要使用包。

于 2010-04-09T19:16:30.010 回答
0

您可以尝试将参数作为 TObject 传递,并在任一端转换为您的 TRemotable。我没有尝试过这种特殊情况,但我知道我已经将 TObject 传递到了这样的 DLL 中。我也有一个类似的 SOAP DLL,在我的情况下,这不起作用,因为我的 SOAP DLL 是使用 D2007 SOAP 库编译的,并且由于复杂/遗留原因,应用程序的其余部分是 D2005。

于 2010-04-09T19:38:29.693 回答