【问题标题】:How can I read a compiled resource (.res) file in C#?如何在 C# 中读取已编译的资源 (.res) 文件?
【发布时间】:2011-11-02 14:39:28
【问题描述】:

我有一个已编译的资源文件 (.res)。我需要用 C# 阅读它,以便我可以通过编程方式对其进行修改。请注意,这 不是 .resx 文件或 .rc 文件;该文件是编译的,而不是基于文本的。

到目前为止,我尝试查看 Win32 API 中的 LoadLibrary、LoadResource 等,但似乎这些函数仅适用于 可执行文件(.exe、.dll),而不适用于资源文件。

我尝试使用 BinaryReader 加载文件,但当然我无法理解生成的字节数组。 我想尝试使用 Marshal.PtrToStructure 但我不知道 res 文件的结构是什么。我有RESOURCEHEADER 的结构,但我不明白如何使用它(我承认我很少有本地代码经验)。

谁能帮我弄清楚如何成功读取和更新 .res 文件中的版本信息?

【问题讨论】:

  • 您可以链接.res 文件以创建仅资源DLL。但这显然是针对实际使用资源的用例,而不是以编程方式修改 .res 文件。

标签: c# resource-files


【解决方案1】:

很好的问题;我也找不到使用现有功能的好答案。好在 RES 文件格式似乎比较简单,记录在这里:

http://msdn.microsoft.com/en-us/library/ms648007(VS.85).aspx

您应该能够扫描 RES 文件以查找版本资源,然后更新相应的字段。请记住,资源标头是双字对齐的。

我唯一的其他建议是使用 LoadLibraryEx 并查看是否可以以某种方式将 RES 文件加载为数据文件。但听起来你已经尝试过了。如果您确实成功了,您可能会发现这个主题很有趣 - 这是一个如何在两个模块之间复制资源的示例:

http://msdn.microsoft.com/en-us/library/ms648008(VS.85).aspx

我怀疑它会起作用。我在 Dependency Walker 中加载了 RC.EXE,以查看它是否使用任何有趣的 API 来构建 RES 文件。没找到,只能假设RC.EXE直接写出RES文件。

【讨论】:

  • 感谢您的快速回答。我已经看过这个页面,但不知道如何理解它。我怎样才能获得版本部分?我知道它不是一开始的,但不知道如何找到它。
  • 我建议在十六进制编辑器中打开一个 RES 文件并尝试手动破译它以确保您理解格式。在我看来,资源只是一个接一个地连接起来。查看文件的开头,您应该会看到一个 RESOURCEHEADER 结构。练习解释它并学习如何从一个 RESOURCEHEADER 转到下一个。最终你应该找到一个定义版本资源的。然后您可以使用版本资源结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2011-09-30
  • 2013-03-21
相关资源
最近更新 更多