Browse Source

don't write app.manifest if it is default

pull/2186/head
文煌 5 years ago committed by Siegfried Pammer
parent
commit
908c3081e9
  1. 42
      ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs
  2. 10
      ICSharpCode.Decompiler/Util/Win32Resources.cs

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

@ -384,7 +384,7 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler @@ -384,7 +384,7 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
}
byte[] appManifest = CreateApplicationManifest(resources);
if (appManifest != null)
if (appManifest != null && !IsDefaultApplicationManifest(appManifest))
{
File.WriteAllBytes(Path.Combine(TargetDirectory, "app.manifest"), appManifest);
yield return ("ApplicationManifest", "app.manifest");
@ -403,7 +403,7 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler @@ -403,7 +403,7 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
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))?.FirstDirectory()?.FirstData()?.Data;
if (iconGroup == null)
return null;
@ -438,7 +438,7 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler @@ -438,7 +438,7 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
for (int i = 0; i < iconCount; i++)
{
var icon = iconDir.FindDirectory(new Win32ResourceName(pIconGroup->idEntries[i].nID))?.Datas.FirstOrDefault()?.Data;
var icon = iconDir.FindDirectory(new Win32ResourceName(pIconGroup->idEntries[i].nID))?.FirstData()?.Data;
if (icon == null)
return null;
writer.Write(icon);
@ -481,7 +481,41 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler @@ -481,7 +481,41 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
unsafe static byte[] CreateApplicationManifest(Win32ResourceDirectory resources)
{
return resources.Find(new Win32ResourceName(RT_MANIFEST))?.Directories.FirstOrDefault()?.Datas.FirstOrDefault()?.Data;
return resources.Find(new Win32ResourceName(RT_MANIFEST))?.FirstDirectory()?.FirstData()?.Data;
}
static bool IsDefaultApplicationManifest(byte[] appManifest)
{
const string DEFAULT_APPMANIFEST =
"<?xmlversion=\"1.0\"encoding=\"UTF-8\"standalone=\"yes\"?><assemblyxmlns=\"urn:schemas-microsoft-com" +
":asm.v1\"manifestVersion=\"1.0\"><assemblyIdentityversion=\"1.0.0.0\"name=\"MyApplication.app\"/><tr" +
"ustInfoxmlns=\"urn:schemas-microsoft-com:asm.v2\"><security><requestedPrivilegesxmlns=\"urn:schemas-" +
"microsoft-com:asm.v3\"><requestedExecutionLevellevel=\"asInvoker\"uiAccess=\"false\"/></requestedPri" +
"vileges></security></trustInfo></assembly>";
string s = CleanUpApplicationManifest(appManifest);
return s == DEFAULT_APPMANIFEST;
}
static string CleanUpApplicationManifest(byte[] appManifest)
{
bool bom = appManifest.Length >= 3 && appManifest[0] == 0xEF && appManifest[1] == 0xBB && appManifest[2] == 0xBF;
string s = Encoding.UTF8.GetString(appManifest, bom ? 3 : 0, appManifest.Length - (bom ? 3 : 0));
var sb = new StringBuilder(s.Length);
for (int i = 0; i < s.Length; i++)
{
char c = s[i];
switch (c)
{
case '\t':
case '\n':
case '\r':
case ' ':
continue;
}
sb.Append(c);
}
return sb.ToString();
}
#endregion

10
ICSharpCode.Decompiler/Util/Win32Resources.cs

@ -141,6 +141,16 @@ namespace ICSharpCode.Decompiler.Util @@ -141,6 +141,16 @@ namespace ICSharpCode.Decompiler.Util
}
return null;
}
public Win32ResourceDirectory FirstDirectory()
{
return Directories.Count != 0 ? Directories[0] : null;
}
public Win32ResourceData FirstData()
{
return Datas.Count != 0 ? Datas[0] : null;
}
}
[DebuggerDisplay("Data: {Name}")]

Loading…
Cancel
Save