在 D 中动态绑定 extern(Objective-C) 类

Dynamically Bind extern(Objective-C) Classes in D

我想在我的 D 应用程序中大量使用 extern (Objective-C) 类,因为我不想手动发送 Objective-C 消息。但是,我主要使用 AppKit、IOKit 和 Foundation 等框架,并且 extern (Objective-C) 需要静态 linking 才能根据 documentation.

工作

但是,我不认为静态 linking OS 库是个好主意。考虑到不同的 macOS 版本时,它似乎非常脆弱。

所以我的问题是,

  1. 静态 link Foundation 和 AppKit 实际上是个坏主意吗?
  2. 如果是,那么是否可以使用 dlopen 动态加载 .framework 文件,然后将函数指针绑定到 extern (Objective-C) 类?
  1. 没有。我认为这不是问题,这是相对标准的做法。当然,您将无法在同一个二进制文件中为(比如说)macOS 和 iOs 构建,但这种情况很少见。如果您 dlopen 个框架,您可能会发现它们有时也会在 macOS 版本中移动。 Apple 不时有其他方法来破坏您的向后兼容性,但删除您的框架并不常见。 您将成为 extern(Objective-C).

    的首批幸运用户之一
  2. 是的,这绝对有可能。但是你必须直接与 ObjC 运行时对话,因为自 OSX 以来没有函数被导出,只有 类 ID。您必须为要调用的每个方法编写一些脆弱的代码。从协议继承是非常困难的。你真的不能那样做。从好的方面来说,它在 DMD 和 LDC 中的工作原理相同。您可以签到 dplug:cocoa。我真的建议改用 extern(Objective-C) 和静态链接。