2014-11-10 6 views
0

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 구현을 원래의 C 라이브러리는 PortException 예외를 포착합니다.

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

Xamarin App에서 동일한 예외를 어떻게 잡아 예외를 처리하고 응용 프로그램이 중단되는 것을 막을 수 있습니까?

답변

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] 가장 치명적인 시나리오 외에는 Objective-C 예외를 사용하지 말 것을 강력히 권장합니다. 이유는 우리가 우리의 목적을 해결하는 것이 최우선 과제였던 것입니다.

+0

감사합니다. Rolf. writePort 메소드는 실제로 액세스가 필요한 int를 리턴합니다. 이 상황을 어떻게 처리할까요? – Joseph

+0

함수 시그니처에 'out'매개 변수를 추가하여 오류 코드를 반환 할 수도 있습니다. –