2011年7月22日

[筆記]解決XP無法執行.NET應用程式的問題

某個使用 C#.NET 4.0 撰寫的 Windows Form 應用程式

在 Vista / Win7 的電腦都能正常運行,唯獨 XP 電腦無法執行

已經確認正常安裝,只是在執行後(點兩下)就直接關閉



初步懷疑是 XP 的版本並沒有在 SP3 以上

經確認後,版本是正確的

接著懷疑是 XP 並沒有正確安裝 .NET 4.0

強迫建議使用者重新安裝之後 ... 問題依舊存在

後來懷疑是 Microsoft.VisualBasic.PowerPacks 未安裝

也是強迫建議使用者重新安裝之後 ... 問題依舊存在

似乎不是底層有缺損的問題,這時候就需要應用程式為何會起始失敗的資訊了

參考網路上前輩的範例 [C#]顯示未處理的例外錯誤

確實在程式起始的期間,有發生例外 :

於 System.RuntimeMethodHandle._SerializationInvoke(IRuntimeMethodInfo method, Object target, SignatureStruct& declaringTypeSig, SerializationInfo info, StreamingContext context)

   於 System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context)

   於 System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder)

   於 System.Runtime.Serialization.ObjectManager.DoFixups()

   於 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)

   於 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)

   於 System.Resources.ResourceReader.DeserializeObject(Int32 typeIndex)

   於 System.Resources.ResourceReader._LoadObjectV2(Int32 pos, ResourceTypeCode& typeCode)

   於 System.Resources.ResourceReader.LoadObjectV2(Int32 pos, ResourceTypeCode& typeCode)

   於 System.Resources.ResourceReader.LoadObject(Int32 pos, ResourceTypeCode& typeCode)

   於 System.Resources.RuntimeResourceSet.GetObject(String key, Boolean ignoreCase, Boolean isString)

   於 System.Resources.RuntimeResourceSet.GetObject(String key, Boolean ignoreCase)

   於 System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream)

   於 System.Resources.ResourceManager.GetObject(String name)

   於 Form1.Form1.InitializeComponent()

...(以下略)


很明顯地,這是因為 準備讀入某項資源 的時候發生了無法處裡的例外造成的 ...

初步懷疑是內建預設的 properties 讀取失敗

不過這個 project 剛好沒有使用到資源,所以排除此問題

那剩下的有啥資源會是初始化的時候要讀取進來的呢?

猛然瞄到有個 .ico 檔案躺在專案底下,詢問之後,發現這是 使用者自訂圖示

原本認為是檔案損毀,結果外部檢查的結果檔案是正常的

正在查看中不經意地發現,圖示檔案大小居然是 256 x 256 (大型圖示)

印象中這在 XP 時代是沒有的東西,有可能不支援

強迫建議換掉圖示檔案之後,重新 publish ...

BOOM! 茶包消滅! 原來真的是因為圖示無法初始化導致應用程式啟動失敗 orz

如果你的視窗應用程式必須要發佈給XP的使用者,請不要使用超過 32 x 32 的圖示檔案!!

微軟我真是猜不透你呀XD

===

這問題實在是太噁心了,特此撰文留念

沒有留言: