解决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行代码。
 

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