如何从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"?
也有网站做这项工作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;
}