in src/Tasks/Microsoft.NET.Build.Tasks/AppHost.cs [275:313]
private static unsafe void SetWindowsGraphicalUserInterfaceBit(
MemoryMappedViewAccessor accessor,
string appHostSourcePath)
{
byte* pointer = null;
try
{
accessor.SafeMemoryMappedViewHandle.AcquirePointer(ref pointer);
byte* bytes = pointer + accessor.PointerOffset;
// https://en.wikipedia.org/wiki/Portable_Executable
UInt32 peHeaderOffset = ((UInt32*)(bytes + PEHeaderPointerOffset))[0];
if (accessor.Capacity < peHeaderOffset + SubsystemOffset + sizeof(UInt16))
{
throw new BuildErrorException(Strings.AppHostNotWindows, appHostSourcePath);
}
UInt16* subsystem = ((UInt16*)(bytes + peHeaderOffset + SubsystemOffset));
// https://docs.microsoft.com/en-us/windows/desktop/Debug/pe-format#windows-subsystem
// The subsystem of the prebuilt apphost should be set to CUI
if (subsystem[0] != WindowsCUISubsystem)
{
throw new BuildErrorException(Strings.AppHostNotWindowsCLI, appHostSourcePath);
}
// Set the subsystem to GUI
subsystem[0] = WindowsGUISubsystem;
}
finally
{
if (pointer != null)
{
accessor.SafeMemoryMappedViewHandle.ReleasePointer();
}
}
}