Xamarin: Binding ios protocol / delegate no puede acceder a enum definido en structs.cs

Actualmente estoy en el process de crear ios bindings para la biblioteca EDQueue.

El file Structs.cs ve algo como esto:

 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 } } 

El file ApiDefinition.cs es como:

 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... } 

Tal como está escrito, se produce el siguiente error: Error CS0426: el nombre de tipo 'EDQueueResult' no existe en el tipo 'EDQueue' (CS0426) (EDQueue) en el file EDQueueDelegate.g.cs

Ese file se ve así cuando se lanza el error:

 // // 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 (IsRequinetworking = 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... } 

Sin embargo, si elimino o comento el bit [Protocol, Model] , la biblioteca se comstack sin errores.

También obtengo un error similar si descompozo la segunda function con EDQueueCompletionBlock , que finalmente se basa en la enumeración EDQueueResult .

La Structs.cs de compilation del file Structs.cs se establece en ObjcBindingCoreSource .

Cualquier ayuda es realmente apreciada. ¡Gracias!

Dado que tiene el espacio de nombres EDQueue y el tipo (interfaz) denominado EDQueue : no puede hacer reference a ningún tipo en el espacio de nombres EDQueue con EDQueue.TypeName , por lo que esta statement:

 ReturnType = typeof (EDQueue.EDQueueResult) 

No comstackrá, porque el comstackdor searchá un miembro dentro de la interfaz EDQueue (aunque las interfaces no pueden tener classs secundarias, ni miembros estáticos) y no dentro del espacio de nombres EDQueue .

La forma más obvia de solucionar esto es no tener un espacio de nombre y escribir con el mismo nombre, así que cambie el nombre del espacio de nombre o del nombre.

Si eso no es posible o no está completamente seguro de que no tendrá efectos secundarios, cambie la reference a

 ReturnType = typeof (EDQueueResult) 

y agregue using EDQueue al bloque de usos. Alternativamente, reference como esta:

 ReturnType = typeof (global::EDQueue.EDQueueResult)