【问题标题】:finding resources for OSX plug-in查找 OSX 插件的资源
【发布时间】:2014-11-15 01:11:19
【问题描述】:

我有一个 OSX 包,其中包含一个可执行的共享库,其中包含关联的 资源(想想 Photoshop)。

如何在运行时找到包含插件和资源的包?

_NSGetExecutablePath()GetMainBundle() 获取主应用程序,而不是 运行插件代码。

捆绑包没有固定路径,它位于一些随机插件文件夹中 由插件主机定位。同样,它没有唯一的名称,如 可能有许多不同版本的“相同”插件相关联 使用不同版本的插件主机。

如果我有一大块执行代码作为捆绑包的一部分加载,那么应该有一种明确的方式来引用同一捆绑包中的资源。

【问题讨论】:

    标签: macos dynamic bundle


    【解决方案1】:

    您使用[NSBundle bundleForClass:[SomeClassUniqueToYourPlugin class]] 获取插件包,然后从那里获取各种NSBundle 资源定位方法。

    【讨论】:

    • 同一个插件的两个相关但不相同的版本会有相同的类,不是吗?而基于 c 的插件将没有类。
    • Objective-C 运行时不能很好地处理从两个包中加载的同一个类。因此,插件必须确保它们的类在可能加载到同一进程中的所有插件中是唯一的。这是一个棘手的问题,但它与这个问题正交。对于基于 C 的插件,您可以改用 +bundleWithIdentifier:CFBundleGetBundleWithIdentifier()
    • 这对我来说听起来像是一个主要错误 - 如果我创建一个与其他供应商类同名的类,结果会出现问题。
    【解决方案2】:

    执行此操作的规范方法是调用CFBundleGetBundleWithIdentifier[NSBundle bundleWithIdentifier:]

    正如CFBundleGetBundleWithIdentifier 所记录的那样:

    要使用它的标识符定位一个包,该包必须已经被加载。通过标识符定位包的主要目的是让框架或插件中的代码找到自己的包

    对于[NSBundle bundleWithIdentifier:]

    框架和插件通常使用此方法来定位在运行时自己的包

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2013-09-15
      相关资源
      最近更新 更多