멀티 타겟팅 라이브러리
.NET을 기반으로 한 멀티 타겟팅 라이브러리를 구현하는 방법이다
.NET 기반의 라이브러리 클래스를 생성하게되면
아래와 같이 프로젝트 코드가 구성되어 생성된다
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
여기서 TargetFramework를 TargetFrameworks 로 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
조건부 컴파일을 통한 문법 활용
물론,
이 예제 코드는 극단적으로 최신 문법을 사용할 수도 있다는 것을
확인하기 위한 예제일 뿐이다
특정 버전에서만 동작하는 매우 동적인 기능을 만들기 위해 사용하는 것이 아니라면
낮은 버전의 문법을 따라서 작성하는게 맞다고 생각한다
'c# > 세미나' 카테고리의 다른 글
| [세미나] Blazor / WPF / MAUI 밋업 (0) | 2024.04.11 |
|---|---|
| [세미나] Blazor / WPF / MAUI 밋업 (INotifyPropertyChanged 구현) (0) | 2024.04.05 |
| [세미나] Blazor / WPF / MAUI 밋업 (닷넷 버전선택) (0) | 2024.04.03 |
| [세미나] Blazor / WPF / MAUI 밋업 (Application, Current, MainWindow, GetWindow) (0) | 2024.04.03 |
| [세미나] Blazor / WPF / MAUI 밋업 (WPF 구성 요소) (0) | 2024.04.03 |