【问题标题】:MonoTouch binding not creating partial classesMonoTouch 绑定不创建部分类
【发布时间】:2011-09-30 16:08:31
【问题描述】:

我正在尝试执行 MonoTouch binding page 上显示的操作,并向绑定类添加一些方法。它说我所要做的就是将它们包含在一个单独的文件中定义的部分类中,该文件包含在带有 -s 选项的生成过程中。问题是生成的类不是部分类,当我运行 btouch 时出现以下错误:

$ /Developer/MonoTouch/usr/bin/btouch -v Node.cs -s:Extensions.cs /Developer/MonoTouch/usr/bin/smcs -unsafe -target:library Node.cs -nowarn:436 -out:/var/folders/cy/g71b7mr91rn4slbpq5cm39140000gn/T/u983s550.k1k/temp.dll -r:/Developer/ MonoTouch/usr/lib/btouch/btouch.exe Extensions.cs -r:/Developer/MonoTouch/usr/lib/mono/2.1/monotouch.dll
Node.cs(7,19): error CS0260: Missing partial modifier on type of declaration of NodeNameSpace.Node'. Another partial declaration of this type exists Extensions.cs(5,30): (Location of the symbol related to previous error) Extensions.cs(5,30): error CS0261: Partial declarations ofNodeNameSpace.Node' 必须是所有类、所有结构或所有接口 Node.cs(7,19):(与先前错误相关的符号位置) Extensions.cs(7,29):错误 CS0106:修饰符 public' is not valid for this item Extensions.cs(10,25): error CS0531:NodeNameSpace.Node.IsExpanded.get':接口成员不能有定义 Extensions.cs(14,25):错误 CS0531:`NodeNameSpace.Node.IsExpanded.set':接口成员不能有定义 编译失败:5 个错误,0 个警告 btouch:API 绑定包含错误。

根据binding上的MonoTouch页面:

生成器从 API 定义文件生成的每个类都是一个分部类

Node.cs

using System;
using MonoTouch.Foundation;

namespace NodeNameSpace
{
    [BaseType (typeof (NSObject))]
    interface Node
    {
        [Export ("expanded")]
        NSNumber Expanded { get; set; }
    }
}

Extensons.cs

using MonoTouch.Foundation;

namespace NodeNameSpace 
{
    public partial class Node
    {
        public bool IsExpanded
        {
            get
            {
                return Expanded.BoolValue;
            }
            set
            {
                Expanded = NSNumber.FromBool(value);
            }
        }
    }
}

【问题讨论】:

    标签: c# objective-c ios binding xamarin.ios


    【解决方案1】:

    这是一个很长的文档页面,但这应该可以满足您的需求:

    $ /Developer/MonoTouch/usr/bin/btouch Node.cs -x:Extensions.cs  
    $ ls -l Node.dll 
    -rwxr-xr-x  1 sebastienpouliot  staff  5120 30 Sep 13:30 Node.dll
    

    您的问题是使用 -s,它在将接口编译为部分类(对于扩展方法而言为时过早)并将绑定编译为 .dll 时使用。

    您想要的是 -x,其中源文件仅用于第二次编译(.dll 的源)。 -s 选项对于 枚举 最有用,因为您在界面和最终程序集 (.dll) 中都需要它们

    要获得更多帮助,请执行以下操作:

    /Developer/MonoTouch/usr/bin/btouch --help
    

    【讨论】:

    • 我在帮助中没有看到 -x。当我尝试使用它时,我也收到一个错误:错误 CS2007: Unrecognized command-line option: `-x:Extensions.cs'
    • $ /Developer/MonoTouch/usr/bin/mtouch --version mtouch 4.2.2.1317158288
    • 抱歉,这是一个旧更改(9 月 5 日),但看起来它没有向后移植到 monotouch-4.2 分支。它将在未来的版本中提供(来自“master”)。同时,您可以联系 support@xamarin.com 请求更新该工具的二进制文件(只需链接到这个问题)。
    • 我发布的答案适用于当前发布的内容。当 -x 选项在发布版本中可用时,我会尝试一下,然后更新答案。
    • 当然,只是想帮忙(为你点赞 ;-) 你也可以从源代码构建它,因为 btouch 工具是开源的(查看 'maccore' 模块mono 在 github 上的 GIT 存储库)。见github.com/mono/maccore/blob/master/src/btouch.cs
    【解决方案2】:

    看起来该页面已过时。再做一些搜索,我在论坛中找到了这个post

    编译我上面的例子的正确命令是:

    /Developer/MonoTouch/usr/bin/btouch -v Node.cs --sourceonly genfiles --outdir=gen
    

    接着是:

    /Developer/MonoTouch/usr/bin/smcs -out:Node.dll `cat genfiles` Extensions.cs -r:/Developer/MonoTouch/usr/lib/mono/2.1/monotouch.dll -target:library
    

    【讨论】:

    • 这适用于当前发布的内容。当 -x 选项在已发布版本中可用时,我会尝试一下,然后更新答案。
    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多