同一类在两个不同的库中使用不兼容?

问题描述:

今天来到了一个奇怪的案例,这让我想到了delphi中的对象模型是如何工作的。同一类在两个不同的库中使用不兼容?

案例:

我们已经导入了SOAP服务,它暴露了几个方法,以对象作为参数。 Delphi生成我们用来与soap服务通信的类/接口,并且用作参数的对象都从TRemotable继承。

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

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

现在,这并没有工作,但给了我没有想到的例外。

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

使用软件包构建可解决此问题。

的问题是:

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

据我所知,应该可以在库之间传递对象。那么,如何保证强大的输入以及对象实例在多大程度上相互兼容?

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

+0

OK。然后,这是对我所猜测的内容的确认。其实,我喜欢这个,因为它强制我们有更好的设计...... – Vegar 2010-04-09 19:22:02

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