有没有办法从mac应用程序加载类,并在不同的mac应用程序中使用它们?
我想制作一个Automator动作来访问我的mac应用程序中的某些类,这似乎是我理想的方式(意味着你必须购买我的应用程序才能使用Automator)行动等。)
答案 0 :(得分:4)
根据你想做的事情(我不太清楚),Service可能会为你做到这一点。您创建了一个帮助应用程序,可以使用共享的粘贴板在您的应用程序之间来回传递数据。您可以获得相当广泛的操作,因为您可以传递符合NSPasteboardWriting和NSPasteboardReading协议的任何对象;正如文档中所述,NSString
,NSAttributedString
,NSURL
,NSColor
,NSSound
和NSImage
已经可用,当然,您可以编写一个完全符合您需求的自定义类。
答案 1 :(得分:4)
您是否尝试过创建独立的Automator插件项目,或尝试将Automator捆绑目标添加到应用程序的项目中?
我假设您要为主应用程序创建Automator操作,但不清楚如何使这些操作与您的应用程序(或应用程序中存在的类)进行交互。
Automator操作有3种基本类型:基于AppleScript,基于shell脚本和基于Objective-C。您很可能希望使您的基于Objective-C,这将允许您轻松地将主应用程序中的其他Objective-C代码合并到操作本身(请参阅Implementing an Objective-C Action)。 (请注意,默认情况下,为自动机包添加新目标时,它是AMAppleScriptAction
类型。)
要了解与基于AppleScript的操作相比如何设置Objective-C自动机操作,您可能需要尝试创建单独的独立项目。
假设您的应用是基于文档的,并使用KWDocument
类,该类公开名为-duplicateObjects:(NSArray *)objects toDocument:(KWDocument *)destDocument;
的方法。您还有KWRegistrationManager
知道您的应用是否已注册。而且假设你想要创建一个名为“Duplicate Objects to Document”的自动机器人动作。该操作将在KWDuplicateObjectsToDocument
中实现,AMBundleAction
是NSPrincipalClass
的子类。在将重复对象发送到Document.action的Info.plist中,KWDuplicateObjectsToDocument
将为KWDuplicateObjectsToDocument.h
。
#import <Cocoa/Cocoa.h>
#import <Automator/AMBundleAction.h>
@interface KWDuplicateObjectsToDocument : AMBundleAction {
}
- (id)runWithInput:(id)input fromAction:(AMAction *)anAction
error:(NSDictionary **)errorInfo;
@end
看起来像:
KWDuplicateObjectsToDocument.m
你的#import "KWDuplicateObjectsToDocument.h"
#import "KWDocument.h"
#import "KWRegistrationManager.h"
@implementation KWDuplicateObjectsToDocument
- (id)runWithInput:(id)input fromAction:(AMAction *)anAction
error:(NSDictionary **)errorInfo {
if (![[KWRegistrationManager defaultManager] isRegistered]) {
return nil;
}
// eventually you'll call
// duplicateObjects:toDocument:
return input;
}
@end
看起来像这样:
KWRegistrationManager
您需要确保编译并包含您使用的必要类(例如KWDocument
,{{1}}等)作为此捆绑包的构建过程的一部分。
答案 2 :(得分:2)
你可以通过Applescript从你的应用程序中获取某些行为,但是以我认为你的意思是不可能访问实际的类。我的印象是,您的意思是访问加载到正在运行的应用程序内存中的类。这在OS X(或任何类UNIX系统)上是不可能的。应用程序在用户级别运行。用户级别的进程无法从其他进程读取内存。需要执行此类操作的操作系统组件在内核级别运行。
如果您只是尝试重用代码,则可以将要共享的部分构建到静态库中,其他人可以链接它并共享您的代码。
编辑:
从NSGod的回答看来,你可以使用相同的方法,通过Applescript访问它,并通过Obj-C访问它。这看起来很酷。
答案 3 :(得分:2)
看看distributed objects。您的应用程序可以提供Automator操作可以使用的一个或多个对象。我从未尝试过使用Automator,但它是一个非常优雅的系统,近年来并没有引起太多关注。我认为这绝对值得一看。
分布式对象的一个很酷的方面是,如果你愿意,应用程序可以在同一台计算机上运行,但它可以很容易地在另一台计算机上运行,甚至可能在很远的地方运行。
答案 4 :(得分:2)
基本上,不,你不能用可执行文件链接。
应用程序二进制文件采用特定格式。 并且该格式与静态或共享库格式不同。
这意味着您将无法从应用程序二进制文件加载任何代码部分,就像使用库一样。