1

编辑:我已经解决了这个问题;这是一个配置问题。确保您的 .sdef 与您的应用程序一起复制/部署,否则在运行时将找不到它。

我正在使用 Mono 和 Monobjc 构建一个 Mac 应用程序,我希望能够通过 AppleScript 向它发送命令。我已经阅读了 Apple 文档,并让他们的 Simple Scripting Verbs 示例使用 Objective C 工作,但我似乎无法将它翻译为与 Monobjc 一起工作。诸如“退出”之类的内置命令可以工作,但是带有我在脚本定义中添加的命令的自定义套件在 Objective C 版本中有效,但在单声道版本中无效。正在使用的脚本定义是 Stest.sdef:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<!-- declare the namespace for using XInclude so we can include the standard suite -->

<dictionary xmlns:xi="http://www.w3.org/2003/XInclude">
    <!-- use XInclude to include the standard suite -->
<xi:include href="file:///System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite)"/>
    <!-- specific suite(s) for the application follow... -->
<suite name="Simple Scripting Verbs" code="SVrb" description="Terminology for the SimpleScriptingVerbs Sample.">

    <command name="do simple command" code="SVrbSimp" description="run a simple command with no parameters">
        <cocoa class="SimpleCommand"/>
        <result type="integer" description="returns the number seven"/>
    </command>

</suite>

</dictionary>

此命令的工作目标 C 实现是这样的:

@implementation SimpleCommand


/* This class implements a simple verb with no parameters.  The verb 
returns an integer number.  Verbs don't get much simpler than this. */


- (id)performDefaultImplementation {
SLOG(@"SimpleCommand performDefaultImplementation");

    /* return 7 to show how to return a number from a command */
return [NSNumber numberWithInt:7];
}

@end

我尝试将此移植到 Monobjc 是这样的:

using System;
using Monobjc;
using Monobjc.AppKit;
using Monobjc.Foundation;

namespace STest
{

    [ObjectiveCClass]
    public class SimpleCommand : NSScriptCommand
    {
        public SimpleCommand ()
        {
        }

        public SimpleCommand(IntPtr nativePointer) : base(nativePointer) 
        {
        }

        [ObjectiveCMessage("performDefaultImplementation")]
        public NSNumber performDefaultImplementation()
        {

            return NSNumber.NumberWithInteger (7);
        }
    }

}

当我运行 Applescript 命令时

tell application "TheObjCVersion"
    do simple command
end tell
  • 当我尝试使用 Objective-C 版本时,它返回 7,正如您所期望的那样。
  • 当我尝试使用 Mono 版本时,它抱怨编译器错误,在该命令中标记“简单”,说“预期行尾但找到标识符”。

是否可以在 Mono 应用程序中实现自定义脚本命令,如果可以,如何实现?

4

1 回答 1

1

问题不在于 .sdef 或我的代码,而在于我的项目配置。我未能设置要复制的 .sdef,因此在运行时找不到它。

于 2013-07-08T02:52:51.417 回答