.NET Framework에서 .NET으로 포팅 개요

이 문서에서는 .NET Framework에서 .NET(이전 이름은 .NET Core)으로 코드를 이식할 때 고려해야 할 사항의 개요를 제공합니다. 프로젝트가 여러 개일 때 .NET Framework에서 .NET으로 이식하는 작업은 비교적 간단합니다. 프로젝트의 복잡도에 따라 프로젝트 파일의 초기 마이그레이션 후에 수행할 작업의 양이 결정됩니다.

.NET에서 앱 모델을 사용할 수 있는 프로젝트(라이브러리, 콘솔 앱, 데스크톱 앱 등)에는 보통 적은 수의 변경만 필요합니다. ASP.NET에서 ASP.NET Core로 이동하는 것처럼 새 앱 모델이 필요한 프로젝트에는 더 많은 작업이 필요합니다. 이전 앱 모델의 여러 패턴과 동등한 패턴을 변환 중에 사용할 수 있습니다.

Windows 데스크톱 기술

.NET Framework용으로 만든 많은 애플리케이션이 Windows Forms 또는 WPF(Windows Presentation Foundation)와 같은 데스크톱 기술을 사용합니다. Windows Forms와 WPF 모두 .NET으로 이식되었지만 여전히 Windows 전용 기술입니다.

Windows Forms 또는 WPF 애플리케이션을 마이그레이션하기 전에 다음 종속성을 고려하세요.

  • .NET용 프로젝트 파일은 .NET Framework와는 다른 형식을 사용합니다.
  • 프로젝트에서 .NET에서 사용할 수 없는 API가 사용될 수 있습니다.
  • 타사 컨트롤 및 라이브러리가 .NET으로 포팅되지 않았을 수 있으며 .NET Framework에서만 사용할 수 있습니다.
  • .NET에서 더 이상 사용할 수 없는 기술이 프로젝트에서 사용됩니다.

.NET은 Windows Forms 및 WPF의 오픈 소스 버전을 사용하며 .NET Framework보다 향상된 기능을 포함합니다.

데스크톱 애플리케이션을 .NET으로 마이그레이션하는 방법에 대한 자습서는 다음 문서 중 하나를 참조하세요.

Windows 특정 API

애플리케이션은 .NET이 지원하는 플랫폼에서 네이티브 라이브러리를 여전히 P/Invoke할 수 있습니다. 이 기술은 Windows로 제한되지 않습니다. 그러나 참조하는 라이브러리가 user32.dll 또는 kernel32.dll과 같은 Windows 특정 라이브러리인 경우 코드는 Windows에서만 작동합니다. 앱을 실행하려는 각 플랫폼마다 플랫폼별 버전을 찾거나 모든 플랫폼에서 실행할 수 있도록 코드를 충분히 제네릭하게 만들어야 합니다.

.NET Framework에서 .NET으로 애플리케이션을 포팅하는 경우 애플리케이션에서 .NET Framework에서 제공하는 라이브러리를 사용했을 수 있습니다. .NET Framework에서 사용할 수 있는 여러 API는 Windows 레지스트리 또는 GDI+ 그리기 모델과 같은 Windows 특정 기술에 의존하기 때문에 .NET으로 이식되지 않았습니다.

Windows 호환성 팩은 .NET Framework API 표면의 많은 부분을 .NET에 제공하며, Microsoft.Windows.Compatibility NuGet 패키지를 통해 제공됩니다.

자세한 내용은 Windows 호환성 팩을 사용하여 코드를 .NET Core로 이식을 참조하세요.

.NET Framework 호환 모드

.NET Framework 호환 모드는 .NET Standard 2.0에서 도입되었습니다. 호환 모드를 사용하면 .NET Standard 및 .NET 프로젝트가 프로젝트의 대상 프레임워크에 대해 컴파일된 것처럼 .NET Framework 라이브러리를 참조할 수 있습니다. 그러나 일부 .NET 구현은 다른 구현보다 더 큰 .NET Framework 청크를 지원할 수 있습니다. 예를 들어 .NET Core 3.0은 .NET Framework 호환성 모드를 Windows Forms 및 WPF로 확장합니다. 라이브러리에서 WPF API를 사용하는 경우와 같이 .NET Framework 라이브러리를 참조하는 것은 모든 프로젝트에서 작동하지 않지만 많은 포팅 시나리오의 차단을 해제합니다. 자세한 내용은 .NET Framework에서 .NET으로 코드를 이식하기 위한 종속성 분석을 참조하세요.

.NET Framework 라이브러리를 참조하는 것은 사용된 .NET Framework API와 프로젝트의 대상 프레임워크에서 이러한 API를 지원하는지 여부에 따라 달라지기 때문에 모든 경우에 작동하지 않습니다. 또한 일부 .NET Framework API는 Windows에서만 작동합니다. .NET Framework 호환성 모드는 많은 포팅 시나리오의 차단을 해제하지만 프로젝트를 테스트하여 런타임에도 작동하는지 확인해야 합니다. 자세한 내용은 .NET Framework에서 코드를 포팅하기 위한 종속성 분석을 참조하세요.

SDK 스타일 프로젝트의 대상 프레임워크 변경 내용

앞에서 설명한 것처럼 .NET용 프로젝트 파일은 SDK 스타일 프로젝트 형식이라고 하는 .NET Framework와 다른 형식을 사용합니다. .NET Framework에서 .NET으로 이동하지 않더라도 프로젝트 파일을 최신 형식으로 업그레이드해야 합니다. SDK 스타일 프로젝트에서는 대상 프레임워크를 지정하는 방법이 다릅니다. .NET Framework에서 <TargetFrameworkVersion> 속성은 .NET Framework의 버전을 지정하는 모니커와 함께 사용됩니다. 예를 들어 .NET Framework 4.7.2는 다음 코드 조각과 같습니다.

<PropertyGroup>
  <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
</PropertyGroup>

SDK 스타일 프로젝트는 다른 속성을 사용하여 대상 프레임워크인 <TargetFramework> 속성을 식별합니다. .NET Framework를 대상으로 하는 경우 모니커는 net으로 시작하고 마침표 없이 .NET Framework 버전으로 끝납니다. 예를 들어 .NET Framework 4.7.2를 대상으로 하는 모니커는 net472입니다.

<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>

모든 대상 모니커의 목록을 보려면 SDK 스타일 프로젝트의 대상 프레임워크를 참조하세요.

사용할 수 없는 기술

.NET Framework에는 .NET에 없는 기술이 몇 가지 있습니다.

  • 애플리케이션 도메인

    추가 애플리케이션 도메인 만들기는 지원되지 않습니다. 코드 격리의 경우 별도의 프로세스 또는 컨테이너를 대신 사용하세요.

  • 원격

    원격 통신은 더 이상 지원되지 않는 애플리케이션 도메인 간의 통신에 사용됩니다. 프로세스 간 간단한 통신을 위해 System.IO.Pipes 클래스 또는 MemoryMappedFile 클래스 같은 IPC(Inter-process communication) 메커니즘을 원격 대신 사용할 수 있습니다. 더 복잡한 시나리오의 경우 StreamJsonRpc 또는 ASP.NET Core와 같은 프레임워크( gRPC 또는 RESTful 웹 API 서비스 사용)를 사용하는 것이 좋습니다.

    원격은 지원되지 않으므로 대리자 개체에서 BeginInvoke()EndInvoke()를 호출하면 PlatformNotSupportedException이 throw됩니다.

  • CAS(코드 액세스 보안)

    CAS는 .NET Framework에서 지원하는 샌드박싱 기술이지만 .NET Framework 4.0에서는 사용되지 않습니다. CAS는 보안 투명도로 대체되었으며 .NET에서는 지원되지 않습니다. 대신 가상화, 컨테이너 또는 사용자 계정과 같이 운영 체제에서 제공하는 보안 경계를 사용하세요.

  • 보안 투명도

    CAS와 마찬가지로 보안 투명도 샌드박싱 기술은 .NET Framework 애플리케이션에 더 이상 권장되지 않으며 .NET에서 지원되지 않습니다. 대신 가상화, 컨테이너 또는 사용자 계정과 같이 운영 체제에서 제공하는 보안 경계를 사용하세요.

  • System.EnterpriseServices

    System.EnterpriseServices (COM+)는 .NET에서 지원되지 않습니다.

  • Windows Workflow Foundation(WF)

    .NET에서는 WF가 지원되지 않습니다. 대안은 CoreWF를 참조하세요.

지원되지 않는 이러한 기술에 대한 자세한 내용은 .NET 6 이상에서 사용할 수 없는 .NET Framework 기술을 참조하세요.

플랫폼 간

.NET(이전 이름은 .NET Core)은 플랫폼 간에 사용 가능하도록 설계되었습니다. Windows 특정 기술에 의존하지 않는 코드는 macOS, Linux, Android 등의 다른 플랫폼에서 실행될 수 있습니다. 이러한 코드에는 다음과 같은 프로젝트 형식이 포함됩니다.

  • 라이브러리
  • 콘솔 기반 도구
  • 자동화
  • ASP.NET 사이트

.NET Framework은 Windows 전용 구성 요소입니다. Windows Forms 및 WPF 같은 Windows 특정 기술이나 API를 사용하는 코드는 .NET에서 계속 실행될 수 있지만 다른 운영 체제에서는 실행되지 않습니다.

라이브러리 또는 콘솔 기반 애플리케이션을 많이 변경하지 않고도 플랫폼 간에 사용할 수 있습니다. .NET으로 포팅할 때 이를 고려하고 다른 플랫폼에서 애플리케이션을 테스트하는 것이 좋습니다.

.NET Standard의 미래

.NET Standard는 여러 .NET 구현에서 사용할 수 있는 .NET API의 공식 규격입니다. .NET Standard는 .NET 에코시스템의 통일성을 높이기 위한 것이었습니다. .NET 5부터 통일성을 위한 다른 접근 방식이 채택되었으며, 이 새로운 접근 방식으로 많은 시나리오에서 .NET Standard가 필요 없어집니다. 자세한 내용은 .NET 5 이상 및 .NET Standard를 참조하세요.

.NET Standard 2.0은 .NET Framework를 지원하는 마지막 버전이었습니다.

이식 지원 도구

애플리케이션을 .NET Framework에서 .NET으로 수동으로 이식하는 대신 다양한 도구를 사용하여 마이그레이션의 일부 측면을 자동화할 수 있습니다. 복잡한 프로젝트 이식은 그 자체가 복잡한 프로세스입니다. 도구가 이 과정에서 도움이 될 수 있습니다.

애플리케이션 이식에 도움이 되는 도구를 사용하는 경우에도 이 문서의 이식 시 고려 사항 섹션을 검토해야 합니다.

.NET 업그레이드 도우미

.NET 업그레이드 도우미는 다양한 종류의 .NET Framework 앱에서 실행할 수 있는 명령줄 도구입니다. 이 도구는 .NET Framework 앱을 .NET으로 업그레이드하는 데 도움이 되도록 설계되었습니다. 도구를 실행한 후 앱 마이그레이션을 완료하려면 더 많은 작업이 필요한 경우가 대부분입니다. 이 도구에는 마이그레이션 완료에 도움이 될 수 있는 분석기 설치가 포함됩니다. 이 도구가 작동하는 .NET Framework 애플리케이션 유형은 다음과 같습니다.

  • Windows Forms
  • WPF
  • ASP.NET MVC
  • 콘솔
  • 클래스 라이브러리

이 도구는 이 문서에 나열된 다른 도구(예: try-convert)를 사용하고 마이그레이션 프로세스를 안내합니다. 도구에 대한 자세한 내용은 .NET 업그레이드 도우미 개요를 참조하세요.

try-convert

try-convert 도구는 데스크톱 앱을 .NET으로 이동하는 것을 포함하여 프로젝트나 전체 솔루션을 .NET SDK로 변환할 수 있는 .NET 전역 도구입니다. 다만 프로젝트에 사용자 지정 작업, 대상 또는 가져오기와 같은 복잡한 빌드 프로세스가 있는 경우에는 이 도구를 권장하지 않습니다.

자세한 내용은 try-convert GitHub 리포지토리를 참조하세요.

.NET 이식성 분석기

.NET 이식성 분석기는 어셈블리를 분석하고 자세한 이식성 보고서를 제공하는 도구입니다. 지정된 대상 .NET 플랫폼에서 포팅할 애플리케이션 또는 라이브러리에 누락된 .NET API를 보고합니다.

Visual Studio에서 .NET 이식성 분석기를 사용하려면 마켓플레이스에서 확장을 설치하세요.

자세한 내용은 .NET 이식성 분석기를 참조하세요.

플랫폼 호환성 분석기

플랫폼 호환성 분석기는 런타임에 PlatformNotSupportedException을 throw하는 API를 사용하고 있는지를 분석합니다. .NET Framework 4.7.2 이상에서 이동하는 경우 이러한 API 중 하나를 찾을 가능성은 낮지만 확인하는 것이 좋습니다. .NET에서 예외를 throw하는 API에 대한 자세한 내용은 .NET Core에서 항상 예외를 throw하는 API를 참조하세요.

자세한 내용은 플랫폼 호환성 분석기를 참조하세요.

이식 시 고려 사항

애플리케이션을 .NET으로 포팅하는 경우 다음 제안 사항을 순서대로 고려하세요.

✔️ .NET 업그레이드 도우미를 사용하여 프로젝트를 마이그레이션하는 것이 좋습니다. 이 도구는 미리 보기 상태이지만 이 문서에서 설명하는 대부분의 수동 단계를 자동화하고 마이그레이션 경로를 계속하기 위한 좋은 출발점을 제공합니다.

✔️ 종속성을 먼저 조사하는 것이 좋습니다. 종속성은 .NET, .NET Standard 또는 .NET Core를 대상으로 지정해야 합니다.

✔️ NuGet packages.config 파일에서 프로젝트 파일의 PackageReference 설정으로 마이그레이션하세요. Visual Studio를 사용하여 package.config 파일을 변환하세요.

✔️ 앱을 아직 이식할 수 없더라도 최신 프로젝트 파일 형식으로 업그레이드하는 것이 좋습니다. .NET Framework 프로젝트는 오래된 프로젝트 형식을 사용합니다. SDK 스타일 프로젝트라고 하는 최신 프로젝트 형식은 .NET Core 이상을 위해 만들어졌지만 .NET Framework에서도 작동합니다. 프로젝트 파일이 최신 형식이면 나중에 앱을 이식할 수 있는 좋은 기반이 됩니다.

✔️ .NET Framework 프로젝트의 대상을 .NET Framework 4.7.2 이상으로 변경하세요. 그러면 .NET Standard에서 기존 API를 지원하지 않는 경우 최신 API를 대신 사용할 수 있습니다.

✔️ LTS(장기 지원) 릴리스인 .NET 6을 대상으로 하는 것이 좋습니다.

✔️ Windows Forms 및 WPF 프로젝트의 경우 .NET 6 이상을 대상으로 지정합니다. .NET 6에는 데스크톱 앱을 위한 향상된 기능이 많이 포함되어 있습니다.

✔️ .NET Framework 프로젝트에도 사용할 수 있는 라이브러리를 마이그레이션하는 경우 .NET Standard 2.0을 대상으로 지정하는 것이 좋습니다. 라이브러리를 다중 대상 지정하여 .NET Framework와 .NET Standard를 모두 대상으로 지정할 수도 있습니다.

✔️ 마이그레이션 후 누락된 API 오류가 발생하는 경우 Microsoft.Windows.Compatibility NuGet 패키지에 대한 참조를 추가하세요. .NET Framework API 표면의 많은 부분은 NuGet 패키지를 통해 .NET에서 사용할 수 있습니다.

참고 항목