다음을 통해 공유


플랫폼 간 앱에서의 네이티브 형식 작업

이 문서에서는 Android 또는 Windows 전화 OS와 같은 비 iOS 디바이스와 코드를 공유하는 플랫폼 간 애플리케이션에서 새로운 iOS 통합 API 네이티브 형식(nint, nuint, nfloat)을 사용하는 방법에 대해 설명합니다.

64 형식 네이티브 형식은 iOS 및 Mac API에서 작동합니다. Android 또는 Windows에서도 실행되는 공유 코드를 작성하는 경우 통합 형식을 공유할 수 있는 일반 .NET 형식으로 변환하는 작업을 관리해야 합니다.

이 문서에서는 공유/일반 코드에서 통합 API와 상호 운용하는 다양한 방법을 설명합니다.

네이티브 형식을 사용하는 경우

Xamarin.iOS 및 Xamarin.Mac 통합 API에는 여전히 데이터 uint 형식 SizeFRectangleFPointFfloat 형식이 포함int됩니다. 이러한 기존 데이터 형식은 모든 공유 플랫폼 간 코드에서 계속 사용해야 합니다. 새 네이티브 데이터 형식은 아키텍처 인식 형식에 대한 지원이 필요한 Mac 또는 iOS API를 호출할 때만 사용해야 합니다.

공유되는 코드의 특성에 따라 플랫폼 간 코드에서 데이터 형식을 처리 nintnuintnfloat 해야 하는 경우가 있을 수 있습니다. 예를 들어 이전에 Xamarin.iOS와 Xamarin.Android 버전의 앱 간에 기능을 공유하는 데 사용 System.Drawing.RectangleF 했던 직사각형 데이터에 대한 변환을 처리하는 라이브러리는 iOS에서 네이티브 형식을 처리하도록 업데이트해야 합니다.

이러한 변경 내용을 처리하는 방법은 다음 섹션에서 볼 수 있듯이 애플리케이션의 크기와 복잡성 및 사용된 코드 공유 형식에 따라 달라집니다.

코드 공유 고려 사항

코드 공유 옵션 문서에 설명된 대로 플랫폼 간 프로젝트 간에 코드를 공유하는 두 가지 기본 방법이 있습니다. 공유 프로젝트와 이식 가능한 클래스 라이브러리. 사용된 두 가지 형식 중 플랫폼 간 코드에서 네이티브 데이터 형식을 처리할 때 사용할 수 있는 옵션이 제한됩니다.

이식 가능한 클래스 라이브러리 프로젝트

PCL(이식 가능한 클래스 라이브러리)을 사용하면 지원하려는 플랫폼을 대상으로 지정하고 인터페이스를 사용하여 플랫폼별 기능을 제공할 수 있습니다.

PCL 프로젝트 형식이 a .DLL 로 컴파일되고 통합 API를 인식할 수 없으므로 PCL 소스 코드에서 기존 데이터 형식(int, uint, float)을 계속 사용하고 프런트 엔드 애플리케이션에서 PCL의 클래스 및 메서드에 대한 호출을 캐스팅해야 합니다. 예시:

using NativePCL;
...

CGRect rect = new CGRect (0, 0, 200, 200);
Console.WriteLine ("Rectangle Area: {0}", Transformations.CalculateArea ((RectangleF)rect));

공유 프로젝트

공유 자산 프로젝트 유형을 사용하면 개별 플랫폼별 프런트 엔드 앱에 포함 및 컴파일되는 별도의 프로젝트에서 소스 코드를 구성하고 필요에 따라 컴파일러 지시문을 사용하여 #if 플랫폼별 요구 사항을 관리할 수 있습니다.

공유 코드를 사용하는 프런트 엔드 모바일 애플리케이션의 크기 및 복잡성과 공유되는 코드의 복잡성은 플랫폼 간 공유 자산 프로젝트에서 네이티브 데이터 형식에 대한 지원 방법을 선택할 때 고려해야 합니다.

이러한 요인에 따라 컴파일러 지시문을 사용하여 if __UNIFIED__ ... #endif 다음 유형의 솔루션을 구현하여 코드에 대한 Unified API 관련 변경 내용을 처리할 수 있습니다.

중복 메서드 사용

위에서 제공된 사각형 데이터에 대해 변환을 수행하는 라이브러리의 예를 들어 보세요. 라이브러리에 매우 간단한 메서드가 하나 또는 두 개만 포함된 경우 Xamarin.iOS 및 Xamarin.Android에 대해 이러한 메서드의 중복 버전을 만들도록 선택할 수 있습니다. 예시:

using System;
using System.Drawing;

#if __UNIFIED__
using CoreGraphics;
#endif

namespace NativeShared
{
    public class Transformations
    {
        #region Constructors
        public Transformations ()
        {
        }
        #endregion

        #region Public Methods
        #if __UNIFIED__
            public static nfloat CalculateArea(CGRect rect) {

                // Calculate area...
                return (rect.Width * rect.Height);

            }
        #else
            public static float CalculateArea(RectangleF rect) {

                // Calculate area...
                return (rect.Width * rect.Height);

            }
        #endif
        #endregion
    }
}

위의 코드에서는 루틴이 매우 간단하기 때문에 CalculateArea 조건부 컴파일을 사용하고 별도의 통합 API 버전을 만들었습니다. 반면, 라이브러리에 많은 루틴 또는 여러 복잡한 루틴이 포함된 경우 수정 또는 버그 수정을 위해 모든 메서드를 동기화 상태로 유지하는 문제가 발생하므로 이 솔루션은 불가능합니다.

메서드 오버로드 사용

이 경우 솔루션은 32비트 데이터 형식을 사용하여 메서드의 오버로드 버전을 만들어 이제 매개 변수 및/또는 반환 값으로 사용하고 CGRect , 해당 값을 RectangleF 변환하고(변환이 손실된 변환 nfloatfloat 임을 알고 있음) 루틴의 원래 버전을 호출하여 실제 작업을 수행하는 것입니다. 예시:

using System;
using System.Drawing;

#if __UNIFIED__
using CoreGraphics;
#endif

namespace NativeShared
{
    public class Transformations
    {
        #region Constructors
        public Transformations ()
        {
        }
        #endregion

        #region Public Methods
        #if __UNIFIED__
            public static nfloat CalculateArea(CGRect rect) {

                // Call original routine to calculate area
                return (nfloat)CalculateArea((RectangleF)rect);

            }
        #endif

        public static float CalculateArea(RectangleF rect) {

            // Calculate area...
            return (rect.Width * rect.Height);

        }

        #endregion
    }
}

정밀도 손실이 애플리케이션의 특정 요구 사항에 대한 결과에 영향을 주지 않는 한 이는 좋은 솔루션입니다.

별칭 지시문 사용

정밀도 손실이 문제가 되는 영역의 경우 다른 가능한 해결 방법은 다음 코드를 공유 소스 코드 파일의 맨 위에 포함하고 필요한 intfloatuint 값을 또는 값으로 변환하여 Native 및 CoreGraphics 데이터 형식에 대한 별칭을 만드는 데 지시문을 사용하는 using 것입니다.nintnuintnfloat

#if __UNIFIED__
    // Mappings Unified CoreGraphic classes to MonoTouch classes
    using RectangleF = global::CoreGraphics.CGRect;
    using SizeF = global::CoreGraphics.CGSize;
    using PointF = global::CoreGraphics.CGPoint;
#else
    // Mappings Unified types to MonoTouch types
    using nfloat = global::System.Single;
    using nint = global::System.Int32;
    using nuint = global::System.UInt32;
#endif

그러면 예제 코드가 다음과 같이 됩니다.

using System;
using System.Drawing;

#if __UNIFIED__
    // Map Unified CoreGraphic classes to MonoTouch classes
    using RectangleF = global::CoreGraphics.CGRect;
    using SizeF = global::CoreGraphics.CGSize;
    using PointF = global::CoreGraphics.CGPoint;
#else
    // Map Unified types to MonoTouch types
    using nfloat = global::System.Single;
    using nint = global::System.Int32;
    using nuint = global::System.UInt32;
#endif

namespace NativeShared
{

    public class Transformations
    {
        #region Constructors
        public Transformations ()
        {
        }
        #endregion

        #region Public Methods
        public static nfloat CalculateArea(RectangleF rect) {

            // Calculate area...
            return (rect.Width * rect.Height);

        }
        #endregion
    }
}

여기서는 표준 float대신 반환하도록 메서드를 nfloat 변경 CalculateArea 했습니다. 계산 결과를 암시적으로 변환 nfloat 하는 컴파일 오류가 발생하지 않도록 했습니다(곱되는 두 값이 모두 형식nfloat이기 때문에)float.

코드가 통합되지 않은 API 디바이스 using nfloat = global::System.Single; 에서 컴파일되고 실행되는 경우 이 코드는 사용 중인 프런트 엔드 애플리케이션이 수정 없이 메서드를 호출 CalculateAreafloat 수 있도록 암시적으로 변환되는 디바이스에 매핑 nfloatSingle 됩니다.

프런트 엔드 앱에서 형식 변환 사용

프런트 엔드 애플리케이션이 공유 코드 라이브러리를 몇 개만 호출하는 경우 다른 솔루션은 라이브러리를 변경하지 않고 기존 루틴을 호출할 때 Xamarin.iOS 또는 Xamarin.Mac 애플리케이션에서 형식 캐스팅을 수행하는 것입니다. 예시:

using NativeShared;
...

CGRect rect = new CGRect (0, 0, 200, 200);
Console.WriteLine ("Rectangle Area: {0}", Transformations.CalculateArea ((RectangleF)rect));

소비하는 애플리케이션이 공유 코드 라이브러리를 수백 번 호출하는 경우 이 작업은 좋은 솔루션이 아닐 수 있습니다.

애플리케이션의 아키텍처에 따라 플랫폼 간 코드에서 네이티브 데이터 형식(필요한 경우)을 지원하기 위해 위의 솔루션 중 하나 이상을 사용할 수 있습니다.

Xamarin.Forms 애플리케이션

통합 API 애플리케이션과 공유되는 플랫폼 간 UI에 Xamarin.Forms를 사용하려면 다음이 필요합니다.

  • 전체 솔루션은 Xamarin.Forms NuGet 패키지 버전 1.3.1 이상이어야 합니다.
  • Xamarin.iOS 사용자 지정 렌더링의 경우 UI 코드가 공유된 방법(공유 프로젝트 또는 PCL)에 따라 위에 표시된 것과 동일한 유형의 솔루션을 사용합니다.

표준 플랫폼 간 애플리케이션과 마찬가지로 대부분의 경우 기존 32비트 데이터 형식을 모든 공유 플랫폼 간 코드에서 사용해야 합니다. 새 네이티브 데이터 형식은 아키텍처 인식 형식에 대한 지원이 필요한 Mac 또는 iOS API를 호출할 때만 사용해야 합니다.

자세한 내용은 기존 Xamarin.Forms 앱 업데이트 설명서를 참조하세요.

요약

이 문서에서는 통합 API 애플리케이션에서 네이티브 데이터 형식을 사용하는 시기와 플랫폼 간 의미를 확인했습니다. 플랫폼 간 라이브러리에서 새 네이티브 데이터 형식을 사용해야 하는 상황에서 사용할 수 있는 몇 가지 솔루션을 제시했습니다. 또한 Xamarin.Forms 플랫폼 간 애플리케이션에서 통합 API를 지원하는 빠른 가이드를 살펴보았습니다.