c# ios xamarin binding xamarin.ios

c# - Xamarin: el protocolo/delegado ios de enlace no puede acceder a enum definido en structs.cs



binding xamarin.ios (1)

Actualmente estoy en el proceso de crear enlaces ios para la biblioteca EDQueue.

El archivo Structs.cs ve así:

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 archivo ApiDefinition.cs es algo así 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 tipo de nombre ''EDQueueResult'' no existe en el tipo ''EDQueue'' (CS0426) (EDQueue) en el archivo EDQueueDelegate.g.cs

Ese archivo se ve así cuando se produce 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 (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... }

Sin embargo, si elimino o comentario el bit [Protocol, Model] , la biblioteca se genera sin error.

También recibo un error similar si elimino el comentario de la segunda función con EDQueueCompletionBlock , que finalmente depende de la enumeración EDQueueResult .

La Structs.cs de compilación del archivo Structs.cs se establece en ObjcBindingCoreSource .

Cualquier ayuda es realmente apreciada. ¡Gracias!


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

ReturnType = typeof (EDQueue.EDQueueResult)

No compilará, porque el compilador buscará un miembro dentro de la interfaz EDQueue (aunque las interfaces no pueden tener clases secundarias, ni miembros estáticos) y no dentro del espacio de nombres EDQueue .

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

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

ReturnType = typeof (EDQueueResult)

y agregue using EDQueue al bloque usings. Alternativamente, haga referencia de esta manera:

ReturnType = typeof (global::EDQueue.EDQueueResult)