解決WinForm逆向工程後,無法加載Form窗體資源的問題

目錄

問題描述

問題解決

第一步:確認資源是否存在

第二步:編寫解決代碼

說明


問題描述

今天需要逆向工程一個Windows Form 的項目,結果發現在打開設計頁面時出現如下錯誤:

此錯誤的實例(2)  
 
1.   zdcjDBtools Form1.cs 行:294 列:1   隱藏調用堆棧 
 
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement, CodePropertyReferenceExpression propertyReferenceEx, Boolean reportError)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement)  
 
2.   zdcjDBtools Form1.cs 行:332 列:1   隱藏調用堆棧 
 
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement, CodePropertyReferenceExpression propertyReferenceEx, Boolean reportError)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement)
在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement)  

具體對應的設計器的代碼如下(只寫相關行代碼):

 this.Tray.Icon = (Icon)manager.GetObject("Tray.Icon"); 

 base.Icon = ((Icon)manager.GetObject("$this.Icon"));

調試後提示如下:

System.Resources.MissingManifestResourceException:“未能找到任何適合於指定的區域性或非特定區域性的資源。請確保在編譯時已將“zdcjDBtools.Form1.resources”正確嵌入或鏈接到程序集“zdcjDBtools”,或者確保所有需要的附屬程序集都可加載並已進行了完全簽名。”

問題解決

第一步:確認資源是否存在

通過分析是因爲程序逆向工程後的 Form1.resx 文件不存在了,資源被合併到一個資源文件中,這裏的名字叫 “zdcjDBtools.Form1.resources”,此文件就在項目工程文件的根目錄下,通過逆襲工程軟件發現確實存在需要的資源,如圖(1)

圖(1)

第二步:編寫解決代碼

找到 Form1 的 構造函數中的 InitializeComponent 方法

註釋:ComponentResourceManager manager = new ComponentResourceManager(typeof(Form1));

增加如下代碼:

ResourceReader rrdr = new ResourceReader(Assembly.GetAssembly(typeof(Form1)).GetManifestResourceStream("zdcjDBtools.zdcjDBtools.Form1.resources"));

            //rrdr.GetResourceData("Tray.Icon", out string trayIconRsourceType, out byte[] trayIconResourceData);

            ResourceSet manager = new ResourceSet(rrdr);
            Icon trayIcon = (Icon)manager.GetObject("Tray.Icon");
            Icon _thisIcon = (Icon)manager.GetObject("$this.Icon");

至此問題解決

說明

GetResourceData 方法第一個參數是資源的Key,第二個參數是輸出內容的類型,第三個參數是輸出的2進制數組

如果需要自己處理可用這個方法,如果不需要則不需要這行代碼。

 Icon trayIcon = (Icon)manager.GetObject("Tray.Icon");

 Icon _thisIcon = (Icon)manager.GetObject("$this.Icon");

用於給定義的 Icon 變量賦值,如果直接使用生產的代碼段,則可不用這2行代碼。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章