Browse Source

write app manifest

pull/2186/head
文煌 5 years ago committed by Siegfried Pammer
parent
commit
4a8cca26a1
  1. 4
      ICSharpCode.Decompiler/CSharp/ProjectDecompiler/ProjectFileWriterSdkStyle.cs
  2. 23
      ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs

4
ICSharpCode.Decompiler/CSharp/ProjectDecompiler/ProjectFileWriterSdkStyle.cs

@ -193,6 +193,10 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
var (itemType, fileName) = files.FirstOrDefault(t => t.itemType == "ApplicationIcon"); var (itemType, fileName) = files.FirstOrDefault(t => t.itemType == "ApplicationIcon");
if (fileName != null) if (fileName != null)
xml.WriteElementString("ApplicationIcon", fileName); xml.WriteElementString("ApplicationIcon", fileName);
(itemType, fileName) = files.FirstOrDefault(t => t.itemType == "ApplicationManifest");
if (fileName != null)
xml.WriteElementString("ApplicationManifest", fileName);
} }
static void WriteResources(XmlTextWriter xml, IEnumerable<(string itemType, string fileName)> files) static void WriteResources(XmlTextWriter xml, IEnumerable<(string itemType, string fileName)> files)

23
ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs

@ -370,19 +370,20 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
#endregion #endregion
#region WriteMiscellaneousFilesInProject #region WriteMiscellaneousFilesInProject
const int RT_ICON = 3;
const int RT_GROUP_ICON = 14;
protected virtual IEnumerable<(string itemType, string fileName)> WriteMiscellaneousFilesInProject(PEFile module) protected virtual IEnumerable<(string itemType, string fileName)> WriteMiscellaneousFilesInProject(PEFile module)
{ {
var resources = module.Reader.ReadWin32Resources(); var resources = module.Reader.ReadWin32Resources();
if (resources == null) if (resources == null)
yield break; yield break;
byte[] icon = CreateIcon(resources); byte[] appIcon = CreateApplicationIcon(resources);
File.WriteAllBytes(Path.Combine(TargetDirectory, "app.ico"), icon); File.WriteAllBytes(Path.Combine(TargetDirectory, "app.ico"), appIcon);
yield return ("ApplicationIcon", "app.ico"); yield return ("ApplicationIcon", "app.ico");
byte[] appManifest = CreateApplicationManifest(resources);
File.WriteAllBytes(Path.Combine(TargetDirectory, "app.manifest"), appIcon);
yield return ("ApplicationManifest", "app.manifest");
var appConfig = module.FileName + ".config"; var appConfig = module.FileName + ".config";
if (File.Exists(appConfig)) if (File.Exists(appConfig))
{ {
@ -391,7 +392,10 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
} }
} }
unsafe static byte[] CreateIcon(Win32ResourceDirectory resources) const int RT_ICON = 3;
const int RT_GROUP_ICON = 14;
unsafe static byte[] CreateApplicationIcon(Win32ResourceDirectory resources)
{ {
var iconGroup = resources.Find(new Win32ResourceName(RT_GROUP_ICON))?.Directories.FirstOrDefault()?.Datas.FirstOrDefault()?.Data; var iconGroup = resources.Find(new Win32ResourceName(RT_GROUP_ICON))?.Directories.FirstOrDefault()?.Datas.FirstOrDefault()?.Data;
if (iconGroup == null) if (iconGroup == null)
@ -466,6 +470,13 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
public uint dwBytesInRes; public uint dwBytesInRes;
public short nID; public short nID;
}; };
const int RT_MANIFEST = 24;
unsafe static byte[] CreateApplicationManifest(Win32ResourceDirectory resources)
{
return resources.Find(new Win32ResourceName(RT_MANIFEST))?.Directories.FirstOrDefault()?.Datas.FirstOrDefault()?.Data;
}
#endregion #endregion
/// <summary> /// <summary>

Loading…
Cancel
Save