如何从exe文件中提取与用于创建此exe相同的.ico文件

本文关键字:文件 exe ico 创建 提取 用于 | 更新日期: 2023-09-27 17:55:04

我正在尝试制作一些SFX:制作一个程序,在另一个wrapped.exe周围生成一个wrapped.exe。

wrapped.exe嵌入wrapped.exe作为资源,并且在执行时,wrapped.exe被保存到临时文件夹中,使用特定的命令行参数执行,然后删除。wrapped.exe并不总是一个。net程序,我没有它的源代码。

wrap .exe应该在。net 3.5中完成,以便在Windows 7 SP1和更高版本上可用,而无需事先安装任何。net。

packaging .exe是用c#程序在。net 4.6中使用Roselyn生成的。

我需要包装。exe被可视化像包装。exe由资源管理器。我用硬编码的。ico文件做了一个成功的测试。代码看起来像这样(简化):

var compilation = CSharpCompilation.Create(...);
var resourceDescription = new ResourceDescription( resourceName: "SFX.resourceName",
                                                   dataProvider: () => File.OpenRead("wrapped.exe"),
                                                   isPublic:     false);
using (var iconStream = File.OpenRead(@"wrapped.ico"))
using (var peStream = File.Create("wrapping.exe"))
using (var pdbStream = File.Create("wrapping.pdb"))
using (var win32resStream = compilation.CreateDefaultWin32Resources(
                                                              versionResource:  true,
                                                              noManifest:       false,
                                                              manifestContents: null,
                                                              iconInIcoFormat:  iconStream))
{
    var emitResult = compilation.Emit( peStream:          peStream,
                                       pdbStream:         pdbStream,
                                       manifestResources: new[] { resourceDescription },
                                       win32Resources:    win32resStream,
                                       options:           new EmitOptions(subsystemVersion: SubsystemVersion.Windows7));
  return emitResult;
}

现在我尝试从"wrapped.exe"中获取iconStream。我试过替换:

using (var iconStream = File.OpenRead(@"wrapped.ico"))

:

var iconStream = new MemoryStream();
Icon icon = Icon.ExtractAssociatedIcon("wrapped.exe");
icon.Save(iconStream);
iconStream.Seek(0, SeekOrigin.Begin);

但是我只得到一个32*32的图标。

如何提取完全相同的。ico文件(包括所有格式,例如16*16 32位BMP, 32*32位BMP, 48*48 32位BMP, 64*64 32位BMP和256*256 32位PNG)用于创建"wrapped.exe"?

如何从exe文件中提取与用于创建此exe相同的.ico文件

也有网站做这项工作https://extracico.com/

这是非常容易使用IconLib。这个问题已经得到了回应:谢谢@Plutonix!

使用以下辅助函数(当然,提取图标文件名不会硬编码):

static Stream GetIconStream_ExtractIconUsingIconLib(string fileToExecute)
{
    var multiIcon = new MultiIcon();
    multiIcon.Load(fileToExecute);
    var extractedicoFileName = @"c:'temp'icon.ico";
    multiIcon.Save(extractedicoFileName, MultiIconFormat.ICO);
    return File.OpenRead(extractedicoFileName);
}

我们只需要替换:

File.OpenRead(@"wrapped.ico")

GetIconStream_ExtractIconUsingIconLib("wrapped.exe")

这给了我们完整的解决方案:

var compilation = CSharpCompilation.Create(...);
var resourceDescription = new ResourceDescription( resourceName: "SFX.resourceName",
                                                   dataProvider: () => File.OpenRead("wrapped.exe"),
                                                   isPublic:     false);
using (var iconStream = GetIconStream_ExtractIconUsingIconLib("wrapped.exe"))
using (var peStream = File.Create("wrapping.exe"))
using (var pdbStream = File.Create("wrapping.pdb"))
using (var win32resStream = compilation.CreateDefaultWin32Resources(
                                                              versionResource:  true,
                                                              noManifest:       false,
                                                              manifestContents: null,
                                                              iconInIcoFormat:  iconStream))
{
    var emitResult = compilation.Emit( peStream:          peStream,
                                       pdbStream:         pdbStream,
                                       manifestResources: new[] { resourceDescription },
                                       win32Resources:    win32resStream,
                                       options:           new EmitOptions(subsystemVersion: SubsystemVersion.Windows7));
  return emitResult;
}