У меня есть новая привязка MonoTouch, частично работающая. Но функция переменных аргументов вызывает сбой при запуске. .h файл:VarArgs Binding in MonoTouch/Xamarin.iOS
FOUNDATION_EXPORT void __BFLog(NSInteger lineNumber, NSString *method, NSString *file,
BFLogLevel level, NSString *tag, NSString *format, ...);
C#:
internal static class CFunctions
{
// extern void __BFLog (NSInteger lineNumber, NSString * method,
// NSString * file, BFLogLevel level, NSString * tag, NSString * format, ...);
[DllImport ("__Internal", EntryPoint = "__BFLog")]
internal static extern void BFLog (nint lineNumber, string method, string file,
LogLevel level, string tag, string format, string arg0);
}
Потому что я передам "" в arg0 и действительно передать строку в формате секции. Но при вызове, я вижу эту аварию:
critical: at <unknown> <0xffffffff>
critical: at (wrapper managed-to-native) BugfenderSDK.CFunctions.BFLog (System.nint,string,string,BugfenderSDK.LogLevel,string,string,string) <0xffffffff>
...
Цель Находчивых ставить IntPtr переменных аргументы в качестве последнего аргумента по умолчанию. Я попробовал эту строку arg0 и вместо этого перешел в IntPtr.Zero, но все равно сбой.
EDIT # 1: insteading беспокоиться о первом vararg - я собирался просто передать «» к нему - я последовал за TestFlight binding example ventayol и игнорировали это, только определение формата в DllImport:
[DllImport ("__Internal", EntryPoint = "__BFLog")]
internal static extern void BFLog(
nint lineNumber, /* nint will be marshalled correctly */
IntPtr method, /* NSString must be declared as IntPtr */
IntPtr file, /* NSString */
LogLevel level, /* This may be wrong, depending on the exact LogLevel type */
IntPtr tag, /* NSString */
IntPtr format /* NSString */
);
и обертка:
public static void Log(LogLevel level, nint lineNumber, string method, string file,
string tag, string format, params object[] args)
{
var nsMethod = new NSString (method);
var nsFile = new NSString (file);
var nsTag = new NSString (tag);
string msg = String.Format(format, args);
var nsMsg = new NSString(msg);
BFLog (lineNumber, nsMethod.Handle, nsFile.Handle, level, nsTag.Handle, nsMsg.Handle);
nsMethod.Dispose();
nsFile.Dispose();
nsTag.Dispose();
nsMsg.Dispose();
}
Но я вижу только тег и другие на внутреннем интерфейсе, без сообщения.
Thanks Rolf. Это сработало, за исключением того, что мне трудно получить сообщение в формате format/args. Я предположил, что бэкэнд-библиотека - у меня нет исходного кода - позволит мне просто форматировать = "% s", а затем я могу просто передать сообщение через arg0. Нет кубиков. Но я могу просто использовать тег вместо этого, когда я экспериментирую с этой услугой (http://bugfender.com/). – t9mike