데스크톱 애플리케이션에서 UWP로 이동

.NET Framework(WPF 및 Windows Forms 포함) 또는 C++ Win32 API를 사용하여 빌드된 기존 데스크톱 애플리케이션이 있는 경우 UWP(유니버설 Windows 플랫폼) 및 Windows 10/11로 이동할 수 있는 몇 가지 옵션이 있습니다.

MSIX 패키지에 데스크톱 애플리케이션 패키징

데스크톱 애플리케이션을 MSIX 패키지로 패키지하여 더 많은 Windows 10 및 Windows 11 기능에 액세스할 수 있습니다. MSIX는 UWP, WPF, Windows Forms 및 Win32 앱을 비롯한 모든 Windows 앱에 유니버설 패키징 환경을 제공하는 최신 Windows 앱 패키지 형식입니다. MSIX 패키지에 데스크톱 Windows 앱을 패키지하면 강력한 설치 및 업데이트 환경, 유연한 기능 시스템을 포함하는 관리형 보안 모듈, Microsoft Store, 엔터프라이즈 관리 및 여러 사용자 지정 모델에 대한 지원 기능에 액세스할 수 있습니다. 소스 코드가 있거나 기존 설치 프로그램 파일(예: MSI 또는 App-V 설치 프로그램)만 있는 경우 애플리케이션을 패키징할 수 있습니다. 애플리케이션을 패키징한 후 패키지 확장 및 기타 UWP 구성 요소와 같은 UWP 기능을 통합할 수 있습니다.

자세한 내용은 코드에서 MSIX 패키지 빌드패키지 ID가 필요한 기능을 참조하세요.

Windows 런타임 API

WPF, Windows Forms 또는 C++ Win32 데스크톱 앱에서 직접 여러 Windows 런타임 API를 호출하여 Windows 10 사용자에게 유용한 최신 환경을 통합할 수 있습니다. 예를 들어, Windows 런타임 API를 호출하여 데스크톱 앱에 알림 메시지를 추가할 수 있습니다.

자세한 내용은 데스크톱 앱에서 Windows 런타임 API 사용을 참조하세요.

.NET Framework 앱을 UWP 앱으로 마이그레이션

애플리케이션이 .NET Framework에서 실행되는 경우 .NET Standard 2.0을 활용하여 UWP 앱으로 마이그레이션할 수 있습니다. 최대한 많은 코드를 .NET Standard 2.0 클래스 라이브러리로 이동한 다음 .NET Standard 2.0 라이브러리를 참조하는 UWP 앱을 만듭니다.

.NET Standard 2.0 라이브러리에 있는 코드 공유

애플리케이션이 .NET Framework에서 실행되는 경우 .NET Standard 2.0 클래스 라이브러리에 최대한 많은 코드를 배치합니다. 코드가 표준에 정의된 API를 사용하는 한 UWP 앱에서 해당 코드를 다시 사용할 수 있습니다. .NET Standard 2.0에 훨씬 많은 API가 포함되어 있기 때문에 이는 .NET Standard 라이브러리에 코드를 공유하는 것보다 쉽습니다.

여기에 대해 자세히 설명하는 동영상이 있습니다.

.NET Standard 라이브러리에 추가

먼저 하나 이상의 .NET Standard 클래스 라이브러리를 솔루션에 추가합니다.

Add dotnet standard project

솔루션에 추가하는 라이브러리의 수는 코드 구성 방법에 따라 다릅니다.

각 클래스 라이브러리가 .NET Standard 2.0을 대상으로 하는지 확인합니다.

Target .NET Standard 2.0

이 설정은 클래스 라이브러리 프로젝트의 속성 페이지에서 확인할 수 있습니다.

데스크톱 애플리케이션 프로젝트에서 클래스 라이브러리 프로젝트에 참조를 추가합니다.

Screenshot of the Solution Explorer pane that calls out the Class library reference for the dot NET project.

그런 다음 도구를 사용하여 표준에 맞는 코드의 양을 확인합니다. 이렇게 하면 코드를 라이브러리로 옮기기 전에 재사용할 수 있는 부분, 최소한의 수정이 필요한 부분 및 애플리케이션에 따라 달라질 부분을 결정할 수 있습니다.

라이브러리 및 코드 호환성 검사

타사에서 얻은 NuGet 패키지 및 기타 dll 파일부터 시작합니다.

애플리케이션이 이 중 하나를 사용하는 경우 .NET Standard 2.0과 호환되는지 확인합니다. Visual Studio 확장 또는 명령줄 유틸리티를 사용하여 이를 수행할 수 있습니다.

동일한 도구를 사용하여 코드를 분석합니다. 해당 도구를 다운로드(dotnet-apiport)한 다음 이 동영상을 보고 사용 방법을 알아봅니다.  

코드가 표준과 호환되지 않는 경우 해당 코드를 구현할 수 있는 다른 방법을 고려합니다. .NET API 브라우저를 여는 것으로 시작합니다. 해당 브라우저를 사용하여 .NET Standard 2.0에서 사용할 수 있는 API를 검토할 수 있습니다. .NET Standard 2.0으로 목록의 범위를 지정합니다.

dot net option

일부 코드는 플랫폼에 따라 다르며 데스크톱 애플리케이션 프로젝트에 남아 있어야 합니다.

예: 데이터 액세스 코드를 .NET Standard 2.0 라이브러리로 마이그레이션

Northwind 샘플 데이터베이스에서 고객을 표시하는 매우 기본적인 Windows Forms 애플리케이션이 있다고 가정해 보겠습니다.

Windows Forms App

프로젝트에는 Northwind라는 정적 클래스가 있는 .NET Standard 2.0 클래스 라이브러리가 포함되어 있습니다. 이 코드를 Northwind 클래스를 옮기는 경우 해당 코드가 SQLConnection, SqlCommandSqlDataReader 클래스 및 .NET Standard 2.0에서 사용할 수 없는 클래스를 사용하기 때문에 컴파일되지 않습니다.

public static ArrayList GetCustomerNames()
{
    ArrayList customers = new ArrayList();

    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString =
            @"Data Source=" +
            @"<Your Server Name>\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

        conn.Open();

        SqlCommand command = new SqlCommand("select ContactName from customers order by ContactName asc", conn);

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                customers.Add(reader[0]);
            }
        }
    }

    return customers;
}

하지만 대안을 찾기 위해 .NET API 브라우저를 사용할 수 있습니다. DbConnection, DbCommandDbDataReader 클래스는 모두 .NET Standard 2.0에서 사용할 수 있기 때문에 이를 대신 사용할 수 있습니다.

이 수정된 버전은 이러한 클래스를 사용하여 고객 목록을 가져오지만, DbConnection 클래스를 생성하기 위해서는 클라이언트 애플리케이션에서 생성한 팩터리 개체를 전달해야 합니다.

public static ArrayList GetCustomerNames(DbProviderFactory factory)
{
    ArrayList customers = new ArrayList();

    using (DbConnection conn = factory.CreateConnection())
    {
        conn.ConnectionString = @"Data Source=" +
                        @"<Your Server Name>\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

        conn.Open();

        DbCommand command = factory.CreateCommand();
        command.Connection = conn;
        command.CommandText = "select ContactName from customers order by ContactName asc";

        using (DbDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                customers.Add(reader[0]);
            }
        }
    }

    return customers;
}

Windows Form의 코드 숨김 페이지에서 팩터리 인스턴스를 만들어 메서드에 전달할 수 있습니다.

public partial class Customers : Form
{
    public Customers()
    {
        InitializeComponent();

        dataGridView1.Rows.Clear();

        SqlClientFactory factory = SqlClientFactory.Instance;

        foreach (string customer in Northwind.GetCustomerNames(factory))
        {
            dataGridView1.Rows.Add(customer);
        }
    }
}

UWP 앱 만들기

이제 솔루션에 UWP 앱을 추가할 준비가 되었습니다.

desktop to UWP bridge image

여전히 XAML에서 UI 페이지를 디자인하고 디바이스 또는 플랫폼별 코드를 작성해야 하지만, 완료되면 Windows 10 및 Windows 11 디바이스의 전체 범위에 도달할 수 있으며 앱 페이지는 다양한 화면 크기 및 해상도에 잘 맞는 현대적인 느낌을 줄 수 있습니다.

앱은 키보드와 마우스 이외의 입력 메커니즘에 반응할 것이며, 기능과 설정은 여러 디바이스에서 직관적일 수 있습니다. 즉, 사용자는 사용 방법을 한 번에 배울 수 있고 앱은 디바이스와 상관없이 매우 익숙한 방식으로 작동하게 됩니다.

이는 UWP와 함께 제공되는 몇 가지 장점일 뿐입니다. 자세히 알아보려면 Windows를 사용한 멋진 환경 만들기를 참조하세요.

UWP 프로젝트 추가

먼저 솔루션에 UWP 프로젝트를 추가합니다.

UWP Project

그런 다음 UWP 프로젝트에서 .NET Standard 2.0 라이브러리 프로젝트에 대한 참조를 추가합니다.

Screenshot of the UWP Solution Explorer pane that calls out the reference to the Class library reference for the dot NET project.

페이지 빌드

.NET Standard 2.0 라이브러리에서 XAML 페이지를 추가하고 코드를 호출합니다.

UWP app

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel x:Name="customerStackPanel">
        <ListView x:Name="customerList"/>
    </StackPanel>
</Grid>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        SqlClientFactory factory = SqlClientFactory.Instance;

        customerList.ItemsSource = Northwind.GetCustomerNames(factory);
    }
}

UWP를 사용하려면 UWP 앱이란 무엇인가요?를 참조하세요.

iOS 및 Android 디바이스에 연결

Xamarin 프로젝트를 추가하여 Android 및 iOS 디바이스에 연결할 수 있습니다.

참고 항목

새로운 플랫폼 간 프로젝트의 경우 .NET MAUI를 사용하는 것이 좋습니다.

An image that shows an Android device and a i O S device displaying Xamarin apps.

이 프로젝트를 통해 C#을 사용하여 플랫폼 및 디바이스별 API에 대한 모든 액세스 권한을 가진 Android 및 iOS 앱을 빌드할 수 있습니다. 이러한 앱은 플랫폼별 하드웨어 가속을 활용하며 기본 성능을 위해 컴파일됩니다.

해당 앱은 iBeacon 및 Android Fragment와 같은 플랫폼별 기능을 포함하여 기본 플랫폼 및 디바이스에서 제공하는 모든 기능에 액세스할 수 있으며, 개발자는 표준 네이티브 사용자 인터페이스 컨트롤을 사용하여 사용자가 기대하는 모양과 느낌의 UI를 빌드할 수 있습니다.

UWP와 마찬가지로 .NET Standard 2.0 클래스 라이브러리에서 비즈니스 논리를 재사용할 수 있으므로 Android 또는 iOS 앱을 추가하는 데 드는 비용은 더 낮습니다. XAML에서 UI 페이지를 디자인하고 디바이스 또는 플랫폼별 코드를 작성해야 합니다.

Xamarin 프로젝트 추가

먼저 Android, iOS 또는 크로스 플랫폼 프로젝트를 솔루션에 추가합니다.

Visual C# 그룹의 새 프로젝트 추가 대화 상자에서 이러한 템플릿을 찾을 수 있습니다.

Screenshot of the Add New Project dialog box showing Installed > Visual C sharp selected and Android, Cross Platform, and i O S options called out.

참고 항목

크로스 플랫폼 프로젝트는 플랫폼별 기능이 거의 없는 앱에 적합합니다. 이를 사용하여 iOS, Android 및 Windows에서 실행되는 네이티브 XAML 기반 UI를 빌드할 수 있습니다. 여기서 자세히 알아봅니다.

그런 다음 Android, iOS 또는 크로스 플랫폼 프로젝트에서 클래스 라이브러리 프로젝트에 대한 참조를 추가합니다.

Screenshot of the Solution Explorer pane that calls out the reference to the Class library reference for the Android, i O S, or cross-platform project.

페이지 빌드

이 예에서는 Android 앱의 고객 목록을 보여 줍니다.

Android app

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp" android:textSize="16sp"
    android:id="@android:id/list">
</TextView>
[Activity(Label = "MyAndroidApp", MainLauncher = true)]
public class MainActivity : ListActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SqlClientFactory factory = SqlClientFactory.Instance;

        var customers = (string[])Northwind.GetCustomerNames(factory).ToArray(typeof(string));

        ListAdapter = new ArrayAdapter<string>(this, Resource.Layout.list_item, customers);
    }
}

Android, iOS 및 크로스 플랫폼 프로젝트를 시작하려면 Xamarin 개발자 포털을 참조하세요.

다음 단계

질문에 대한 답변 찾기

질문이 있으세요? Stack Overflow에서 질문하세요. 저희 팀은 이러한 태그를 모니터링합니다. 여기에서 문의할 수도 있습니다.