Привязка iOS Framework приводит к повреждению временных файлов
У меня есть довольно массивный iOS Framework для привязки. Эта структура зависит от двух других.
Я создал проект привязки, успешно сгенерировал файл ApiDefinitions.cs и StructsAndEnums.cs. Все идет нормально.
Теперь, когда я пытаюсь построить его в режиме отладки, я получаю более 30 ошибок, связанных с синтаксическими проблемами во временных файлах.
Эти ошибки возникают только в файлах Trampolines.g.cs и SupportDelegates.g.cs. Наихудшим из них является файл SupportDelegates.g.cs, который выглядит следующим образом:
//
// 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 Photos;
using ModelIO;
using SceneKit;
using Contacts;
using Security;
using Messages;
using AudioUnit;
using CoreVideo;
using CoreMedia;
using QuickLook;
using CoreImage;
using SpriteKit;
using Foundation;
using CoreMotion;
using ObjCRuntime;
using AddressBook;
using MediaPlayer;
using GameplayKit;
using CoreGraphics;
using CoreLocation;
using AVFoundation;
using NewsstandKit;
using FileProvider;
using CoreAnimation;
using CoreFoundation;
namespace System.Action`1[[Foundation.NSString, Xamarin.iOS, Version=0.0.0 {
public delegate void 0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065]] (NSString obj);
}
Файл Trampolines.g.cs генерируется почти полностью, но такая же проблема возникает в середине сгенерированного кода C#:
static internal class SDActionArity2V1 {
static internal readonly DActionArity2V1 Handler = Invoke;
[MonoPInvokeCallback (typeof (DActionArity2V1))]
static unsafe void Invoke (IntPtr block, IntPtr arg1, IntPtr arg2) {
var descriptor = (BlockLiteral *) block;
var del = (global::System.Action<NSString, global::System.Action<NSString>>) (descriptor->Target);
if (del != null)
del ( Runtime.GetNSObject<NSString> (arg1), (System.Action`1[Foundation.NSString]) Marshal.GetDelegateForFunctionPointer (arg2, typeof (System.Action`1[Foundation.NSString])));
}
}
Некоторые другие связывающие проекты генерируют файлы такого же типа, и кажется, что все работает нормально, поэтому я действительно пытаюсь найти причину этого.
Есть идеи?
РЕДАКТИРОВАТЬ: Чтобы дать больше информации здесь сгенерированное определение интерфейса https://gist.github.com/Miiite/367e17335431e932acdc92c65b504bd4
РЕДАКТИРОВАТЬ 2: Вот то, что шулер генерируется как вывод журнала https://gist.github.com/Miiite/e272622df2e853d53f1add4c8eb4eabf
2 ответа
Я считаю, что проблема здесь:
void PresentCheckoutForSubmittingTransactionCompletionHandler(Action<OPPTransaction, NSError> completionHandler, [NullAllowed] Action<NSString, Action<NSString>> paymentBrandSelectedHandler, [NullAllowed] Action cancelHandler);
Я думаю, что действие внутри действия вызывает проблему, генератор может не поддерживать это, поэтому вам может понадобиться найти другой способ связывания этого.
Этот проблемный метод определенно может быть связан, если вам нужно, вот как (для краткости я опускаю остальных членов класса):
delegate void OPPPaymentBrandSelectedHandler (string paymentBrand, [BlockCallback] OPPPaymentCompletionHandler completionHandler);
delegate void OPPPaymentCompletionHandler ([NullAllowed] string checkoutId);
[BaseType (typeof (NSObject))]
interface OPPCheckoutProvider {
// -(void)presentCheckoutForSubmittingTransactionCompletionHandler:(void (^ _Nonnull)(OPPTransaction * _Nullable, NSError * _Nullable))completionHandler
// paymentBrandSelectedHandler:(void (^ _Nullable)(NSString * _Nonnull, void (^ _Nonnull)(NSString * _Nullable)))paymentBrandSelectedHandler
// cancelHandler:(void (^ _Nullable)(void))cancelHandler;
[Export("presentCheckoutForSubmittingTransactionCompletionHandler:paymentBrandSelectedHandler:cancelHandler:")]
void PresentCheckoutForSubmittingTransactionCompletionHandler(Action<OPPTransaction, NSError> completionHandler, [NullAllowed] OPPPaymentBrandSelectedHandler paymentBrandSelectedHandler, [NullAllowed] Action cancelHandler);
}
Хитрость заключается в том, чтобы вместо использования вложенных Action
s вам нужно разбить его на два делегата и использовать атрибут BlockCallback, чтобы указать генератору, что параметр должен маршалироваться как блок ObjC, а затем просто использовать родительский делегат в качестве типа paymentBrandSelectedHandler
параметр внутри PresentCheckoutForSubmittingTransactionCompletionHandler
метод.
Надеюсь, это поможет вам полностью разблокироваться. Тем не менее, мы должны сообщить о гораздо лучшей ошибке, я буду обсуждать с командой и посмотрим.
Ура!