【发布时间】:2015-04-16 01:34:26
【问题描述】:
我有一个新的 MonoTouch 绑定部分工作。但是变量参数函数在运行时会导致崩溃。 .h 文件:
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>
...
Objective Sharpie 默认将 IntPtr varArgs 作为最后一个参数。我尝试了这个字符串 arg0 并改为传入 IntPtr.Zero ,但仍然崩溃。
编辑 #1:不用担心第一个 vararg ——我只是将 "" 传递给它——我按照每个 ventayol 遵循 TestFlight binding example 并忽略了这一点,只在 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 ();
}
但我在后端只看到标签和其他,没有消息。
【问题讨论】:
标签: xamarin xamarin.ios