사실 이 팁은 다음의 글에서 발견했습니다.
이 글은 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는 아직 스플래시스크린을 지원하지 않습니다.)