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

我试图做一些SFX:使一个程序生成一个wrapping.exe围绕另一个wrapped.exe。

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

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

Wrapping.exe是使用.Net 4.6中的Roselyn使用C#程序生成的。

我需要wrapping.exe通过资源pipe理器像wrapped.exe一样可视化。 我用硬编码的.ico文件做了一个成功的testing。 代码看起来像这样(简体):

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。 我试图replace:

 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 32位BMP,48 * 48 32位BMP,64 * 64 32位BMP和256 * 256 32位PNG)作为一个用来创build“wrapped.exe”?

Solutions Collecting From Web of "如何从exe文件中提取与用于创build此exe文件相同的.ico文件?"

使用IconLib这非常简单。 答复已经在这个问题上 :Thx to @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; }