2014-11-10 2 views
0

Я связал SDK Star Micronics с моим приложением 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); 
     } 

Реализация Objective-C из оригинальная библиотека C улавливает исключение PortException:

@try 
{ 
    [starPort writePort:dataToSentToPrinter :totalAmountWritten :remaining]; 
} 
@catch (PortException *exception) 
{ 
    //... 
} 
@finally 
{ 
    //... 
} 

Как я могу получить одно и то же исключение в своем приложении Xamarin, поэтому я могу обработать исключение и остановить приложение от сбоя?

ответ

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 для чего угодно, кроме самых фатальных сценариев, поэтому для нас не было высокого приоритета для исправления на нашем конце.

+0

Thanks Rolf. Метод writePort фактически возвращает int, к которому мне нужен доступ. Как бы я справился с этой ситуацией? – Joseph

+0

Вы можете добавить параметр 'out' в подпись функции, чтобы вернуть код ошибки. –

Смежные вопросы