目錄
問題描述
今天需要逆向工程一個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行代碼。