代码之家  ›  专栏  ›  技术社区  ›  Vegar

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

  •  2
  • Vegar  · 技术社区  · 15 年前

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

    案件:

    我们已经导入了一个SOAP服务,它公开了两个方法,将对象作为参数。Delphi生成用于与SOAP服务通信的类/接口,用作参数的对象都继承自可删除项。

    由于不同的原因,我们已经将与SOAP服务的所有通信放到了一个DLL中。

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

    现在,这并没有起作用,但却出现了一个我没有预料到的例外。

    它说,我们试图发送到SOAP服务的对象必须继承自可震颤,但它确实继承了。通过检查对象,我们可以看到类是从WSDL导入的类,父类确实是可移动的。

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

    问题:

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

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   Zoë Peterson RRUZ    15 年前

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

        2
  •  0
  •   Chris Thornton    15 年前

    您可以尝试将参数作为tobject传递,并在任何一端将其转换为可震颤的类型。我没有尝试过这个特定的案例,但我知道我已经将对象传递到了这样的DLL中。我也有一个类似的SOAP DLL,在我的例子中,这不会起作用,因为我的SOAP DLL是用d2007 SOAP库编译的,而且由于复杂/遗留的原因,应用程序的其余部分是d2005。