2

I have a installer app with a embedded .resx file with some information, like server name, port, password etc... I have to generate this installer (this process is automated, and is done through our website) for each customer. This is working fine I use ildasm for disassembler and replace the resx file, and then I use ilasm to make .exe again. But after this process the .exe lost our icon, putting the default one in it's place.

I cannot find a way to change the default icon.

Thanks

4

1 回答 1

4

您错过了 C# 程序中一个相当模糊的细节。编译器生成的可执行文件还包含非托管资源。必需,因为 Windows 对托管资源一无所知。这是您可以使用 Visual Studio 看到的。使用 File + Open + File 并选择由 C# 编译器生成的 .exe。需要 RTM 版本,它不适用于 Express。

您将看到您的程序至少有 3 个节点:

  • RT_MANIFEST 包含可执行文件的清单。 在以后的 Windows 版本中非常重要,它声明程序与 UAC 兼容。它可以防止 Windows 将您的程序视为早期的 Windows 程序,当它执行 UAC 禁止的事情时需要被欺骗,例如尝试将文件写入受保护的目录并尝试在 HKLM 中创建注册表项。manifest 的内容在大多数程序中是默认的,您可以通过“Application Manifest File”项目项模板获取自定义的内容。

  • “版本”包含可执行文件的版本资源。它包含您在使用 Windows 资源管理器查看可执行文件的属性时看到的信息。它的内容是从您的 AssemblyInfo.cs 源代码文件中的 [assembly:] 属性自动生成的。

  • “图标”包含程序的图标资源。你没有的那个。

您需要使用 ilasm.exe 的 /resource 选项将这些非托管资源嵌入到修补的可执行文件中。这需要一个 .res 文件,即非托管资源的编译版本,由 rc.exe Windows SDK 工具生成。请注意,这也是如何在项目 + 属性、应用程序选项卡、资源文件单选按钮中公开的。

你不能忽视这个要求,你可以在没有 Icon 资源但没有清单的情况下生活,尤其是在安装程序中。从原始可执行文件中获取 .res 文件将很困难,相当确定 ildasm.exe 不支持反编译它。如果像 Resource Hacker 这样的工具不能做到这一点,那么您需要为您的程序创建一个 .res 文件。或者回顾一下使用 ildasm.exe 做你想做的事的智慧。

于 2013-06-20T12:20:56.227 回答