Contoso Expenses라는 샘플 WPF 데스크톱 앱을 현대화하는 방법을 보여 주는 자습서의 첫 번째 부분입니다. 샘플 앱을 다운로드하기 위한 자습서, 필수 구성 요소 및 지침에 대한 개요는 자습서: WPF 앱 현대화를 참조하세요.
자습서의 이 부분에서는 전체 Contoso Expenses 앱을 .NET Framework 4.7.2에서 .NET Core 3 로 마이그레이션합니다. 자습서의 이 부분을 시작하기 전에 Visual Studio 2019에서 ContosoExpenses 샘플 을 열고, 빌드했는지 확인합니다.
비고
.NET Framework에서 .NET Core 3으로 WPF 애플리케이션을 마이그레이션하는 방법에 대한 자세한 내용은 이 블로그 시리즈를 참조하세요.
ContosoExpenses 프로젝트를 .NET Core 3으로 마이그레이션
이 섹션에서는 Contoso Expenses 앱의 ContosoExpenses 프로젝트를 .NET Core 3으로 마이그레이션합니다. 이렇게 하려면 기존 ContosoExpenses 프로젝트와 동일한 파일을 포함하지만 .NET Framework 4.7.2 대신 .NET Core 3을 대상으로 하는 새 프로젝트 파일을 만듭니다. 이렇게 하면 .NET Framework 및 .NET Core 버전의 앱으로 단일 솔루션을 유지 관리할 수 있습니다.
ContosoExpenses 프로젝트가 현재 .NET Framework 4.7.2를 대상으로 하는지 확인합니다. 솔루션 탐색기에서 ContosoExpenses 프로젝트를 마우스 오른쪽 단추로 클릭하고, 속성을 선택하고, 애플리케이션 탭의 대상 프레임워크 속성이 .NET Framework 4.7.2로 설정되어 있는지 확인합니다.
프로젝트을 위한 .NET Framework 버전 4.7.2
Windows 탐색기에서 C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses 폴더로 이동하고 ContosoExpenses.Core.csproj라는 새 텍스트 파일을 만듭니다.
파일을 마우스 오른쪽 단추로 클릭하고
열기를 선택한 다음 메모장, Visual Studio Code 또는 Visual Studio와 같은 원하는 텍스트 편집기에서 엽니다. 다음 텍스트를 파일에 복사하고 저장합니다.
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> </PropertyGroup> </Project>파일을 닫고 Visual Studio에서 ContosoExpenses 솔루션으로 돌아갑니다.
ContosoExpenses 솔루션을 마우스 오른쪽 단추로 클릭하고 추가 -> 기존 프로젝트를 선택합니다. 폴더에서 방금 만든
C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses파일을 선택하여 솔루션에 추가합니다.
ContosoExpenses.Core.csproj에는 다음 요소가 포함됩니다.
- Project 요소는 Microsoft.NET.Sdk.WindowsDesktop의 SDK 버전을 지정합니다. 이는 Windows Desktop용 .NET 애플리케이션을 참조하며 WPF 및 Windows Forms 앱에 대한 구성 요소를 포함합니다.
- PropertyGroup 요소에는 프로젝트 출력이 DLL이 아닌 실행 파일임을 나타내는 자식 요소가 포함되어 있으며 .NET Core 3을 대상으로 하며 WPF를 사용합니다. Windows Forms 앱의 경우 UseWPF 요소 대신 UseWinForms 요소를 사용합니다.
비고
.NET Core 3.0에서 도입된 .csproj 형식으로 작업하는 경우 .csproj와 동일한 폴더에 있는 모든 파일이 프로젝트의 일부로 간주됩니다. 따라서 프로젝트에 포함된 모든 파일을 지정할 필요는 없습니다. 사용자 지정 빌드 작업을 정의하거나 제외하려는 파일만 지정해야 합니다.
ContosoExpenses.Data 프로젝트를 .NET Standard로 마이그레이션
ContosoExpenses 솔루션에는 서비스 및 대상 .NET 4.7.2에 대한 모델 및 인터페이스가 포함된 ContosoExpenses.Data 클래스 라이브러리가 포함되어 있습니다. .NET Core 3.0 앱은 .NET Core에서 사용할 수 없는 API를 사용하지 않는 한 .NET Framework 라이브러리를 사용할 수 있습니다. 그러나 가장 좋은 현대화 경로는 라이브러리를 .NET Standard로 이동하는 것입니다. 이렇게 하면 .NET Core 3.0 앱에서 라이브러리가 완전히 지원됩니다. 또한 웹과 같은 다른 플랫폼(ASP.NET Core를 통해)에서도 라이브러리를 다시 사용할 수 있습니다.
ContosoExpenses.Data 프로젝트를 .NET Standard로 마이그레이션하려면 다음을 수행합니다.
Visual Studio에서 ContosoExpenses.Data 프로젝트를 마우스 오른쪽 버튼으로 클릭한 다음, 프로젝트를 언로드 선택합니다. 프로젝트를 다시 마우스 오른쪽 단추로 클릭한 다음 ContosoExpenses.Data.csproj편집을 선택합니다.
프로젝트 파일의 전체 내용을 삭제합니다.
다음 XML을 복사하여 붙여넣고 파일을 저장합니다.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> </Project>ContosoExpenses.Data 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트다시 로드할선택합니다.
NuGet 패키지 및 종속성 구성
이전 섹션에서 ContosoExpenses.Core 및 ContosoExpenses.Data 프로젝트를 마이그레이션할 때 프로젝트에서 NuGet 패키지 참조를 제거했습니다. 이 섹션에서는 이러한 참조를 다시 추가합니다.
ContosoExpenses.Data 프로젝트에 대한 NuGet 패키지를 구성하려면 다음을 수행합니다.
ContosoExpenses.Data 프로젝트에서 종속성 노드를 확장하십시오. NuGet 섹션이 없음을 유의하세요.
솔루션 탐색기에서 Packages.config를 열면, 프로젝트가 전체 .NET Framework를 사용할 때 사용했던 NuGet 패키지의 '이전' 참조를 찾을 수 있습니다.
Packages.config 파일의 내용은 다음과 같습니다. 모든 NuGet 패키지는 전체 .NET Framework 4.7.2를 대상으로 합니다.
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Bogus" version="26.0.2" targetFramework="net472" /> <package id="LiteDB" version="4.1.4" targetFramework="net472" /> </packages>ContosoExpenses.Data 프로젝트에서 Packages.config 파일을 삭제합니다.
ContosoExpenses.Data 프로젝트에서 종속성 노드를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리선택합니다.
NuGet 패키지 관리자 창에서 찾아보기클릭합니다.
Bogus패키지를 검색하고 안정적인 최신 버전을 설치합니다.
LiteDB패키지를 검색하고 안정적인 최신 버전을 설치합니다.
프로젝트에 더 이상 packages.config 파일이 없으므로 이러한 NuGet 패키지 목록이 저장되는 위치가 궁금할 수 있습니다. 참조된 NuGet 패키지는 .csproj 파일에 직접 저장됩니다. 텍스트 편집기에서 ContosoExpenses.Data.csproj 프로젝트 파일의 내용을 확인하여 이를 확인할 수 있습니다. 파일의 끝에 다음 줄이 추가됩니다.
<ItemGroup> <PackageReference Include="Bogus" Version="26.0.2" /> <PackageReference Include="LiteDB" Version="4.1.4" /> </ItemGroup>비고
또한 .NET Framework 4.7.2 프로젝트에서 사용하는 것과 동일한 패키지를 이 .NET Core 3 프로젝트에 설치하고 있음을 알 수 있습니다. NuGet 패키지는 다중 대상 지정을 지원합니다. 라이브러리 작성자는 서로 다른 아키텍처 및 플랫폼용으로 컴파일된 동일한 패키지에 여러 버전의 라이브러리를 포함할 수 있습니다. 이러한 패키지는 전체 .NET Framework와 .NET Core 3 프로젝트와 호환되는 .NET Standard 2.0을 지원합니다. .NET Framework, .NET Core 및 .NET Standard의 차이점에 대한 자세한 내용은 .NET Standard를 참조하세요.
ContosoExpenses.Core 프로젝트에 대한 NuGet 패키지를 구성하려면 다음을 수행합니다.
ContosoExpenses.Core 프로젝트에서 packages.config 파일을 엽니다. 현재 .NET Framework 4.7.2를 대상으로 하는 다음 참조가 포함되어 있습니다.
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="CommonServiceLocator" version="2.0.2" targetFramework="net472" /> <package id="MvvmLightLibs" version="5.4.1.1" targetFramework="net472" /> <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" /> <package id="Unity" version="5.10.2" targetFramework="net472" /> </packages>다음 단계에서는
MvvmLightLibs및Unity패키지의 .NET Standard 버전을 확인합니다. 다른 두 가지는 이러한 두 라이브러리를 설치할 때 NuGet에서 자동으로 다운로드하는 종속성입니다.ContosoExpenses.Core 프로젝트에서 Packages.config 파일을 삭제합니다.
ContosoExpenses.Core 프로젝트를 오른쪽 클릭하고 NuGet 패키지 관리를 선택하세요.
NuGet 패키지 관리자 창에서 찾아보기클릭합니다.
Unity패키지를 검색하고 안정적인 최신 버전을 설치합니다.
MvvmLightLibsStd10패키지를 검색하고 안정적인 최신 버전을 설치합니다. 패키지의 .NET Standard 버전입니다MvvmLightLibs. 이 패키지의 경우 작성자가 .NET Framework 버전이 아닌 별도의 패키지로 라이브러리의 .NET Standard 버전을 패키지하도록 선택했습니다.MvvmLightsLibs 패키지

ContosoExpenses.Core 프로젝트에서 종속성 노드를 마우스 오른쪽 단추로 클릭하고 참조추가를 선택합니다.
Projects > Solution 범주에서 ContosoExpenses.Data를 선택하고 확인을 클릭합니다.
추가
자동 생성된 어셈블리 특성 사용 안 함
마이그레이션 프로세스의 이 시점에서 ContosoExpenses.Core 프로젝트를 빌드하려고 하면 몇 가지 오류가 표시됩니다.
.NET Core 3.0에 도입된 새 .csproj 형식이 AssemblyInfo.cs 파일이 아닌 프로젝트 파일에 어셈블리 정보를 저장하기 때문에 이 문제가 발생합니다. 이러한 오류를 해결하려면 이 동작을 사용하지 않도록 설정하고 프로젝트에서 AssemblyInfo.cs 파일을 계속 사용하도록 합니다.
Visual Studio에서 ContosoExpenses.Core 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 프로젝트 언로드를 선택합니다. 프로젝트를 다시 마우스 오른쪽 단추로 클릭한 다음 ContosoExpenses.Core.csproj편집을 선택합니다.
PropertyGroup 섹션에 다음 요소를 추가하고 파일을 저장합니다.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>이 요소를 추가한 후, PropertyGroup 섹션은 이제 다음과 같이 표시됩니다.
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>ContosoExpenses.Core 프로젝트를 마우스 오른쪽 단추로 클릭하여 프로젝트다시 로드를 선택합니다.
ContosoExpenses.Data 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트언로드를 선택합니다. 프로젝트를 다시 마우스 오른쪽 단추로 클릭한 다음 ContosoExpenses.Data.csproj편집을 선택합니다. PropertyGroup 섹션에 동일한 항목을 추가하고 파일을 저장합니다.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>이 요소를 추가한 후, PropertyGroup 섹션은 이제 다음과 같이 표시됩니다.
<PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>ContosoExpenses.Data 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트다시 로드할선택합니다.
Windows 호환성 팩 추가
이제 ContosoExpenses.Core 및 ContosoExpenses.Data 프로젝트를 컴파일하면 이전 오류가 수정되었지만, 여전히 이와 유사한 오류가 ContosoExpenses.Data 라이브러리에 있음을 알 수 있습니다.
Services\RegistryService.cs(9,26,9,34): error CS0103: The name 'Registry' does not exist in the current context
Services\RegistryService.cs(12,26,12,34): error CS0103: The name 'Registry' does not exist in the current context
Services\RegistryService.cs(12,97,12,123): error CS0103: The name 'RegistryKeyPermissionCheck' does not exist in the current context
이러한 오류는 ContosoExpenses.Data 프로젝트를 .NET Framework 라이브러리(Windows 전용)에서 Linux, Android, iOS 등을 비롯한 여러 플랫폼에서 실행할 수 있는 .NET Standard 라이브러리로 변환한 결과입니다. ContosoExpenses.Data 프로젝트에는 Windows 전용 개념인 레지스트리와 상호 작용하는 RegistryService라는 클래스가 포함되어 있습니다.
이러한 오류를 해결하려면 Windows 호환성 NuGet 패키지를 설치합니다. 이 패키지는 .NET Standard 라이브러리에서 사용되는 많은 Windows 관련 API를 지원합니다. 라이브러리는 이 패키지를 사용한 후에도 더 이상 플랫폼 간이 아니지만 여전히 .NET Standard를 대상으로 합니다.
ContosoExpenses.Data 프로젝트를 마우스 오른쪽 단추로 클릭합니다.
NuGet 패키지 관리선택합니다.
NuGet 패키지 관리자 창에서 찾아보기클릭합니다.
Microsoft.Windows.Compatibility패키지를 검색하고 안정적인 최신 버전을 설치합니다.
설치이제 ContosoExpenses.Data 프로젝트를 마우스 오른쪽 단추로 클릭한 다음, 빌드작업을 선택하여 프로젝트를 다시 컴파일해 보세요.
이번에는 빌드 프로세스가 오류 없이 완료됩니다.
마이그레이션 테스트 및 디버그
프로젝트가 성공적으로 빌드되었으므로 앱을 실행하고 테스트하여 런타임 오류가 있는지 확인할 준비가 되었습니다.
ContosoExpenses.Core 프로젝트를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.
F5 키를 눌러 디버거에서 ContosoExpenses.Core 프로젝트를 시작합니다. 다음과 유사한 예외가 표시됩니다.
에 표시됨마이그레이션을 시작할 때 .csproj 파일에서 콘텐츠를 삭제할 때 이미지 파일에 대한 빌드 작업에 대한 정보를 제거했기 때문에 이 예외가 발생합니다. 다음 단계에서는 이 문제를 해결합니다.
디버거를 중지하세요.
ContosoExpenses.Core 프로젝트를 오른쪽 클릭한 후 프로젝트 언로드 해제를 선택합니다. 프로젝트를 다시 마우스 오른쪽 단추로 클릭한 다음 ContosoExpenses.Core.csproj편집을 선택합니다.
닫기 전에 Project 요소에 다음 항목을 추가하십시오.
<ItemGroup> <Content Include="Images/*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>ContosoExpenses.Core 프로젝트를 마우스 오른쪽 단추로 클릭하여 프로젝트다시 로드를 선택합니다.
앱에 Contoso.ico 할당하려면 ContosoExpenses.Core 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 열린 페이지에서 아이콘 아래의 드롭다운을 클릭하고 을 선택합니다
Images\contoso.ico.
저장을 클릭합니다.
F5 키를 눌러 디버거에서 ContosoExpenses.Core 프로젝트를 시작합니다. 이제 앱이 실행되는지 확인합니다.
다음 단계
자습서의 이 시점에서 Contoso Expenses 앱을 .NET Core 3으로 마이그레이션했습니다. 이제 2부: XAML Islands사용하여 UWP InkCanvas 컨트롤을 추가할 준비가 되었습니다.
비고
고해상도 화면이 있는 경우 앱이 매우 작게 보일 수 있습니다. 자습서의 다음 단계에서 이 문제를 해결합니다.
Windows developer