PCL(이식 가능한 클래스 라이브러리)Portable Class Libraries (PCL)

PCLs (이식 가능한 클래스 라이브러리)는 최신 버전의 Visual Studio에서 더 이상 사용 되지 않는 것으로 간주 됩니다.Portable Class Libraries (PCLs) are considered deprecated in the latest versions of Visual Studio. PCLs를 계속 열고, 편집 하 고, 컴파일할 수는 있지만 새 프로젝트의 경우에는 .NET Standard 라이브러리 를 사용 하 여 더 큰 API 노출 영역에 액세스 하는 것이 좋습니다.While you can still open, edit, and compile PCLs, for new projects it is recommended to use .NET Standard libraries to access a larger API surface area.

플랫폼 간 응용 프로그램을 빌드하는 핵심 구성 요소는 다양 한 플랫폼별 프로젝트에서 코드를 공유할 수 있습니다.A key component of building cross-platform applications is being able to share code across various platform-specific projects. 그러나이는 다른 플랫폼이 .NET BCL (기본 클래스 라이브러리)의 다른 하위 집합을 사용 하는 경우가 많기 때문에 실제로 다른 .NET Core 라이브러리 프로필에 빌드됩니다.However, this is complicated by the fact that different platforms often use a different sub-set of the .NET Base Class Library (BCL), and therefore are actually built to a different .NET Core Library Profile. 즉, 각 플랫폼은 동일한 프로필을 대상으로 하는 클래스 라이브러리만 사용할 수 있으므로 각 플랫폼에 대 한 별도의 클래스 라이브러리 프로젝트를 필요로 하는 것으로 나타납니다.This means that each platform can only use class libraries that are targeted to the same profile so they would appear to require separate class library projects for each platform.

이러한 문제를 해결 하는 코드 공유에는 .NET Standard 프로젝트, 공유 자산 프로젝트PCL (이식 가능한 클래스 라이브러리) 프로젝트의 세 가지 주요 방법이 있습니다.There are three major approaches to code sharing that address this problem: .NET Standard projects, Shared Asset Projects, and Portable Class Library (PCL) projects.

  • .NET Standard 프로젝트 는 .net 코드를 공유 하는 데 선호 되는 방법입니다. .NET Standard 프로젝트 및 Xamarin에 대해 자세히 알아보세요..NET Standard projects are the preferred approach for sharing .NET code, read more about .NET Standard projects and Xamarin.
  • 공유 자산 프로젝트 는 단일 파일 집합을 사용 하 고 솔루션 내에서 코드를 공유 하는 빠르고 간단한 방법을 제공 하며, 일반적으로 조건부 컴파일 지시문을 사용 하 여이를 사용 하는 다양 한 플랫폼에 대 한 코드 경로를 지정 합니다. 정보 공유 프로젝트 문서를 참조 하세요.Shared Asset Projects use a single set of files and offers a quick and simple way in which to share code within a solution and generally employs conditional compilation directives to specify code paths for various platforms that will use it (for more information see the Shared Projects article).
  • PCL 프로젝트는 알려진 BCL 클래스/기능 집합을 지 원하는 특정 프로필을 대상으로 합니다.PCL projects target specific profiles that support a known set of BCL classes/features. 그러나 PCL에서 아래쪽은 프로필 특정 코드를 자체 라이브러리로 분리 하기 위해 추가적인 아키텍처 노력이 필요한 경우가 많습니다.However, the down side to PCL is that they often require extra architectural effort to separate profile specific code into their own libraries.

이 페이지에서는 특정 프로필을 대상으로 하는 PCL 프로젝트를 만드는 방법을 설명 합니다 .이 프로젝트는 여러 플랫폼별 프로젝트에서 참조할 수 있습니다.This page explains how to create a PCL project that targets a specific profile, which can then be referenced by multiple platform-specific projects.

이식 가능한 클래스 라이브러리는 무엇 인가요?What is a Portable Class Library?

응용 프로그램 프로젝트 또는 라이브러리 프로젝트를 만들 때 생성 되는 DLL은 생성 된 특정 플랫폼 에서만 작동 하도록 제한 됩니다.When you create an Application Project or a Library Project, the resulting DLL is restricted to working on the specific platform it is created for. 이렇게 하면 Windows 앱에 대 한 어셈블리를 작성 한 후 Xamarin.ios 및 Xamarin.ios에서 다시 사용할 수 없습니다.This prevents you from writing an assembly for a Windows app, and then re-using it on Xamarin.iOS and Xamarin.Android.

그러나 이식 가능한 클래스 라이브러리를 만들 때 코드를 실행 하려는 플랫폼의 조합을 선택할 수 있습니다.When you create a Portable Class Library, however, you can choose a combination of platforms that you want your code to run on. 이식 가능한 클래스 라이브러리를 만들 때 수행 하는 호환성 선택은 라이브러리에서 지 원하는 플랫폼을 설명 하는 "프로필" 식별자로 변환 됩니다.The compatibility choices you make when creating a Portable Class Library are translated into a “Profile” identifier, which describes which platforms the library supports.

다음 표에서는 .NET 플랫폼에 따라 달라 지는 기능 중 일부를 보여 줍니다.The table below shows some of the features that vary by .NET platform. 특정 장치/플랫폼에서 실행 되도록 보장 되는 PCL 어셈블리를 작성 하려면 프로젝트를 만들 때 필요한 지원을 선택 하면 됩니다.To write a PCL assembly that is guaranteed to run on specific devices/platforms you simply choose which support is required when you create the project.

기능Feature .NET Framework.NET Framework UWP 앱UWP apps SilverlightSilverlight Windows PhoneWindows Phone XamarinXamarin
핵심Core 지원Y 지원Y 지원Y 지원Y 지원Y
LINQLINQ 지원Y 지원Y 지원Y 지원Y 지원Y
IQueryableIQueryable 지원Y 지원Y 지원Y 7.5 이상7.5 + 지원Y
SerializationSerialization 지원Y 지원Y 지원Y 지원Y 지원Y
데이터 주석Data Annotations 4.0.3 +4.0.3 + 지원Y 지원Y 지원Y

Xamarin 열은 Xamarin.ios 및 Xamarin이 Visual Studio와 함께 제공 되는 모든 프로필을 지원 한다는 사실을 반영 하 고 사용자가 만드는 모든 라이브러리의 기능 가용성은 지원 하도록 선택한 다른 플랫폼에 의해서만 제한 됩니다.The Xamarin column reflects the fact that Xamarin.iOS and Xamarin.Android supports all the profiles shipped with Visual Studio, and the availability of features in any libraries you create will only be limited by the other platforms you choose to support.

여기에는 다음과 같은 조합의 프로필이 포함 됩니다.This includes profiles that are combinations of:

  • .NET 4 또는 .NET 4.5.NET 4 or .NET 4.5
  • Silverlight 5Silverlight 5
  • Windows Phone 8Windows Phone 8
  • UWP 앱UWP apps

Microsoft 웹 사이트 에서 다양 한 프로필 기능에 대 한 자세한 내용을 읽고 지원 되는 프레임 워크 정보 및 기타 메모를 포함 하는 다른 커뮤니티 구성원의 PCL 프로필 요약 을 확인할 수 있습니다.You can read more about the different profiles' capabilities on Microsoft’s website and see another community member's PCL profile summary which includes supported framework info and other notes.

혜택Benefits

  1. 중앙 집중식 코드 공유 – 다른 라이브러리나 응용 프로그램에서 사용할 수 있는 단일 프로젝트에서 코드를 작성 하 고 테스트 합니다.Centralized code sharing – write and test code in a single project that can be consumed by other libraries or applications.
  2. 리팩터링 작업은 솔루션에 로드 된 모든 코드 (이식 가능한 클래스 라이브러리 및 플랫폼별 프로젝트)에 영향을 줍니다.Refactoring operations will affect all code loaded in the solution (the Portable Class Library and the platform-specific projects).
  3. PCL 프로젝트는 솔루션의 다른 프로젝트에서 쉽게 참조할 수 있으며, 다른 사용자가 해당 솔루션에서 참조할 수 있도록 출력 어셈블리를 공유할 수 있습니다.The PCL project can be easily referenced by other projects in a solution, or the output assembly can be shared for others to reference in their solutions.

단점Disadvantages

  1. 동일한 이식 가능한 클래스 라이브러리는 여러 응용 프로그램 간에 공유 되므로 플랫폼별 라이브러리를 참조할 수 없습니다 (예:Because the same Portable Class Library is shared between multiple applications, platform-specific libraries cannot be referenced (eg. CsharpSqlite. WP7).Community.CsharpSqlite.WP7).
  2. 이식 가능한 클래스 라이브러리 하위 집합에는 Android 용 Monotouch.dialog 및 Mono (예: DllImport 또는 System.object)에서 사용할 수 있는 클래스가 포함 되지 않을 수 있습니다.The Portable Class Library subset may not include classes that would otherwise be available in both MonoTouch and Mono for Android (such as DllImport or System.IO.File).

참고

이식 가능한 클래스 라이브러리는 최신 버전의 Visual Studio에서 더 이상 사용 되지 않으며 .NET Standard 라이브러리 를 대신 사용 하는 것이 좋습니다.Portable Class Libraries have been deprecated in the latest version of Visual Studio, and .NET Standard Libraries are recommended instead.

일부 익스텐트는 공급자 패턴 또는 종속성 주입을 사용 하 여 이식 가능한 클래스 라이브러리에 정의 된 인터페이스 또는 기본 클래스에 대해 플랫폼 프로젝트의 실제 구현을 코딩 하는 것을 우회할 수 있습니다.To some extent both disadvantages can be circumvented using the Provider pattern or Dependency Injection to code the actual implementation in the platform projects against an interface or base class that is defined in the Portable Class Library.

이 다이어그램에서는 이식 가능한 클래스 라이브러리를 사용 하 여 코드를 공유 하 고 종속성 주입을 사용 하 여 플랫폼 종속 기능을 전달 하는 플랫폼 간 응용 프로그램의 아키텍처를 보여 줍니다.This diagram shows the architecture of a cross-platform application using a Portable Class Library to share code, but also using Dependency Injection to pass in platform-dependent features:

Mac용 Visual Studio 연습Visual Studio for Mac walkthrough

이 섹션에서는 Mac용 Visual Studio를 사용 하 여 이식 가능한 클래스 라이브러리를 만들고 사용 하는 방법을 안내 합니다.This section walks through how to create and use a Portable Class Library using Visual Studio for Mac. 전체 구현은 PCL 예제 섹션을 참조 하세요.Refer the to PCL Example section for a complete implementation.

PCL 만들기Creating a PCL

이식 가능한 클래스 라이브러리를 솔루션에 추가 하는 것은 일반 라이브러리 프로젝트를 추가 하는 것과 매우 비슷합니다.Adding a Portable Class Library to your solution is very similar to adding a regular Library project.

  1. 새 프로젝트 대화 상자에서 다중 플랫폼 > 라이브러리 > 이식 가능한 라이브러리 옵션을 선택 합니다.In the New Project dialog select the Multiplatform > Library > Portable Library option:

    새 PCL 프로젝트 만들기

  2. Mac용 Visual Studio에서 PCL을 만들 때 Xamarin.ios 및 Xamarin.ios에 대해 작동 하는 프로필을 사용 하 여 자동으로 구성 됩니다.When a PCL is created in Visual Studio for Mac it is automatically configured with a Profile that works for Xamarin.iOS and Xamarin.Android. PCL 프로젝트는 다음 스크린샷에 표시 된 것 처럼 표시 됩니다.The PCL project will appear as shown in this screenshot:

    Solution pad의 PCL 프로젝트

이제 PCL에서 코드를 추가할 준비가 되었습니다.The PCL is now ready for code to be added. 다른 프로젝트 (응용 프로그램 프로젝트, 라이브러리 프로젝트 및 기타 PCL 프로젝트) 에서도 참조할 수 있습니다.It can also be referenced by other projects (Application projects, Library projects and even other PCL projects).

PCL 설정 편집Editing PCL settings

이 프로젝트에 대 한 PCL 설정을 확인 하 고 변경 하려면 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 옵션 > > 선택 하 여 다음과 같은 화면을 표시 합니다.To view and change the PCL settings for this project, right-click the project and choose Options > Build > General to see the screen shown here:

프로필을 설정 하는 PCL 프로젝트 옵션PCL Project Options to set the profile

변경 ... 을 클릭 하 여이 이식 가능한 클래스 라이브러리의 대상 프로필을 변경 합니다.Click Change... to alter the target profile for this portable class library.

코드가 PCL에 이미 추가 된 후 프로필이 변경 되 면 코드에서 새로 선택한 프로필에 포함 되지 않은 기능을 참조 하는 경우 라이브러리가 더 이상 컴파일되지 않을 수 있습니다.If the profile is changed after code has already been added to the PCL, it's possible that the library will no longer compile if the code references features that are not part of the newly-selected profile.

PCL 사용Working with a PCL

PCL 라이브러리에서 코드를 작성 하면 Mac용 Visual Studio 편집기에서 선택한 프로필의 제한 사항을 인식 하 여 자동 완성 옵션을 적절 하 게 조정 합니다.When code is written in a PCL library, the Visual Studio for Mac editor will recognize the limitations of the selected profile and adjust auto-complete options accordingly. 예를 들어이 스크린샷은 Mac용 Visual Studio에 사용 된 기본 프로필 (Profile136)을 사용 하 여 System.IO에 대 한 자동 완성 옵션을 보여 줍니다. 사용 가능한 클래스의 절반을 나타내는 스크롤 막대가 표시 됩니다 (실제로는 14 개만 있음). 사용 가능한 클래스).For example, this screenshot shows the auto-complete options for System.IO using the default profile (Profile136) used in Visual Studio for Mac – notice the scrollbar which indicates about half of the available classes are displayed (in fact there are only 14 classes available).

PCL의 System.IO 클래스에 있는 14 개 클래스의Intellisense 목록Intellisense list of 14 classes in the System.IO class of a PCL

System.IO 또는 Xamarin.ios 프로젝트에서 자동 완성을 사용 하는 것과 비교 – PCL 프로필에 없는 FileDirectory와 같은 일반적으로 사용 되는 클래스를 포함 하 여 40 클래스를 사용할 수 있습니다.Compare that with the System.IO auto-complete in a Xamarin.iOS or Xamarin.Android project – there are 40 classes available including commonly used classes like File and Directory which are not in any PCL profile.

.NET Framework System.IO 네임 스페이스의 40 클래스Intellisense 목록Intellisense list of 40 classes in .NET Framework System.IO namespace

이는 PCL 사용의 기본 절충을 반영 합니다. 많은 플랫폼에서 코드를 원활 하 게 공유 하는 기능을 사용 하면 가능한 모든 플랫폼에서 비슷한 구현이 없으므로 특정 Api를 사용할 수 없습니다.This reflects the underlying trade-off of using PCL – the ability to share code seamlessly across many platforms means certain APIs are not available to you because they don’t have comparable implementations across all possible platforms.

PCL 사용Using PCL

PCL 프로젝트를 만든 후에는 일반적으로 참조를 추가 하는 것과 같은 방식으로 호환 되는 응용 프로그램 또는 라이브러리 프로젝트에서 해당 프로젝트에 대 한 참조를 추가할 수 있습니다.Once a PCL project has been created, you can add a reference to it from any compatible Application or Library project in the same way you normally add references. Mac용 Visual Studio에서 참조 노드를 마우스 오른쪽 단추로 클릭 하 고 참조 편집 ...을 선택 하 고 다음과 같이 프로젝트 탭으로 전환 합니다.In Visual Studio for Mac, right-click on the References node and choose Edit References... then switch to the Projects tab as shown:

참조 편집 옵션을 통해 PCL에 참조를 추가Add a reference to a PCL via Edit References option

다음 스크린샷에는 TaskyPortable 샘플 앱에 대 한 Solution pad가 나와 있습니다. 여기에는 PCL 프로젝트의 pcl 라이브러리와 해당 PCL 라이브러리에 대 한 참조가 표시 됩니다.The following screenshot shows the Solution pad for the TaskyPortable sample app, showing the PCL library at the bottom and a reference to that PCL library in the Xamarin.iOS project.

PCL 프로젝트를 보여 주는 TaskyPortable 샘플 솔루션TaskyPortable sample solution showing PCL project

PCL의 출력 (즉, 결과 어셈블리 DLL)을 대부분의 프로젝트에 대 한 참조로 추가할 수도 있습니다.The output from a PCL (ie. the resulting assembly DLL) can also be added as a reference to most projects. 따라서 PCL은 플랫폼 간 구성 요소 및 라이브러리를 제공 하는 이상적인 방법입니다.This makes PCL an ideal way to ship cross-platform components and libraries.

PCL 예PCL example

Taskyportable 샘플 응용 프로그램은 Xamarin에서 이식 가능한 클래스 라이브러리를 사용할 수 있는 방법을 보여 줍니다.The TaskyPortable sample application demonstrates how a Portable Class Library can be used with Xamarin. IOS 및 Android에서 실행 되는 응용 프로그램의 몇 가지 스크린샷:Here are some screenshots of the resulting apps running on iOS and Android:

이 클래스는 단순히 이식 가능한 코드 인 많은 데이터 및 논리 클래스를 공유 하며, SQLite 데이터베이스 구현에 대 한 종속성 주입을 사용 하 여 플랫폼별 요구 사항을 통합 하는 방법도 보여 줍니다.It shares a number of data and logic classes that are purely portable code, and it also demonstrates how to incorporate platform-specific requirements using Dependency Injection for the SQLite database implementation.

솔루션 구조는 아래에 표시 됩니다 (각각 Mac용 Visual Studio 및 Visual Studio).The solution structure is shown below (in Visual Studio for Mac and Visual Studio respectively):

SQLite-NET 코드에는 각 운영 체제에서 각각 다른 운영 체제의 SQLite 구현에 사용할 수 있는 플랫폼별 부분이 있으므로, 이식 가능한 클래스 라이브러리로 컴파일될 수 있는 추상 클래스로 리팩터링 되었습니다. iOS 및 Android 프로젝트에서 서브 클래스로 구현 되는 실제 코드입니다.Because the SQLite-NET code has platform-specific pieces (to work with the SQLite implementations on each different operating system) for demonstration purposes it has been refactored into an abstract class that can be compiled into a Portable Class Library, and the actual code implemented as subclasses in the iOS and Android projects.

TaskyPortableLibraryTaskyPortableLibrary

이식 가능한 클래스 라이브러리는 지원할 수 있는 .NET 기능에서 제한 됩니다.The Portable Class Library is limited in the .NET features that it can support. 이는 여러 플랫폼에서 실행 되도록 컴파일되므로 SQLite-NET에서 사용 되는 [DllImport] 기능을 사용할 수 없습니다.Because it is compiled to run on multiple platforms, it cannot make use of [DllImport] functionality that is used in SQLite-NET. 대신 SQLite-NET은 추상 클래스로 구현 된 다음 나머지 공유 코드를 통해 참조 됩니다.Instead SQLite-NET is implemented as an abstract class, and then referenced through the rest of the shared code. 추상 API의 추출은 다음과 같습니다.An extract of the abstract API is shown below:

public abstract class SQLiteConnection : IDisposable {

    public string DatabasePath { get; private set; }
    public bool TimeExecution { get; set; }
    public bool Trace { get; set; }
    public SQLiteConnection(string databasePath) {
         DatabasePath = databasePath;
    }
    public abstract int CreateTable<T>();
    public abstract SQLiteCommand CreateCommand(string cmdText, params object[] ps);
    public abstract int Execute(string query, params object[] args);
    public abstract List<T> Query<T>(string query, params object[] args) where T : new();
    public abstract TableQuery<T> Table<T>() where T : new();
    public abstract T Get<T>(object pk) where T : new();
    public bool IsInTransaction { get; protected set; }
    public abstract void BeginTransaction();
    public abstract void Rollback();
    public abstract void Commit();
    public abstract void RunInTransaction(Action action);
    public abstract int Insert(object obj);
    public abstract int Update(object obj);
    public abstract int Delete<T>(T obj);

    public void Dispose()
    {
        Close();
    }
    public abstract void Close();

}

나머지 공유 코드는 추상 클래스를 사용 하 여 데이터베이스에서 개체를 "저장" 하 고 "검색" 합니다.The remainder of the shared code uses the abstract class to “store” and “retrieve” objects from the database. 이 추상 클래스를 사용 하는 응용 프로그램에서는 실제 데이터베이스 기능을 제공 하는 완전 한 구현을 전달 해야 합니다.In any application that uses this abstract class we must pass in a complete implementation that provides the actual database functionality.

TaskyAndroid 및 TaskyandroidTaskyAndroid and TaskyiOS

IOS 및 Android 응용 프로그램 프로젝트에는 PCL의 공유 코드를 연결 하는 데 사용 되는 사용자 인터페이스 및 기타 플랫폼별 코드가 포함 되어 있습니다.The iOS and Android application projects contain the user-interface and other platform-specific code used to wire-up the shared code in the PCL.

이러한 프로젝트에는 해당 플랫폼에서 작동 하는 추상 데이터베이스 API의 구현도 포함 되어 있습니다.These projects also contain an implementation of the abstract database API that works on that platform. IOS 및 Android에서 Sqlite 데이터베이스 엔진은 운영 체제에 기본 제공 되므로 구현에서는 데이터베이스 연결의 구체적인 구현을 제공 하는 것 처럼 [DllImport]를 사용할 수 있습니다.On iOS and Android the Sqlite database engine is built-in to the operating system, so the implementation can use [DllImport] as shown to provide the concrete implementation of database connectivity. 플랫폼별 구현 코드의 발췌는 다음과 같습니다.An excerpt of the platform-specific implementation code is shown here:

[DllImport("sqlite3", EntryPoint = "sqlite3_open")]
public static extern Result Open(string filename, out IntPtr db);

[DllImport("sqlite3", EntryPoint = "sqlite3_close")]
public static extern Result Close(IntPtr db);

전체 구현은 샘플 코드에서 볼 수 있습니다.The full implementation can be seen in the sample code.

요약Summary

이 문서에서는 이식 가능한 클래스 라이브러리의 이점 및 문제에 대해 간략하게 설명 하 고, Mac용 Visual Studio 및 Visual Studio 내부에서 PCLs를 만들고 사용 하는 방법을 보여 줍니다. 그리고 마지막으로 작업 중인 PCL을 보여 주는 완전 한 샘플 응용 프로그램 – TaskyPortable이 도입 되었습니다.This article has briefly discussed the benefits and pitfalls of Portable Class Libraries, demonstrated how to create and consume PCLs from inside Visual Studio for Mac and Visual Studio; and finally introduced a complete sample application – TaskyPortable – that shows a PCL in action.