MonoMac - 如何执行Apple脚本

时间:2011-05-03 21:18:39

标签: objective-c mono applescript monomac monobjc

我正在尝试使用MonoMac创建一个简单的应用程序,并且需要执行apple脚本来访问来自不同媒体播放器的播放列表信息(请参阅我的previous question)。

我决定尝试使用MonoMac,因为我非常熟悉C#和.net开发,并且有一个很好的Websocket实现。

不幸的是,似乎没有NSAppleScript的工作包装器。我尝试Frederic Forjans implementation并尝试使用monobjc

当我使用他的代码时,Frederics包装器类甚至不编译我得到以下异常:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'MonoMac, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
File name: 'MonoMac, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'

创建新的NSString实例时。但是,位于同一程序集中的new NSDictionary();工作正常。

使用monobjc时出现以下错误:

Unhandled Exception: System.TypeInitializationException: An exception was 
thrown by the type initializer for Monobjc.ObjectiveCRuntime ---> 
System.EntryPointNotFoundException: monobjc_install_bridge
  at (wrapper managed-to-native) Monobjc.NativeMethods:InstallBridge ()
  at Monobjc.ObjectiveCRuntime..cctor () [0x00000] in :0 
  --- End of inner exception stack trace ---
  at CocoaApplication1.Program.Main () [0x00000] in :0 

有人能建议一种简单而有效的方法在单声道环境中执行苹果脚本吗?

3 个答案:

答案 0 :(得分:4)

如果不使用Monobjc运行时二进制文件运行它们,则无法直接使用Monobjc程序集。无论您是想在Monobjc的网站上构建基于Cocoa还是控制台的应用程序there are tutorials,都可以帮助您入门。

实现应用程序间通信的最简单方法是使用ScriptingBridge框架。许多应用程序提供脚本定义,然后可以以面向对象的方式使用:take a look at this guide以获取更多详细信息。

请注意,脚本桥仅适用于启用脚本的应用程序(如iTunes,iCal,iMovie,Finder等)。

Monobjc支持ScriptingBridge框架;甚至还有两个示例应用程序(SBSetFinderCommentScriptingBridgeiCal),展示了如何集成它。

答案 1 :(得分:1)

如果可能,请尝试使用Monobjc。 Monobjc提供了一种执行自定义AppleScript的非常简单的方法。

以下代码段显示了主要步骤:

string script = ". . . . . . . . . ."; // some applescript text
NSDictionary error = null;
NSAppleScript scr = new NSAppleScript(script);
NSAppleEventDescriptor result = scr.ExecuteAndReturnError(out error);
string retval = result.StringValue;

我写了blog post解释相同的内容。还提供了一个样本Monobjc项目。

答案 2 :(得分:0)

我试图从WinForms Mono项目中执行AppleScript,最终构建了自己的AppleScript执行库AppleScript Slim。 !00%的代码来自Mono Develop项目。

AppleScript Slim:https://applescriptslim.codeplex.com/