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 库中正确一致地采用良好的版本控制实践,如果它们要有效的话。