SDK 스타일 .NET Framework 프로젝트에서 Source Generator 사용하기

C# .NetFramework 환경 WPF 프로그램 개발 강의 또는 블로그 찾습니다. 이 글에서 @Vincent 님께서 답글 달아주신 내용을 보다가 문득 생각이 들어 테스트해본 내용을 공유드려봅니다.

보통 .NET Framework 프로젝트라고하면 비 SDK 프로젝트 (레거시 프로젝트) 파일 포맷을 주로 사용하시게 될텐데요, SDK 스타일 프로젝트에서도 .NET Framework 프로젝트를 사용할 수 있는 것은 경험이 있으신 분들께서는 알고 계신 내용이실겁니다.

그런데 흥미롭게도, Source Generator가 의외로 이 환경에서 .NET Framework를 대상으로도 잘 작동하며, 그래서 CommunityToolkit.Mvvm의 소스 제네레이터가 .NET Framework 4.8을 대상으로도 잘 작동하는 것을 봤습니다.

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net48</TargetFramework>
		<Nullable>disable</Nullable>
		<ImplicitUsings>disable</ImplicitUsings>
		<LangVersion>8.0</LangVersion>
	</PropertyGroup>

	<ItemGroup>
		<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
	</ItemGroup>

</Project>

위와 같이 대상 언어 버전을 8.0으로 상향 조정하고, 몇몇 설정을 바꾼 뒤,

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;

namespace Sample
{
    public static class Program
    {
        [STAThread]
        private static void Main(string[] args)
        {
            var vm = new SampleViewModel();
            vm.Name = "World";
            vm.HelloCommand.Execute(null);
        }
    }

    public partial class SampleViewModel : ObservableObject
    {
        [ObservableProperty]
        private string name;

        [RelayCommand]
        private void Hello()
        {
            Console.WriteLine($"Hello, {Name}!");
        }
    }
}

이렇게 코드를 작성하고 컴파일하면 정상적으로 빌드가 됩니다.

SDK 스타일로 닷넷 프레임워크 프로젝트를 마이그레이션해두면, nuget 패키지 복원 문제가 불필요하게 복잡해지고 꼬이는 문제는 예방할 수 있어 큰 이점이 있습니다. 다만, 구 msbuild 프로젝트 아키텍처에 의존하고 있는 경우 (특히 C++/CLI를 쓰는 경우)에는 온전히 도입이 어려울 수 있어 적절한 절충안 정도로 보시는것이 현실적일 수 있겠습니다. :smiley:

1 Like

몰라서 찾아봤는데 SDK 스타일 프로젝트는

.NET project SDK overview | Microsoft Learn

이 문서를 의미하고 있습니다.

1 Like

저희 팀 에서도 이런식으로 사용해보려고 했으나 vs2019에서는 쓸 수 없다고 확인되어 쓰지 못하고 있습니다.. 혹시 저희 같은 분들이 있을까 내용 공유 드립니다.

이미지 링크 경로는 기억이 안나네요.. ㅎㅎ

2 Likes

네…당연합니다.

소스제네레이터는 .net 5에 시범적으로 콘솔어플리케이션에서만 동작했던 걸로 기억하고

.net 6부터 여러 군데에서 사용하게 된걸로 기억하여 그때부터 wpf에서 사용 가능하게 만들어진 것입니다.

그리고 .net6은 vs2022부터 사용가능했지요.

.net core 3.0 과 .net 5는 vs2019
.net6에서 .net9는 vs2022
.net10부터는 vs2026

사용 가능 기간이 이렇게 됩니다.

2 Likes

맞습니다.

예전에 제가 글을 올려둔적도 있읍니다 허허 ㅎㅎ;;

2 Likes