目录
System.ComponentModel.ComponentResourceManager manager未声明或从未赋值。
前言
最近开始一个窗体项目的反编译任务。使用了.NET Reflector 10 和ILSPy 两个软件进行反编译。而后合并两个软件的导出的源码。
下面整理两个软件的源码导出 以及导出后代码问题的处理。
一、源码怎么导出?
Reflector
项目右键,Export Source Code(导出源码)
导出的源码结构如下,导出的项目按命名空间一层建一个文件夹
对比两个软件导出的源码,我这里使用的是.NET Reflector 导出的源码。
选择源码目录下的.csproj文件,使用VS 2019 打开 。接下来针对源码问题进行处理。
二、资源文件处理
Reflector :资源文件是.resources(二进制)的格式。
1.使用Resgen做文件转换
可以使用微软的Resgen.exe(通用资源转换实用工具)将.resources(二进制)文件转成.resx文件(XML)
具体方法见:
Resgen.exe(资源文件生成器) - .NET Framework | Microsoft Docs
资源文件在最外层,转成.resx文件后,需要移动到对应的窗体目录下。
2.使用ILSPy导出的资源文件
ILSPy: 代码保存后,无需转换资源文件。直接将文件移动到对应目录下。
处理完后,使用记事本的方式打开.csproj文件,将EmbeddedResource节点下的.resources内嵌资源删除。
或者打开项目,把这些资源文件从项目中移除,然后将.res文件分别包括到项目中。
三、引用的处理
1. 外部引用
Reflector导出的源码,引用是失效的。 需要重新引用
2.框架引用
System. 这种引用失效,可能是框架版本太低,不支持。修改下就好了。
我这边的项目是net 2.0 。修改成net 4.0 就可以了
四、错误处理
“global::System.Runtime.Versioning.TargetFrameworkAttribute”特性重复
把报错这一句删除
五、遍历问题
错误信息1:无法在此范围中声明名为“item”的局部变量或参数,因为该名称在封闭局部范围中用于定义局部变量或参数
将item这个别名修改成其他的就可以了
错误信息2:“IEnumerator”: using 语句中使用的类型必须可隐式转换为“System.IDisposable”
一个类中可能会有多个遍历。从ILSPy导出的源码中找到对应的类,直接拷贝过来替换报错的类就OK了。
六、app.config
Reflector导出的源码 ,app.config是空的。
ILSpy 里有完整的配置信息。
因此这里也是从ILSPy导出的源码拷贝过来替换
七、创建窗体Designer文件
1.创建designer文件
在项目目录下,复制一个.cs 窗体文件 ,名字修改为 窗体名.Designer.cs
2.删除代码
打开项目,将Deigner文件包含在项目中。 保留控件声明 还有 Dispose 、 InitializeComponent() 方法。删除 : Form 窗体继承 、窗体加载事件、控件事件 以及其他业务处理方法。删除using 、
将类的修饰符修改为partial
在.cs文件里 和上面做相反的操作,在public 之后加上partial
3.控件加上命名控件
将 鼠标移动到 报错的地方,点击显示可能的修补程序。就可以看到该控件在哪个命名空间之下。
修改后为
4.报错处理:
System.ComponentModel.ComponentResourceManager manager未声明或从未赋值。
查看窗体设计器时,System.ComponentModel.ComponentResourceManager manager未声明或从未赋值。
处理方法:将 类名manager 修改为 resources
总结
1.反编译后的源码调整 可以参照有源码的窗体项目进行对比,然后进行修改。
2.目前项目可以调试起来正常登录,代码和源代码还是会有一些出入的,但在没源码的情况下,只能根据这个项目来了 ,后续有其他问题再继续记录~
评论记录:
回复评论: