Delphi .NET 中的 COM 与 DLL

Delphi COM vs DLL in .NET

需要创建可以从 Delphi 和 .NET 调用的 Delphi DLL。 .NET 更喜欢什么,COM 还是 dll?或者这有关系吗?

我只记得听说 COM 由于版本控制而令人讨厌。

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

因此,如果可以选择,我会使用 DLL。

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

COM 对某些事情以某些方式完成的要求非常高。您需要了解线程模型和其他一些深奥的东西。好消息是 COM 对象可以很好地集成到 .NET 世界中,因为您可以获得诸如智能感知之类的东西。在这方面,它是 "better" 集成的(另外,与 C++ 相比,Delphi 使 COM 变得容易)。我自己的一些经历在this Whosebug question.

DLL 可能更简单,但您仍然需要使用特定的数据类型,并且非常清楚在使用共享内存或对象时您要做什么。 this Whosebug question.

中有一些指针

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

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

版本控制

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

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

COM 中的版本控制问题被视为 'annoying' 最有可能源于通过独立于版本的程序 ID 维护新版本的向后兼容性所涉及的开销。但是,您可以选择不采用这种做法(例如 as Microsoft decided to do with MSXML from 4.0 onward)。

但是,这与确保接口不可变、引入新的 类 和具有版本特定名称的接口(例如 IMyInterface10IMyInterface20IMyInterface30 版本 1、2 和 3 等)。

编组和 Meta-Data

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

COM 提供了简化更复杂信息交换的机制(行话中称为 "marshalling")。

COM 规范还提供 meta-data 来描述您的库公开的接口。这使您的 COM objects 可以非常容易地导入以供 .NET 客户端(或 Win32 客户端)使用。

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

Plug-Ins 对比共享库

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

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

结论

出于所有这些原因,对于像您这样的通用库,COM 几乎总是首选。

如果版本控制可能很重要,您仍有责任确保您熟悉并在 COM 库中正确且一致地采用良好的版本控制实践,如果它们要有效的话。