3
我有一些需要在XP/2003/Vista/7/2008/8/2012上运行的Windows Forms应用程序,并且在用户选择大字体或更高的DPI。在app.manifest中启用DPI感知适用于Vista及更高版本,但在XP/2003上,由于不支持的清单条目,应用程序会报告错误。需要dpiAware可执行文件在Windows XP/2003下工作
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<asmv1:application>
<asmv1:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv1:windowsSettings>
</asmv1:application>
</asmv1:assembly>
运行与清单中的应用程序在Windows 2003会导致此错误消息:
This application has failed to start because the application
configuration is incorrect.
,并记录此Windows事件消息:
The element asmv1:application appears as a child of element
urn:schemas-microsoft-com:asm.v1^assembly which is not supported
by this version of Windows.
是否可以申报清单在某种程度上允许XP/2003忽略他们不支持的这部分清单?或者我必须删除清单并对SetProcessDPIAware进行有条件的调用(即使我读过的所有内容建议不要使用该API函数)?
号配套10多年历史的老操作系统不得到是一个有损命题。您几乎不用担心SetProcessDPIAware可能导致的初始化竞争问题,即时编译器可以帮助避免陷阱。只需在您的Main()方法中解决它。 – 2013-02-26 18:51:25
世界上还有很多Windows XP和Server 2003,所以它就是这样。 SetProcessDPIAware工作正常。我希望有一种方法可以在新操作系统版本中使dpiAware清单能够工作,并且在旧操作系统版本中可以忽略,但我并不打算在这个特定的墙上击败我的头。 – 2013-02-26 23:02:27
这很奇怪。我在我的一个应用程序的清单文件中使用' true ',它在Windows 2000上一直运行良好。当然,这是一个本地C++应用程序,而不是.NET WinForms,所以我认为它是。正在读取清单文件信息并抛出错误的.NET Framework。 (我没有检查过Windows事件日志以查看是否有记录,可能是,我并不太在意这个;应用程序运行文件。) –
2016-07-01 13:59:03