소개하려는 주제는 이미 .NET 7에 들어와서 기본적인 인프라가 모두 갖추어진 영역이지만, File-based App을 만나서 매우 매력적으로 진화한 기능이라 소개해보고 싶어 추가로 이야기해보려 합니다.
현재 File-based App 관련 샘플을 보면, 주로 EXE 파일과 Native AOT를 만드는 것에 초점을 두고 있지만, 네이티브 라이브러리를 프로듀싱하는 것도 가능합니다. 예를 들어 다음과 같이 C# 코드 파일을 작성하고, dotnet publish File.cs
명령을 실행하면 64비트 Windows용 DLL을 만들 수 있습니다.
#:property OutputType=Library
#:property RuntimeIdentifier=windows-x64
using System.Runtime.InteropServices;
internal static class NativeEntryPoints
{
[UnmanagedCallersOnly(EntryPoint = "mymethod")]
public static void MyMethod(nint ptrText)
{
if (ptrText == default)
return;
string? text = Marshal.PtrToStringUni(ptrText);
Console.WriteLine($"{DateTime.Now} {text}");
}
}
그 후 실제로 만들어진 DLL 파일이 정상적으로 Signature Export를 가지고 있는지 Depdency Walker 류의 툴로 DLL을 열어보면 잘 만들어져있는 것을 확인할 수 있습니다. 그리고 당연한 이야기이지만, .NET 런타임과 관련해서는 어디에도 종속된 내용 없이 순수한 네이티브 DLL로 만들어진 것도 확인할 수 있습니다.
File-based App은 이 뿐 아니라 필요하면 언제든 csproj로 스케일 업 할 수 있는 것도 장점입니다.
개인적으로는 이제 Visual Studio 다음 버전, 그리고 다음 C# Dev Kit 릴리스에서 File-based App에 대한 지원이 충실히 이루어지기만 한다면 더할 나위 없이 좋겠다는 생각을 해봅니다.