Delphi COM vs .NET中的DLL

时间:2015-05-05 15:24:41

标签: .net delphi .net-4.5

需要创建一个可以从Delphi和.NET调用的Delphi DLL。 .NET更像是COM,还是DLL?或者重要吗?

我只记得因为版本控制而听到COM很烦人。

3 个答案:

答案 0 :(得分:2)

对Win32 DLL和COM库进行版本控制的问题是一个非常具体的实现细节,与这两种方法中哪一种最适合.NET客户端使用无关。

版本

COM版本控制依赖于规定实践的一致应用。可以忽略这些实践(或者不正确地实现它们)并创建一个COM库,它在版本稳定性,一致性和依赖性方面遇到与Win32 DLL相同的问题。

同样可以开发一个Win32 DLL来实现确保版本安全的机制,你只需要自己开发和实现这些策略。

COM中的版本控制被认为是“令人讨厌”的问题很可能源于通过版本独立的程序ID在新版本中保持向后兼容性所涉及的开销。但是,您可以选择不采用这种做法(例如as Microsoft decided to do with MSXML from 4.0 onward)。

然而,这是一个单独的问题,而不是确保接口是不可变的,例如引入具有版本特定名称的新类和接口( IMyInterface10 IMyInterface20 IMyInterface30 适用于版本1,2和3等。)

编组和元数据

除了版本控制之外,COM库极大地简化了在客户端和库之间传递复杂结构化信息的工作,并确保一致地定义参数等中使用的常量等内容。对于DLL(以及DLL的使用者),如果需要交换比简单数值或指向不可变字符串(缓冲区)更复杂的东西,则需要非常小心。

COM提供了简化更复杂信息交换的机制(在术语中称为“编组”)。

COM规范还提供了元数据来描述库所公开的接口。这使您可以非常轻松地导入COM对象,以供.NET客户端(或Win32客户端)使用。

Win32 DLL没有提供等效元数据的一致规范,使客户端更难以访问他们提供的服务。通常,Win32 DLL提供程序必须为它们支持的每种语言或环境提供标头或其他接口声明。如果开发人员使用的某些其他语言未提供这些标头,则他们必须根据提供的标头进行手动转换。

插件与共享库

在某些用例中,Win32 DLL是更合适的选项,但这些用例往往涉及DLL被用作私有的可加载模块以通过专用接口机制扩展单个特定应用程序的情况,而不是将这些库提供给其他人以供一般使用时。

由于您特意打算在Delphi和.NET客户端之间共享此库,但这似乎不是特殊情况之一。

结论

由于所有这些原因,如果像你这样的通用库似乎是,COM几乎总是首选。

如果版本控制很重要,那么确保您在COM库中正确且一致地熟悉并采用良好的版本控制实践仍然是您的责任。

答案 1 :(得分:1)

COM注册是一个真正的PITA .... 例如,您需要管理权。

如果我有选择的话,我会使用DLL。

对于编组字符串,请考虑在Delphi端使用WideString,在c#端使用BSTR。

答案 2 :(得分:1)

COM对某些方面的某些事情要求很高。你需要注意线程模型和其他一些深奥的东西。好处是COM对象在.NET世界中很好地集成,因为你得到了intellisense和whatsnot之类的东西。在这方面它更好"集成(同样,与C ++相比,Delphi使COM变得简单)。我自己的一些经历是this StackOVerflow question

DLL可能更简单,但您仍然需要使用特定的数据类型,并且非常了解在使用共享内存或对象时所执行的操作。 this StackOverflow question中有一些指示。

As David said,真正的答案取决于你需要做什么。