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