업데이트 된 [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
FieldAttribute에 "__Internal"두 번째 매개 변수가 필요합니까? –
@StephaneDelcroix 예, [바인딩 문서 (필드 섹션)] (http://docs.xamarin.com/guides/ios/advanced_topics/binding_objective-c_libraries#37-binding-fields)에 따르면 : _ 정적으로 연결하는 경우 , 바인딩 할 라이브러리가 없으므로 __Internal name을 사용해야합니다. – Tyson
@StephaneDelcroix 게다가 디버깅 모드를 사용할 때 작동합니다. 당신은 모든 경우에 그것을 깨뜨릴 것이라고 생각할 것입니다. – Tyson