【问题标题】:Delphi COM vs DLL in .NET [closed].NET中的Delphi COM与DLL [关闭]
【发布时间】:2015-05-06 08:09:53
【问题描述】:

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

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

【问题讨论】:

  • 答案是“视情况而定”。有时一种方式更好,有时另一种方式更好。也许你应该重新审视这个问题并提供更多细节。
  • COM 对象被编译为 DLL。如果您的意思是 COM 与 Win32 DLL,请记住 Win32 DLL 支持版本控制。让客户端抱怨你的应用程序崩溃对错误的版本造成的影响比编译器警告你错误的版本更烦人
  • COM 和 Win32 DLL 的版本控制能力确实没有太大区别。使用 COM 对象进行版本控制依赖于开发人员遵循规定的做法。在开发 Win32 DLL 时可以采用同样有效的做法,只是大多数人不这样做。但是 COM 中没有任何东西强制您采用版本控制最佳实践,您可以选择不采用(或更糟糕的是:如果您不小心就会弄错)。

标签: .net delphi .net-4.5


【解决方案1】:

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

版本控制

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

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

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

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

编组和元数据

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

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

COM 规范还提供元数据来描述库公开的接口。这使您的 COM 对象可以很容易地导入以供 .NET 客户端(或 Win32 客户端)使用。

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

插件与共享库

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

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

结论

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

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

【讨论】:

  • 这个问题被关闭并且被否决了,这真是令人遗憾,这个答案可能非常有用。
【解决方案2】:

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

DLL 可能更简单,但您仍然需要使用特定的数据类型,并且非常清楚您在使用共享内存或对象时所做的事情。 this StackOverflow question中有一些指针。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2018-09-13
      • 2012-09-22
      • 2011-12-29
      • 2011-01-05
      • 2011-07-27
      • 1970-01-01
      相关资源
      最近更新 更多