바인딩을 Unified API로 마이그레이션Migrating a Binding to the Unified API

이 문서에서는 Xamarin.ios 및 Xamarin.ios 응용 프로그램에 대 한 통합 Api를 지원 하도록 기존 Xamarin 바인딩 프로젝트를 업데이트 하는 데 필요한 단계를 설명 합니다.This article covers the steps required to update an existing Xamarin Binding Project to support the Unified APIs for Xamarin.IOS and Xamarin.Mac applications.

개요Overview

2 월 1 일부 터 2015를 시작 하려면 iTunes 및 Mac App Store에 대 한 모든 새 제출이 64 비트 응용 프로그램 이어야 합니다.Starting February 1st, 2015 Apple requires that all new submissions to the iTunes and the Mac App Store must be 64 bit applications. 따라서 새 Xamarin.ios 또는 Xamarin.ios 응용 프로그램은 64 비트를 지원 하기 위해 기존 클래식 Monotouch.dialog 및 MonoMac Api 대신 새 Unified API을 사용 해야 합니다.As a result, any new Xamarin.iOS or Xamarin.Mac application will need to be using the new Unified API instead of the existing Classic MonoTouch and MonoMac APIs to support 64 bit.

또한 모든 Xamarin 바인딩 프로젝트는 64 비트 Xamarin.ios 또는 Xamarin.ios 프로젝트에 포함 될 새 통합 Api를 지원 해야 합니다.Additionally, any Xamarin Binding Project must also support the new Unified APIs to be included in a 64 bit Xamarin.iOS or Xamarin.Mac project. 이 문서에서는 Unified API 사용 하도록 기존 바인딩 프로젝트를 업데이트 하는 데 필요한 단계에 대해 설명 합니다.This article will cover the steps required to update an existing binding project to use the Unified API.

요구 사항Requirements

이 문서에 제공 된 단계를 완료 하려면 다음이 필요 합니다.The following is required to complete the steps presented in this article:

  • Mac용 Visual Studio -개발 컴퓨터에 설치 및 구성 된 최신 버전의 Mac용 Visual Studio입니다.Visual Studio for Mac - The latest version of Visual Studio for Mac installed and configured on the development computer.
  • Apple mac -IOS 및 Mac에 대 한 바인딩 프로젝트를 빌드하려면 apple mac이 필요 합니다.Apple Mac - An Apple mac is required to build Binding Projects for iOS and Mac.

Windows 컴퓨터의 Visual studio에서는 바인딩 프로젝트가 지원 되지 않습니다.Binding projects are not supported in Visual studio on a Windows machine.

Using 문 수정Modify the Using Statements

통합 Api를 사용 하면 Mac과 iOS 간에 코드를 보다 쉽게 공유할 수 있을 뿐만 아니라 동일한 이진 파일을 사용 하 여 32 및 64 비트 응용 프로그램을 지원할 수 있습니다.The Unified APIs makes it easier than ever to share code between Mac and iOS as well as allowing you to support 32 and 64 bit applications with the same binary. 네임 스페이스에서 MonoMacmonotouch.dialog 접두사를 삭제 하면 xamarin.ios 및 xamarin.ios 응용 프로그램 프로젝트에서 더 간단한 공유를 얻을 수 있습니다.By dropping the MonoMac and MonoTouch prefixes from the namespaces, simpler sharing is achieved across Xamarin.Mac and Xamarin.iOS application projects.

따라서 using 문에서 MonoMacmonotouch.dialog 접두사를 제거 하려면 바인딩 계약과 바인딩 프로젝트의 기타 .cs 파일을 수정 해야 합니다.As a result we will need to modify any of our binding contracts (and other .cs files in our binding project) to remove the MonoMac and MonoTouch prefixes from our using statements.

예를 들어, 바인딩 계약에서 다음 using 문을 지정 합니다.For example, given the following using statements in a binding contract:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;

MonoTouch 접두사를 제거 하면 다음과 같은 결과가 발생 합니다.We would strip off the MonoTouch prefix resulting in the following:

using System;
using System.Drawing;
using Foundation;
using UIKit;
using ObjCRuntime;

다시, 바인딩 프로젝트의 모든 .cs 파일에 대해이 작업을 수행 해야 합니다.Again, we will need to do this for any .cs file in our binding project. 이 변경 내용이 적용 되 면 다음 단계는 새 네이티브 데이터 형식을 사용 하도록 바인딩 프로젝트를 업데이트 하는 것입니다.With this change in place, the next step is to update our binding project to use the new Native Data Types.

Unified API에 대 한 자세한 내용은 Unified API 설명서를 참조 하세요.For more information on the Unified API, please see the Unified API documentation. 32 및 64 비트 응용 프로그램 지원에 대 한 배경 및 프레임 워크에 대 한 자세한 내용은 32 및 64 비트 플랫폼 고려 사항 설명서를 참조 하세요.For more background on supporting 32 and 64 bit applications and information about frameworks see the 32 and 64 bit Platform Considerations documentation.

네이티브 데이터 형식으로 업데이트Update to Native Data Types

목적-C는 32 비트 시스템의 int32_tNSInteger 데이터 형식을 매핑하고 64 비트 시스템에서 int64_t 합니다.Objective-C maps the NSInteger data type to int32_t on 32 bit systems and to int64_t on 64 bit systems. 이 동작을 일치 시키기 위해 새로운 Unified API int (.NET에서는 항상 System.Int32로 정의 됨)를 새 데이터 형식으로 대체 합니다. System.nint.To match this behavior, the new Unified API replaces the previous uses of int (which in .NET is defined as always being System.Int32) to a new data type: System.nint.

nint 데이터 형식과 함께 Unified API는 NSUIntegerCGFloat 형식에 매핑하기 위한 nuintnfloat 형식을 소개 합니다.Along with the new nint data type, the Unified API introduces the nuint and nfloat types, for mapping to the NSUInteger and CGFloat types as well.

위의 내용을 고려 하 여 API를 검토 하 고 이전에 int에 매핑한 NSInteger, NSUIntegerCGFloat 인스턴스를 새 uint으로 업데이트 해야 float , nuintnfloat 형식.Given the above, we need to review our API and ensure that any instance of NSInteger, NSUInteger and CGFloat that we previously mapped to int, uint and float get updated to the new nint, nuint and nfloat types.

예를 들어 다음과 같은 목표-C 메서드 정의를 가정 합니다.For example, given an Objective-C method definition of:

-(NSInteger) add:(NSInteger)operandUn and:(NSInteger) operandDeux;

이전 바인딩 계약의 정의가 다음과 같은 경우:If the previous binding contract had the following definition:

[Export("add:and:")]
int Add(int operandUn, int operandDeux);

새 바인딩을 다음과 같이 업데이트 합니다.We would update the new binding to be:

[Export("add:and:")]
nint Add(nint operandUn, nint operandDeux);

이전에 연결한 것 보다 최신 버전의 타사 라이브러리에 매핑하는 경우 라이브러리에 대 한 .h 헤더 파일을 검토 하 고 int, int32_t에 대 한 명시적 호출이 있는지 확인 해야 unsigned int, uint32_t 또는 float NSInteger, NSUInteger 또는 CGFloat로 업그레이드 되었습니다.If we are mapping to a newer version 3rd party library than what we had initially linked to, we need to review the .h header files for the library and see if any exiting, explicit calls to int, int32_t, unsigned int, uint32_t or float have been upgraded to be an NSInteger, NSUInteger or a CGFloat. 그렇다면 nint, nuintnfloat 형식도 동일한 수정 작업을 수행 해야 합니다.If so, the same modifications to the nint, nuint and nfloat types will need to be made to their mappings as well.

이러한 데이터 형식 변경에 대해 자세히 알아보려면 네이티브 형식 문서를 참조 하세요.To learn more about these data type changes, see the Native Types document.

CoreGraphics 형식 업데이트Update the CoreGraphics Types

CoreGraphics 사용 되는 점, 크기 및 사각형 데이터 형식은 실행 중인 장치에 따라 32 또는 64 비트를 사용 합니다.The point, size and rectangle data types that are used with CoreGraphics use 32 or 64 bits depending on the device they are running on. Xamarin에서 원래 iOS 및 Mac Api를 바인딩한 경우 System.Drawing의 데이터 형식과 일치 하는 기존 데이터 구조를 사용 했습니다 (예:RectangleF).When Xamarin originally bound the iOS and Mac APIs we used existing data structures that happened to match the data types in System.Drawing (RectangleF for example).

64 비트와 새로운 네이티브 데이터 형식을 지원 하기 위한 요구 사항으로 인해 CoreGraphic 메서드를 호출할 때 기존 코드를 다음과 같이 조정 해야 합니다.Because of the requirements to support 64 bits and the new native data types, the following adjustments will need to be made to existing code when calling CoreGraphic methods:

  • CGRect -부동 소수점 사각형 영역을 정의할 때 RectangleF 대신 CGRect를 사용 합니다.CGRect - Use CGRect instead of RectangleF when defining floating point rectangular regions.
  • CGSize -부동 소수점 크기 (너비 및 높이)를 정의할 때 SizeF 대신 CGSize를 사용 합니다.CGSize - Use CGSize instead of SizeF when defining floating point sizes (width and height).
  • CGPoint -부동 소수점 위치 (X 및 Y 좌표)를 정의할 때 PointF 대신 CGPoint를 사용 합니다.CGPoint - Use CGPoint instead of PointF when defining a floating point location (X and Y coordinates).

위의 내용을 고려 하 여 API를 검토 하 고 이전에 RectangleF에 바인딩된 CGRect, CGSize 또는 CGPoint 인스턴스를 네이티브 형식으로 변경 해야 SizeF , CGSize 또는 CGPoint 직접.Given the above, we will need to review our API and ensure that any instance of CGRect, CGSize or CGPoint that was previously bound to RectangleF, SizeF or PointF be changed to the native type CGRect, CGSize or CGPoint directly.

예를 들어의 목적-C 이니셜라이저가 제공 됩니다.For example, given an Objective-C initializer of:

- (id)initWithFrame:(CGRect)frame;

이전 바인딩에는 다음 코드가 포함 되어 있습니다.If our previous binding included the following code:

[Export ("initWithFrame:")]
IntPtr Constructor (RectangleF frame);

해당 코드를 다음으로 업데이트 합니다.We would update that code to:

[Export ("initWithFrame:")]
IntPtr Constructor (CGRect frame);

이제 모든 코드를 변경 하 여 바인딩 프로젝트를 수정 하거나 통합 된 Api에 바인딩하기 위해 파일을 만들어야 합니다.With all of the code changes now in place, we need to modify our binding project or make file to bind against the Unified APIs.

바인딩 프로젝트 수정Modify the Binding Project

통합 Api를 사용 하도록 바인딩 프로젝트를 업데이트 하는 마지막 단계로, 프로젝트를 빌드하는 데 사용 하는 MakeFile를 수정 하거나 (Mac용 Visual Studio 내에서 바인딩하는 경우), 클래식 Api 대신 통합 된 Api입니다.As the final step to updating our binding project to use the Unified APIs, we need to either modify the MakeFile that we use to build the project or the Xamarin Project Type (if we are binding from within Visual Studio for Mac) and instruct btouch to bind against the Unified APIs instead of the Classic ones.

메이크파일 업데이트Updating a MakeFile

메이크파일을 사용 하 여 Xamarin에 바인딩 프로젝트를 빌드하는 경우 DLL에서는 --new-style 명령줄 옵션을 포함 하 고 btouch대신 btouch-native를 호출 해야 합니다.If we are using a makefile to build our binding project into a Xamarin .DLL, we will need to include the --new-style command line option and call btouch-native instead of btouch.

따라서 다음 MakeFile제공 됩니다.So given the following MakeFile:

BINDDIR=/src/binding
XBUILD=/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
PROJECT_ROOT=XMBindingLibrarySample
PROJECT=$(PROJECT_ROOT)/XMBindingLibrarySample.xcodeproj
TARGET=XMBindingLibrarySample
BTOUCH=/Developer/MonoTouch/usr/bin/btouch

all: XMBindingLibrary.dll

libXMBindingLibrarySample-i386.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphonesimulator -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphonesimulator/lib$(TARGET).a $@

libXMBindingLibrarySample-arm64.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch arm64 -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

libXMBindingLibrarySample-armv7.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch armv7 -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

libXMBindingLibrarySampleUniversal.a: libXMBindingLibrarySample-armv7.a libXMBindingLibrarySample-i386.a libXMBindingLibrarySample-arm64.a
    lipo -create -output $@ $^

XMBindingLibrary.dll: AssemblyInfo.cs XMBindingLibrarySample.cs extras.cs libXMBindingLibrarySampleUniversal.a
    $(BTOUCH) -unsafe -out:$@ XMBindingLibrarySample.cs -x=AssemblyInfo.cs -x=extras.cs --link-with=libXMBindingLibrarySampleUniversal.a,libXMBindingLibrarySampleUniversal.a

clean:
    -rm -f *.a *.dll

btouch 호출에서 btouch-native로 전환 해야 하므로 다음과 같이 매크로 정의를 조정 합니다.We need to switch from calling btouch to btouch-native, so we would adjust our macro definition as follows:

BTOUCH=/Developer/MonoTouch/usr/bin/btouch-native

btouch에 대 한 호출을 업데이트 하 고 --new-style 옵션을 다음과 같이 추가 합니다.We would update the call to btouch and add the --new-style option as follows:

XMBindingLibrary.dll: AssemblyInfo.cs XMBindingLibrarySample.cs extras.cs libXMBindingLibrarySampleUniversal.a
    $(BTOUCH) -unsafe --new-style -out:$@ XMBindingLibrarySample.cs -x=AssemblyInfo.cs -x=extras.cs --link-with=libXMBindingLibrarySampleUniversal.a,libXMBindingLibrarySampleUniversal.a

이제 MakeFile를 정상적으로 실행 하 여 API의 새 64 비트 버전을 빌드할 수 있습니다.We can now execute our MakeFile as normal to build the new 64 bit version of our API.

바인딩 프로젝트 형식 업데이트Updating a Binding Project Type

Mac용 Visual Studio 바인딩 프로젝트 템플릿을 사용 하 여 API를 빌드하는 경우 새 Unified API 버전의 바인딩 프로젝트 템플릿으로 업데이트 해야 합니다.If we are using a Visual Studio for Mac Binding Project Template to build our API, we'll need to update to the new Unified API version of the Binding Project Template. 이 작업을 수행 하는 가장 쉬운 방법은 새 Unified API 바인딩 프로젝트를 시작 하 고 모든 기존 코드 및 설정을 복사 하는 것입니다.The easiest way to do this is to start a new Unified API Binding Project and copy over all of the existing code and settings.

다음을 수행합니다.Do the following:

  1. Mac용 Visual Studio를 시작합니다.Start Visual Studio for Mac.

  2. 파일 > > 솔루션 ...을 선택 합니다.Select File > New > Solution...

  3. 새 솔루션 대화 상자에서 **ios > ** Unified API > ios 바인딩 프로젝트를 선택 합니다.In the New Solution Dialog Box, select iOS > Unified API > iOS Binding Project:

  4. ' 새 프로젝트 구성 ' 대화 상자에서 새 바인딩 프로젝트의 이름을 입력 하 고 확인 단추를 클릭 합니다.On 'Configure your new project' dialog enter a Name for the new binding project and click the OK button.

  5. 바인딩을 만들려는 64 비트 버전의 목표-C 라이브러리를 포함 합니다.Include the 64 bit version of Objective-C library that you are going to be creating bindings for.

  6. ApiDefinition.csStructsAndEnums.cs 파일과 같은 기존 32 비트 Classic API 바인딩 프로젝트에서 소스 코드를 복사 합니다.Copy over the source code from your existing 32 bit Classic API binding project (such as the ApiDefinition.cs and StructsAndEnums.cs files).

  7. 소스 코드 파일에 대해 위에서 언급 한 변경을 수행 합니다.Make the above noted changes to the source code files.

이러한 모든 변경 내용을 적용 하 여 32 비트 버전과 마찬가지로 새 64 비트 버전의 API를 빌드할 수 있습니다.With all of these changes in place, you can build the new 64 bit version of the API as you would the 32 bit version.

요약Summary

이 문서에서는 새로운 통합 Api 및 64 비트 장치를 지원 하기 위해 기존 Xamarin 바인딩 프로젝트에 적용 해야 하는 변경 내용과 새 64 비트 호환 버전의 API를 빌드하는 데 필요한 단계를 보여 줍니다.In this article we have shown the changes that need to be made to an existing Xamarin Binding Project to support the new Unified APIs and 64 bit devices and the steps required to build the new 64 bit compatible version of an API.