[WinUI 3] Main() 진입점 접근

사실 이 팁은 다음의 글에서 발견했습니다.

이 글은 WinUI 에서 단일 인스턴스를 처리하기 위한 방법인데, 이를 위해서는 Main()에 접근을 해야 하고, 덕분에 자동으로 생성되는 코드인 App.g.i.cs 코드를 살펴볼 수 있었습니다. 이 파일 뿐만 아니라
obj/x64/Debug/net6.0-windows10.0.19041.0(플랫폼 및 TFM에 따라 다를 수 있음) 에 위치하는 여러 자동생성된 코드를 살펴볼 수 있습니다.

| App.g.i.cs

...
#if !DISABLE_XAML_GENERATED_MAIN
    /// <summary>
    /// Program class
    /// </summary>
    public static class Program
    {
        [global::System.Runtime.InteropServices.DllImport("Microsoft.ui.xaml.dll")]
        private static extern void XamlCheckProcessRequirements();

        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 1.0.0.0")]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.STAThreadAttribute]
        static void Main(string[] args)
        {
            XamlCheckProcessRequirements();
            
            global::WinRT.ComWrappersSupport.InitializeComWrappers();
            global::Microsoft.UI.Xaml.Application.Start((p) => {
                var context = new global::Microsoft.UI.Dispatching.DispatcherQueueSynchronizationContext(global::Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread());
                global::System.Threading.SynchronizationContext.SetSynchronizationContext(context);
                new App();
            });
        }
    }
#endif
...

정의된 상수인 DISABLE_XAML_GENERATED_MAIN에 따라 생성된 코드를 포함하거나 포함하지 않는데요, csproj 설정파일에 DISABLE_XAML_GENERATED_MAIN 상수를 정의하는 것으로

<PropertyGroup>
...
   <defineconstants>DISABLE_XAML_GENERATED_MAIN</defineconstants>
...
</PropertyGroup>

Program.cs등으로 직접 Main() 메소드를 작성할 수 있게 됩니다. (반드시 기존 위의 코드는 포함되어야 합니다)

이 시점에서 유용한 것은 비단 단일 인스턴스 뿐만 아니라 스플래시스크린 등 실행파일을 실행하자마자 처리되면 좋을 것들이 됩니다. (WinUI 3는 아직 스플래시스크린을 지원하지 않습니다.)

3개의 좋아요