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)