丢失源码的Windows Forms应用打印机修改及Crystal Reports报错问询
报错根因
从抛出的异常栈可以判断,问题由两处硬编码逻辑共同触发:
- 程序调用水晶报表接口时,尝试读取硬编码路径下的
.rpt报表模板文件,当前运行环境不存在对应路径或文件 - 打印逻辑内写死了历史打印机名称,当前环境未配置同名打印机
无需源码的解决方案
- 修复报表文件路径问题:使用Process Monitor工具,筛选对应exe的文件访问事件,触发打印操作后查看程序尝试访问的
.rpt文件的完整路径,手动创建对应目录并将报表文件放入该路径即可。 - 修复打印机名称不匹配问题:打开Windows控制面板「打印机和扫描仪」设置页,将当前使用的打印机重命名为程序硬编码的历史打印机名称即可。如果不知道历史打印机名称,可通过dnSpy工具反编译exe,提取
SendPrint方法内的硬编码字符串。 - 临时应急方案:安装同名虚拟打印机(如PDF虚拟打印机),先将内容打印为PDF文件,再使用实际打印机打印PDF文件。
找回源码/永久修复方案
- 该程序是.NET框架开发的WinForm应用,直接使用dnSpy、ILSpy等.NET反编译工具即可反编译exe及依赖dll,几乎可以还原完整的C#业务源码,你可以直接提取硬编码的配置值,也可以直接修改反编译后的IL代码,重新生成修复后的exe文件永久解决硬编码问题。即使程序做了普通混淆,硬编码的字符串也可以正常提取。
- 排查旧开发设备、移动存储介质、云存储内的历史项目压缩包、备份文件,也有可能找到原始源码。
内容的提问来源于stack exchange,提问作者Rasool Aghajani
相关产品推荐
相关产品推荐

