【问题标题】:Objective-C: Load "Library" using reflectionObjective-C:使用反射加载“库”
【发布时间】:2011-08-19 01:43:29
【问题描述】:

我的任务是使用 XCode for OSX 创建一个应用程序。此应用程序需要能够加载和运行将动态确定的单独“模块”(即,一个用户可能购买了模块 1 和 2,而用户 2 将购买了模块 3 和 6——只有购买的模块应该“运行")。

在 C# 中,我将创建一个“库”项目(编译为一个 DLL)。当用户购买模块时,我会提供适当的 DLL 文件,然后我的应用会使用反射查找并加载/运行 DLL。

在 XCode 中与 this 等价的是什么?我可以创建一个“库”然后使用反射加载它吗?请记住,应用程序无法事先了解模块,因为在某些情况下,用户甚至不会拥有模块文件。我看到了各种选项,例如“Cocoa Framework”和“Cocoa Library”以及“C/C++ Library”。每个人都做什么,并且会做什么来做我需要的事情?

【问题讨论】:

    标签: objective-c macos dynamic


    【解决方案1】:

    您可以创建一个捆绑包。 Xcode 有这方面的模板(它被称为“Loadable Bundle”,图标是一块乐高积木)。您通常使用NSBundleload 方法加载包。

    加载它的一个例子是:

    - (BOOL)loadPluginAtURL:(NSURL *)URL {
      NSBundle *pluginBundle = [NSBundle bundleWithURL:URL];
      if (![pluginBundle load]) { // is false if pluginBundle == nil automatically.
        return NO;
      }
      id plugin = nil;
      @try { // Use @try-@catch in case the principle class doesn't respond to +alloc or -init. Otherwise the host application would crash and that kinda sucks.
        plugin = [[pluginBundle principalClass] alloc] init]; // Set the principle class in the bundle's info plist.
      } @catch (id e) {
        [bundle unload];
        return NO;
      }
      if (plugin) {
        [self.loadedPlugins addObject:plugin];// Define this as an NSMutableSet object.
        return YES;
      }
      [pluginBundle unload];
      return NO;
    }
    

    您最终可以提供插件可以使用的框架,其中可以包括协议和类。例如,您可以检查捆绑包的主要类是否是框架中特定类的子类,这样您就不会发送任何插件不响应的消息。

    【讨论】:

    • 我看到一个几乎透明的白色乐高积木,但它只写着“捆绑”——我猜是那个?
    • 创建“Url”以从与正在运行的应用程序相同位置的磁盘读取捆绑文件的语法是什么样的?
    猜你喜欢
    • 2021-11-26
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多