2013-03-01 5 views
0

업데이트 된 [Field] 바인딩을 사용하여 업데이트 된 ZBar MonoTouch 바인딩 dll 인 following up on this answer here from a while ago을 성공적으로 만들었습니다 (이전에는 NSString의 값을 복제했습니다. 바인딩 dll).MonoTouch는 Release 빌드에서 null을 반환하는 NSString 필드에 바인딩합니다.

바인딩 dll은 정상적으로 컴파일됩니다 (릴리스 모드에서 컴파일 됨).

내 응용 프로그램의 바인딩 ZBar.dll을 사용하면 디버그 빌드에서 정상적으로 작동하여 기본 lib에서 올바른 NSString 값을 반환합니다. 그러나 릴리스 빌드에서는 항상 null을 반환합니다.

디버거와 릴리스 빌드 모두에 대해 모든 어셈블리를 제거하도록 링커 동작을 설정 했으므로 링커에서 아무 것도 제거하지 않아도됩니다.

릴리스 용 LLVM 컴파일러를 끄고 릴리스 빌드에서 null을 반환합니다. 그러나 릴리스 빌드에서 디버깅을 사용하면 해결됩니다 (분명히 해결책은 아닙니다).

을 Heres 바인딩 코드 : 여기

[Static] 
interface ZBarSDK 
{ 
    // extern NSString* const ZBarReaderControllerResults; 
    [Field ("ZBarReaderControllerResults", "__Internal")] 
    NSString BarcodeResultsKey { get; } 
} 

그리고는 (MonoDevelop에 따르면)를 디 컴파일 IL있어 :

namespace ZBar 
{ 
    public static class ZBarSDK 
    { 
     [CompilerGenerated] 
     private static NSString _BarcodeResultsKey; 

     [CompilerGenerated] 
     private static readonly IntPtr __Internal_libraryHandle = Dlfcn.dlopen(null, 0); 

     public static NSString BarcodeResultsKey 
     { 
      get 
      { 
       if (ZBarSDK._BarcodeResultsKey == null) 
       { 
        ZBarSDK._BarcodeResultsKey = Dlfcn.GetStringConstant(ZBarSDK.__Internal_libraryHandle, "ZBarReaderControllerResults"); 
       } 
       return ZBarSDK._BarcodeResultsKey; 
      } 
     } 
    } 
} 

Monotouch : 6.0.10

+0

FieldAttribute에 "__Internal"두 번째 매개 변수가 필요합니까? –

+0

@StephaneDelcroix 예, [바인딩 문서 (필드 섹션)] (http://docs.xamarin.com/guides/ios/advanced_topics/binding_objective-c_libraries#37-binding-fields)에 따르면 : _ 정적으로 연결하는 경우 , 바인딩 할 라이브러리가 없으므로 __Internal name을 사용해야합니다. – Tyson

+0

@StephaneDelcroix 게다가 디버깅 모드를 사용할 때 작동합니다. 당신은 모든 경우에 그것을 깨뜨릴 것이라고 생각할 것입니다. – Tyson

답변

3

가 추가 엠 터치 인수이 추가 프로젝트의 iOS 빌드 옵션 페이지 :

--nosymbolstrip=ZBarReaderControllerResults 

디버그 빌드와 릴리스 빌드의 차이점은 릴리스 빌드가 제거되어 필드의 심볼이 제거되므로 런타임에 Xamarin.iOS가 심볼을 찾을 수 없다는 것입니다. 이 옵션을 사용하면 Xamarin.iOS가 기호를 사용하지 않아도 심볼을 유지해야한다는 것을 링커에 알릴 수 있습니다 (런타임시 발생하는 동적 바인딩이기 때문에 기본 strip 도구는 다음을 수행 할 수 없습니다). 필드가 실제로 사용되는지 확인하십시오).

+0

고마워요. 그 약속이 예상됩니다. 내일 시험 할 것입니다. 호기심에서 우리는 어떤 층의 연결 고리를 이야기합니까? 관리되는 일리노이 연결/스트립킹이 아닙니까? 네이티브 심볼이 미리 컴파일 된 네이티브 Zbar lib 파일에서 제거되었다고 말하는가? 나는 MT에서 일어난 일을 몰랐다. 어디에서 문서화되어 있습니까? – Tyson

+0

이것은 네이티브 스트립 도구입니다 (자세한 정보를 보려면 터미널에서'man strip '을 실행하십시오). 이는 기본적으로 Xamarin.iOS가 릴리즈 빌드를 위해 더 작게 만들기 위해 수행됩니다. 차이점을보고 싶다면'--nosymbolstrip' (인수없이)을 mtouch에 넘겨서 이것을 완전히 비활성화 할 수 있습니다. –

+0

괜찮아요, 롤프, 고마워요! 그러나 밑줄 접두사를 제거해야했습니다. 즉,'--nosymbolstrip = ZBarReaderControllerResults'를 사용했습니다. 대답에 오타가 있었습니까? – Tyson