我丢失了 dotnet 3.5 dll 的源代码,该 dll 包含我所有的字符串(html 文档)和图像。我现在需要更新其中一个文档和一些图像。对我来说更新文件中字符串的最佳方法是什么(它们的长度会不同,这有关系吗?)
3 回答
步骤#1:拆卸组件。
使用以下命令来反汇编您的 .net exe 或 dll:
ildasm /out=assembly_name.il assembly_name.dll
(将 assembly_name.dll 替换为您的 dll 或 exe 名称)。
这将输出大量数据文件。我们对这些感兴趣:
- *.resources - 二进制资源文件。
- assembly_name.res - 资源清单。
- assembly_name.il - 实际的 MSIL 代码。
步骤#2:编辑资源文件。
准备修改的/新的资源,不管它的名字是什么,但格式应该与最初包含在程序集中的格式相同(例如,将位图替换为位图,将图标替换为图标)。
使用资源编辑器编辑资源文件。我使用Lutz Roeder 的Resourcer for DotNet ( http://www.aisto.com/roeder/dotnet/ ),它是免费软件。顺便说一句,同一位作者还编写了 Reflector.NET,这是一个非常适合 .NET 开发人员的工具。
如果您使用的是 Resourcer,则需要执行以下步骤:
- 打开要更改的 .resources 文件并重命名原始资源项。
- 按 Ctrl-F 插入文件并从文件系统中选择修改后的版本。
- 将新项目重命名为与前一个项目具有相同的原始名称(您不能为此复制/粘贴,由于某种原因,它只会复制整个项目而不仅仅是文本)。
步骤#3:重新组装组件。
使用以下命令来反汇编您的 .net exe 或 dll:
重要提示:这将覆盖原来的 dll/exe !
ilasm /resource=assembly_name.res /dll /output=assembly_name.dll /key=signing_key.snk assembly_name.il
(将 assembly_name.dll 替换为您的 dll 或 exe 名称,当然如果需要,将 /dll 更改为 /exe)。
签名密钥参数是可选的,仅当原始程序集已签名时才需要。
当然,如果它是由其他人签名以防止回火,除非您提供原始签名密钥,否则您将无法使用修改后的程序集,我假设您不会拥有。但这就是 .NET 的工作方式。
直接编辑已编译的程序集是粗略的。我会用反编译器将它反编译回源代码并正确修复它。也将其放回源代码控制中。
So it turns out that it's easier to
EDIT THE DLL WITH A HEX EDITOR
than it is to START OVER which is the usual advice.