我已将Star Micronics SDK绑定到我的Xamarin应用程序。我的应用程序随机崩溃,但出现以下错误:
SIGABRT - 'PortException', reason: 'Native WritePort failed'
我的绑定方法如下:
[BaseType (typeof (NSObject))]
public partial interface SMPort {
//...
[Export ("writePort:::")]
Int32 WritePort (IntPtr writeBuffer, int offSet, int size);
}
我用它来称呼它:
private static void Print(NSMutableData commandsToPrint) {
try {
//...
int count = printerPort.WritePort (test, 0, Convert.ToInt32(dataBytes.Length));
} catch (Exception e) {
//...
} finally {
//Release the port
SMPort.ReleasePort (printerPort);
}
原始C库的Objective-C实现捕获了一个PortException异常:
@try
{
[starPort writePort:dataToSentToPrinter :totalAmountWritten :remaining];
}
@catch (PortException *exception)
{
//...
}
@finally
{
//...
}
如何在我的Xamarin应用程序中捕获相同的异常,以便我可以处理异常并阻止应用程序崩溃?
答案 0 :(得分:0)
从托管代码捕获Objetive-C异常不是受支持的方案[1],有时可能有效,有时则无法使用。
在您的特定情况下,最简单的解决方案是将第三方本机库包装在另一个库中(您自己编写),这会将Objective-C异常转换为任何其他错误报告机制(返回错误代码)实例)。
所以在C中你有类似的东西:
int call_writeport (SMPort *starPort, void *dataToSendToPrinter, int totalAmountWritten, int remaining)
{
@try
{
[starPort writePort:dataToSentToPrinter :totalAmountWritten :remaining];
return 0;
}
@catch (PortException *exception)
{
return 1;
}
}
在C#中你可以将它绑定为DllImport:
[DllImport ("__Internal")]
static extern int call_writeport (SMPort port, IntPtr writeBuffer, int offset, int size);
和用法:
if (call_writeport (port.Handle, writeBuffer, offset, size) != 0)
Console.WriteLine ("Writing to port failed");
我选择编写C方法(并使用P / Invoke进行绑定)是任意的,您可以轻松地创建一个Objective-C类并将其绑定到绑定项目中。
[1] Apple强烈建议不要使用Objective-C异常,除了最致命的情况之外,这就是为什么我们没有优先考虑我们的最终目的。