바인딩 문제 해결
Xamarin.Mac에서 macOS(이전의 OS X) API에 대한 바인딩 문제를 해결하기 위한 몇 가지 팁입니다.
바인딩 누락
Xamarin.Mac은 대부분의 Apple API를 다루지만, 바인딩이 아직 없는 일부 Apple API를 호출해야 할 수도 있습니다. 다른 경우에는 Xamarin.Mac 바인딩의 범위를 벗어나는 타사 C/Objective-C 를 호출해야 합니다.
Apple API를 처리하는 경우 첫 번째 단계는 Xamarin에게 아직 적용 범위가 없는 API 섹션을 타격하고 있음을 알리는 것입니다. 누락된 API를 나타내는 버그 를 제출합니다. 고객의 보고서를 사용하여 다음에 작업할 API의 우선 순위를 지정합니다. 또한 비즈니스 또는 엔터프라이즈 라이선스가 있고 바인딩이 부족하여 진행 상황을 차단하는 경우 지원의 지침에 따라 티켓을 제출합니다. 바인딩을 약속할 수는 없지만 경우에 따라 해결해 줄 수 있습니다.
누락된 바인딩을 Xamarin에 알리면(해당하는 경우) 다음 단계는 바인딩을 직접 고려하는 것입니다. 여기에 전체 가이드가 있으며 바인딩을 직접 래핑 Objective-C 하기 위한 몇 가지 비공식 설명서가 있습니다. C API를 호출하는 경우 C#의 P/Invoke 메커니즘을 사용할 수 있습니다. 설명서는 다음과 같습니다.
직접 바인딩 작업을 하기로 결정한 경우 바인딩의 실수가 네이티브 런타임에서 모든 종류의 흥미로운 충돌을 생성할 수 있다는 점에 유의하세요. 특히 C#의 서명은 인수 수와 각 인수의 크기로 네이티브 서명과 일치해야 합니다. 이렇게 하지 않으면 메모리 및/또는 스택이 손상될 수 있으며, 즉시 또는 미래의 임의 지점에서 충돌하거나 데이터가 손상될 수 있습니다.
바인딩에 null을 전달할 때의 인수 예외
Xamarin은 Apple API에 대해 고품질의 잘 테스트된 바인딩을 제공하기 위해 노력하고 있지만 때로는 실수와 버그가 미끄러집니다. 지금까지 발생할 수 있는 가장 일반적인 문제는 기본 API가 수락할 때 null을 전달할 때 throw하는 ArgumentNullException
API입니다 nil
. API를 정의하는 네이티브 헤더 파일은 종종 Nil을 허용하는 API와 전달하면 충돌이 발생하는 충분한 정보를 제공하지 않습니다.
전달 null
이 throw되지만 작동해야 한다고 생각되는 경우 다음 단계를 수행합니다 ArgumentNullException
.
- Apple 설명서 및/또는 예제를 확인하여 동의한다는 증거를 찾을 수 있는지 확인합니다
nil
. 익숙한 Objective-C경우 작은 테스트 프로그램을 작성하여 확인할 수 있습니다. - 버그를 제출합니다.
- 버그를 해결할 수 있나요? API를
null
호출하지 않을 수 있는 경우 호출에 대한 간단한 null 검사 쉽게 해결할 수 있습니다. - 그러나 일부 API는 일부 기능을 해제하거나 사용하지 않도록 설정하려면 null을 전달해야 합니다. 이러한 경우 어셈블리 브라우저를 가져오고(지정된 선택기에서 C# 멤버 찾기 참조), 바인딩을 복사하고 null 검사 제거하여 문제를 해결할 수 있습니다. 복사한 바인딩이 Xamarin.Mac에서 수행하는 업데이트 및 수정 사항을 수신하지 않으므로 이 작업을 수행하는 경우 버그(2단계)를 제출해야 하며 이는 단기적인 작업으로 간주되어야 합니다.
버그 보고
Microsoft는 사용자의 의견을 소중하게 생각합니다. Xamarin.Mac에 문제가 있는 경우:
- Xamarin.Mac 포럼 확인
- 문제 리포지토리 검색
- 일치하는 문제를 찾을 수 없는 경우 GitHub 문제 리포지토리에서 새 문제를 제출하세요.
GitHub 문제는 모두 공용입니다. 설명 또는 첨부 파일을 숨길 수 없습니다.
다음 정보를 가능한 많이 포함하세요.
- 문제를 재현하는 간단한 예제. 문제를 재현할 수 있다면 매우 유용합니다.
- 크래시의 전체 스택 추적.
- 크래시 주변의 C# 코드.