Macアプリケーションからクラスを読み込み、別のMacアプリケーションで使用する方法はありますか?アプリケーションをライブラリとして使用できますか(Mac、Objective-c)?
私は、MacアプリケーションのいくつかのクラスにアクセスするAutomatorアクションを作成したいと思います。これは私が理想的に行う方法のようです(つまり、あなたが私のアプリケーションを購入して、 Automatorアクションなど)
Macアプリケーションからクラスを読み込み、別のMacアプリケーションで使用する方法はありますか?アプリケーションをライブラリとして使用できますか(Mac、Objective-c)?
私は、MacアプリケーションのいくつかのクラスにアクセスするAutomatorアクションを作成したいと思います。これは私が理想的に行う方法のようです(つまり、あなたが私のアプリケーションを購入して、 Automatorアクションなど)
Applescriptからアクセス可能なアプリケーションから特定の動作を実行できますが、実際のクラスにアクセスすることは、あなたが意味するとは思えません。実行中のアプリケーションのメモリにロードされたクラスにアクセスするという印象を受けます。これは、OS X(またはUNIXのようなシステム)では不可能です。アプリケーションはユーザーレベルで実行されます。ユーザーレベルのプロセスは、他のプロセスからメモリを読み取ることができません。このようなことを行う必要があるOSのコンポーネントは、カーネルレベルで実行されます。
コードを再利用しようとしている場合、静的ライブラリに共有する部分を作成し、他の部分とリンクしてコードを共有することができます。
EDIT:
あなたがAppleScriptを介して、それがアクセスできるようになり、同じアプローチを使用し、OBJの-Cを経由して、それがアクセスできるようにすることができているようですNSGodの答えから。それはかなりクールだ。
あなたのやりたいこと(私ははっきりしていません)に応じて、Serviceがあなたのためにこのトリックを行うかもしれません。共有ペーストボードを使用して、アプリケーションでデータを前後に渡すことができるヘルパーアプリを作成します。 NSPasteboardWritingとNSPasteboardReadingプロトコルに準拠するオブジェクトを渡すことができるため、かなり広い範囲のアクションを取得できます。 NSString
、NSAttributedString
、NSURL
、NSColor
、NSSound
、NSImage
はすでにご利用いただけると思いますが、もちろんあなたのニーズに合ったカスタムクラスを作成することもできます。
distributed objectsをご覧ください。アプリケーションでは、Automatorアクションで使用できるオブジェクトを1つ以上販売することができます。私はAutomatorでそれを試したことはありませんが、近年注目されていない非常にエレガントなシステムです。私はそれが一見価値があると思う。
分散オブジェクトの優れた点の1つは、アプリケーションを同じコンピュータ上で実行している可能性がありますが、別のコンピュータ、おそらく非常に離れているアプリケーションでも簡単に実行できます。
基本的には、実行可能ファイルにリンクすることはできません。
アプリケーションバイナリは特定の形式です。 その形式は静的または共有ライブラリ形式とは異なります。
つまり、ライブラリと同様に、アプリケーションバイナリからコード部分をロードすることはできません。
スタンドアロンのAutomatorプラグインプロジェクトを作成しようとしましたか、Automatorバンドルターゲットをアプリケーションのプロジェクトに追加しようとしましたか?
メインアプリケーションのAutomatorアクションを作成したいと思っていますが、これらのアクションをアプリケーション(またはアプリケーションに含まれるクラス)とやりとりする方法が不明です。
Automatorアクションには、AppleScriptベース、シェルスクリプトベース、およびObjective-Cベースの3つの基本的なタイプがあります。Objective-Cをベースにして、メインアプリケーションのObjective-Cコードをアクション自体に簡単に組み込むことができます(Implementing an Objective-C Action参照)。 (デフォルトでは、オートマティックバンドルの新しいターゲットを追加するときはAMAppleScriptAction
タイプです)。
Objective-Cの自動化アクションがAppleScriptベースのアクションと比べてどのように設定されているかを確認するには、独立したスタンドアロンプロジェクトを作成してみてください。
あなたのアプリがドキュメントベースで、という名前のメソッドを公開するKWDocument
クラスを使用しているとします。あなたのアプリが登録されているかどうかを知っているKWRegistrationManager
もあります。そして、「文書を複製するオブジェクト」と呼ばれるオートメーションアクションを作成したいとしましょう。アクションはKWDuplicateObjectsToDocument
に実装されます。サブタイプはAMBundleAction
です。 Duplicate Objects to Document.actionのInfo.plistでは、NSPrincipalClass
は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
など)がコンパイルされ、このバンドルのビルドプロセスの一部として組み込まれます。
実行中のアプリケーションから何もロードしたくありません。私は静的ライブラリとして私のアプリケーションを使用することができますか、私は私のアプリケーションと私の両方の自動アクションからアクセスする静的ライブラリを作成する必要がある場合は私は思っていますか? –
ああ、静的ライブラリを構築し、そのライブラリにリンクしたいと思うでしょう。実行可能バイナリファイルはライブラリとは異なります。どちらもコンパイルされたコードを含んでいますが、別の形式です。実行可能ファイルにリンクすることはできません。希望が役立ちます。乾杯:) –