다음을 통해 공유


데스크톱 애플리케이션에서 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 클래스 라이브러리를 추가합니다.

dotnet 표준 프로젝트 추가

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

각 클래스 라이브러리가 .NET Standard 2.0대상으로 지정해야 합니다.

대상 .NET Standard 2.0

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

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

.NET 프로젝트의 클래스 라이브러리 참조를 강조하는 솔루션 탐색기 창의 스크린샷

다음으로 도구를 사용하여 표준에 맞는 코드의 양을 결정합니다. 이렇게 하면 코드를 라이브러리로 이동하기 전에 다시 사용할 수 있는 파트, 최소한의 수정이 필요한 부분 및 애플리케이션별로 유지되는 파트를 결정할 수 있습니다.

라이브러리 및 코드 호환성 확인

타사에서 가져온 Nuget 패키지 및 기타 dll 파일로 시작합니다.

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

동일한 도구를 사용하여 코드를 분석합니다. 여기에서 도구(dotnet-apiport)를 다운로드한 다음 이 비디오를 시청하여 사용하는 방법을 알아봅니다.  

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

닷넷 옵션

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

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

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

Windows Forms 앱

프로젝트에는 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 = ...; // Your connection string goes here.

        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 = ...; // Your connection string goes here.

        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 폼의 코드 비하인드 페이지에서 팩토리 인스턴스를 생성하여 메서드에 전달할 수 있습니다.

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 앱을 추가할 준비가 되었습니다.

데스크톱에서 UWP로 브리지 이미지

XAML에서 UI 페이지를 디자인하고 장치 또는 플랫폼별 코드를 작성해야 하지만, 완료되면 Windows 10 및 Windows 11 디바이스의 전체 폭에 도달할 수 있으며 앱 페이지는 다양한 화면 크기와 해상도에 잘 맞는 최신 느낌을 갖게 됩니다.

앱은 키보드와 마우스 이외의 입력 메커니즘에 응답하며, 기능 및 설정은 장치 전체에서 직관적입니다. 즉, 사용자는 한 번 작업을 수행하는 방법을 학습한 다음 디바이스에 관계없이 매우 친숙한 방식으로 작동합니다.

이들은 UWP와 함께 제공되는 몇 가지 좋은 것입니다. 자세한 내용을 보려면 Windows를 사용하여 멋진 환경을 만드는 방법을 참조하세요.

UWP 프로젝트 추가

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

UWP 프로젝트

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

dot NET 프로젝트의 클래스 라이브러리 참조를 호출하는 UWP 솔루션 탐색기 창의 스크린샷

페이지 빌드

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

UWP 앱

<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 앱이 무엇인지 보세요.

다음 단계

질문에 대한 답변 찾기

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