c#/세미나

[세미나] Blazor / WPF / MAUI 밋업 (멀티 타겟팅 라이브러리)

루다대디 2024. 4. 3. 19:05

멀티 타겟팅 라이브러리

.NET을 기반으로 한 멀티 타겟팅 라이브러리를 구현하는 방법이다

.NET 기반의 라이브러리 클래스를 생성하게되면

아래와 같이 프로젝트 코드가 구성되어 생성된다

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

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

 

여기서 TargetFrameworkTargetFrameworks s만 붙여주고

아래와같이 멀티 타겟을 설정할 수 있다

 

추가로

ImplicitUsings Nullable 두가지 특성을

enable에서 disable로 변경 해주어야 한다

 

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

  <PropertyGroup>
    <TargetFrameworks>net48;net8.0</TargetFrameworks>
    <ImplicitUsings>disable</ImplicitUsings>
    <Nullable>disable</Nullable>
  </PropertyGroup>

</Project>

.NET Framework 4.8 추가


런타임에서의 라이브러리

TargetFrameworks를 통해 설정된 버전은
각각 디렉토리에 따로 빌드된것을 확인 할 수 있다.

 

.NET 또는 .NET Framework에서 해당 라이브러리를 참조한다면

참조를 한 프로젝트의 버전에 따라 자동으로 DLL이 매칭된다

따라서 별 다른 설정없이 멀티 타겟팅 형식의 라이브러리만 잘 참조하고 사용하기만 하면 된다

 


멀티 타겟팅 구현 규칙

멀티 타겟팅 라이브러리를 구현할 때 지켜야 할 단 하나의 규칙이 있다

멋티 타겟으로 포함된 닷넷중 가장 낮은 버전을 기준으로 구현해야 한다


위에서 작성한것 처럼
.NET Framework 4.8.NET8을 타겟으로 했다면

둘중 낮은 버전인 .NET Framework 4.8 에서 동작이 가능한 문법만 사용이 가능하다

 

예를들어 new();와 같은 생성자 축약은 사용할 수 없게 된다

// .NET Framework 4.8에서 사용 불가
TestClass testClass = new();

 

그리고 CommunityToolkit과 같은 라이브러리 또한

.NET 6.0 이상에서만 [ObservableProperty] 와 같은

소스코드 자동생성을 지원하는 어트리뷰트를 사용할 수 있기 때문에 이러한 문법들도 사용할 수 없게 된다

// 이 역시 사용 불가..
[ObservableProperty]
private string _title;

 


조건부 컴파일 (Conditional Compilation)

하지만,

조건부 컴파일을 통해 특정 버전의 문법을 사용하는 것이 가능하다

 

#if NET8_0_OR_GREATER
            TestClass testClass = new();
#else
            TestClass testClass = new TestClass();
#endif

조건부 컴파일을 통한 문법 활용

 

물론,

이 예제 코드는 극단적으로 최신 문법을 사용할 수도 있다는 것을

확인하기 위한 예제일 뿐이다

 

특정 버전에서만 동작하는 매우 동적인 기능을 만들기 위해 사용하는 것이 아니라면

낮은 버전의 문법을 따라서 작성하는게 맞다고 생각한다