【发布时间】:2012-02-26 10:00:36
【问题描述】:
有一个Resource Hacker 程序允许更改其他win32(64) dll 和exe 文件中的资源。
我需要做同样的事情,但要以编程方式。是否可以使用.Net框架来做到这一点?做这件事的好起点是什么?
【问题讨论】:
有一个Resource Hacker 程序允许更改其他win32(64) dll 和exe 文件中的资源。
我需要做同样的事情,但要以编程方式。是否可以使用.Net框架来做到这一点?做这件事的好起点是什么?
【问题讨论】:
你必须使用BeginUpdateResource、UpdateResource和EndUpdateResource WinApi函数,尝试this page检查这些函数的pinvoke .Net签名,你也可以检查这个项目ResourceLib。
【讨论】:
作者指向另一个工具“XN Resource Editor”,它带有源代码(虽然是Delphi,而不是.NET)。
这应该足以查看正在使用哪些函数并使用它们的 .NET 等效项。
【讨论】:
看看Anolis.Resourcer。这似乎是你需要的东西
作为 Anolis.Core 的测试平台开发的 ResHacker 克隆并替换 ResHacker(因为 ResHacker 不支持 x64,XN 资源编辑器(ResHacker 的精神续集)不支持多语言资源并且经常崩溃,以及其他实用程序休息要花实际的钱。它具有强大而简化的 UI,不会重复命令或将用户与特殊情况的处理程序混淆(ResHacker 和 XN 都有)。
【讨论】:
请注意,如果您正在处理签名的 EXE 或 DLL,这些都不起作用。
【讨论】:
好吧,我认为这不是一件容易的事,所以我将使用 Resource Hacker 的command line interface。
【讨论】:
如果您想直接从 .NET 执行此操作,则有一个名为 Ressy 的库正是用于此目的。它既提供对资源的低级操作(即处理原始字节流),也提供高级操作(即替换图标、清单、版本信息等)。
添加或覆盖资源:
using Ressy;
var portableExecutable = new PortableExecutable("C:/Windows/System32/notepad.exe");
portableExecutable.SetResource(
new ResourceIdentifier(
ResourceType.Manifest,
ResourceName.FromCode(1),
new Language(1033)
),
new byte[] { 0x01, 0x02, 0x03 }
);
获取资源数据:
using Ressy;
var portableExecutable = new PortableExecutable("C:/Windows/System32/notepad.exe");
var resource = portableExecutable.GetResource(new ResourceIdentifier(
ResourceType.Manifest,
ResourceName.FromCode(1),
new Language(1033)
));
var resourceData = resource.Data; // byte[]
var resourceString = resource.ReadAsString(Encoding.UTF8); // string
设置文件图标:
using Ressy;
using Ressy.HighLevel.Icons;
var portableExecutable = new PortableExecutable("C:/Windows/System32/notepad.exe");
portableExecutable.SetIcon("new_icon.ico");
有关更多示例,请参阅readme。
【讨论】: