diff --git a/SabreTools.Serialization/Extensions/PortableExecutable.cs b/SabreTools.Serialization/Extensions/PortableExecutable.cs
index ed865f3a..b77a0b26 100644
--- a/SabreTools.Serialization/Extensions/PortableExecutable.cs
+++ b/SabreTools.Serialization/Extensions/PortableExecutable.cs
@@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
-using System.IO;
-using System.Xml.Serialization;
using SabreTools.Data.Models.COFF;
using SabreTools.Data.Models.PortableExecutable;
-using SabreTools.Data.Models.PortableExecutable.Resource.Entries;
using SabreTools.IO.Extensions;
#pragma warning disable IDE0017 // Simplify object initialization
@@ -151,28 +148,6 @@ namespace SabreTools.Data.Extensions
// TODO: Implement other resource types from https://learn.microsoft.com/en-us/windows/win32/menurc/resource-file-formats
#region Resources
- ///
- /// Read resource data as a side-by-side assembly manifest
- ///
- /// Resource data entry to parse into a side-by-side assembly manifest
- /// A filled side-by-side assembly manifest on success, null on error
- public static AssemblyManifest? AsAssemblyManifest(this Models.PortableExecutable.Resource.DataEntry? entry)
- {
- // If we have an invalid entry, just skip
- if (entry?.Data is null)
- return null;
-
- try
- {
- var serializer = new XmlSerializer(typeof(AssemblyManifest));
- return serializer.Deserialize(new MemoryStream(entry.Data)) as AssemblyManifest;
- }
- catch
- {
- return null;
- }
- }
-
///
/// Read resource data as a string table resource
///
diff --git a/SabreTools.Serialization/Readers/PortableExecutable.cs b/SabreTools.Serialization/Readers/PortableExecutable.cs
index 2fbf4d31..3e5bebf3 100644
--- a/SabreTools.Serialization/Readers/PortableExecutable.cs
+++ b/SabreTools.Serialization/Readers/PortableExecutable.cs
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
+using System.Xml.Serialization;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.COFF;
using SabreTools.Data.Models.COFF.SymbolTableEntries;
@@ -521,6 +522,25 @@ namespace SabreTools.Serialization.Readers
return obj;
}
+ ///
+ /// Parse a byte array into an AssemblyManifest
+ ///
+ /// Byte array to parse
+ /// Offset into the byte array
+ /// Filled AssemblyManifest on success, null on error
+ public static Data.Models.PortableExecutable.Resource.Entries.AssemblyManifest? ParseAssemblyManifest(byte[] data)
+ {
+ try
+ {
+ var serializer = new XmlSerializer(typeof(Data.Models.PortableExecutable.Resource.Entries.AssemblyManifest));
+ return serializer.Deserialize(new MemoryStream(data)) as Data.Models.PortableExecutable.Resource.Entries.AssemblyManifest;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
///
/// Parse a byte array into an attribute certificate table
///
diff --git a/SabreTools.Serialization/Wrappers/PortableExecutable.Printing.cs b/SabreTools.Serialization/Wrappers/PortableExecutable.Printing.cs
index 6a1da020..dd1e41b1 100644
--- a/SabreTools.Serialization/Wrappers/PortableExecutable.Printing.cs
+++ b/SabreTools.Serialization/Wrappers/PortableExecutable.Printing.cs
@@ -1645,7 +1645,7 @@ namespace SabreTools.Serialization.Wrappers
string padding = new(' ', (level + 1) * 2);
AssemblyManifest? assemblyManifest = null;
- try { assemblyManifest = entry.AsAssemblyManifest(); } catch { }
+ try { assemblyManifest = Readers.PortableExecutable.ParseAssemblyManifest(entry.Data); } catch { }
if (assemblyManifest is null)
{
diff --git a/SabreTools.Serialization/Wrappers/PortableExecutable.cs b/SabreTools.Serialization/Wrappers/PortableExecutable.cs
index 503b567f..83b605c2 100644
--- a/SabreTools.Serialization/Wrappers/PortableExecutable.cs
+++ b/SabreTools.Serialization/Wrappers/PortableExecutable.cs
@@ -1940,7 +1940,7 @@ namespace SabreTools.Serialization.Wrappers
value = entry.Data;
break;
case ResourceType.RT_MANIFEST:
- _assemblyManifest = entry.AsAssemblyManifest();
+ _assemblyManifest = Readers.PortableExecutable.ParseAssemblyManifest(entry.Data);
value = _assemblyManifest;
break;