Xamarin:绑定ios协议/委托无法访问structs.cs

时间:2017-05-14 17:16:03

标签: c# ios xamarin binding xamarin.ios

我目前正在为EDQueue library.

创建ios绑定

Structs.cs文件看起来像这样:

using System;
using ObjCRuntime;

namespace EDQueue
{


    // => Enums attributed with[NativeAttribute] must have an underlying type of `long` or `ulong`
    [Native]
    public enum EDQueueResult : long
    {
        Success = 0,
        Fail,
        Critical
    }

}

ApiDefinition.cs文件类似于:

using System;
using Foundation;
using ObjCRuntime;

namespace EDQueue
{
    // typedef void (^EDQueueCompletionBlock)(EDQueueResult);
    delegate void EDQueueCompletionBlock(EDQueueResult result);

    // ETC....

    // @protocol EDQueueDelegate <NSObject>
    [Protocol, Model]
    [BaseType(typeof(NSObject))]
    interface EDQueueDelegate
    {
        // @optional -(EDQueueResult)queue:(EDQueue *)queue processJob:(NSDictionary *)job;
        [Export("queue:processJob:")]
        EDQueueResult Queue(EDQueue queue, NSDictionary job);

        //// @optional -(void)queue:(EDQueue *)queue processJob:(NSDictionary *)job completion:(EDQueueCompletionBlock)block;
        //[Export("queue:processJob:completion:")]
        //void Queue(EDQueue queue, NSDictionary job, EDQueueCompletionBlock completeBlock);

    }

    // ETC...
}

如上所述,产生以下错误: 错误CS0426:文件EDQueueDelegate.g.cs

中的类型名称“EDQueueResult”不存在于“EDQueue”类型(CS0426)(EDQueue)

抛出错误时,该文件如下所示:

//
// Auto-generated from generator.cs, do not edit
//
// We keep references to objects, so warning 414 is expected

#pragma warning disable 414

using System;
using System.Drawing;
using System.Diagnostics;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using UIKit;
using GLKit;
using Metal;
using MapKit;
using ModelIO;
using SceneKit;
using Security;
using AudioUnit;
using CoreVideo;
using CoreMedia;
using QuickLook;
using Foundation;
using CoreMotion;
using ObjCRuntime;
using AddressBook;
using CoreGraphics;
using CoreLocation;
using AVFoundation;
using NewsstandKit;
using CoreAnimation;
using CoreFoundation;

namespace EDQueue {
    [Protocol (Name = "EDQueueDelegate", WrapperType = typeof (EDQueueDelegateWrapper))]
    [ProtocolMember (IsRequired = false, IsProperty = false, IsStatic = false, Name = "Queue", Selector = "queue:processJob:", ReturnType = typeof (EDQueue.EDQueueResult), ParameterType = new Type [] { typeof (global::EDQueue.EDQueue), typeof (NSDictionary) }, ParameterByRef = new bool [] { false, false })]
    public interface IEDQueueDelegate : INativeObject, IDisposable
    {
    }
// ETC...
}

但是,如果我删除或注释掉[Protocol, Model]位,则构建库时没有错误。

如果我使用EDQueueCompletionBlock取消注释第二个函数,我也会收到类似的错误,这最终依赖于EDQueueResult枚举。

Structs.cs文件的构建操作设置为ObjcBindingCoreSource

真的很感激任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

由于您同时拥有名为EDQueue的名称空间EDQueue和类型(接口) - 您无法使用EDQueue引用名称空间EDQueue.TypeName中的任何类型,因此此语句:

ReturnType = typeof (EDQueue.EDQueueResult)

不会编译,因为编译器会在EDQueue接口内搜索成员(即使接口不能有子类,也不能有静态成员),而不能在EDQueue命名空间内。

最明显的解决方法是不要使用具有相同名称的命名空间和类型,因此重命名命名空间或类型名称。

如果无法做到或者您不完全确定它不会产生副作用 - 请更改对

的引用
ReturnType = typeof (EDQueueResult)

并将using EDQueue添加到usings块。或者,参考如下:

ReturnType = typeof (global::EDQueue.EDQueueResult)