using System; using System.IO; using System.Reflection.Metadata; using System.Reflection.PortableExecutable; var dllPath = @"C:\Program Files (x86)\Seewo\EasiNote5\EasiNote5_5.2.4.9855\Main\EasiNote.OfficeDocumentConverter.dll"; using var stream = File.OpenRead(dllPath); using var pe = new PEReader(stream); // Check PE characteristics var headers = pe.PEHeaders; Console.WriteLine($"Machine: {headers.CoffHeader.Machine}"); Console.WriteLine($"Characteristics: {headers.CoffHeader.Characteristics}"); Console.WriteLine($"Is32Bit: {headers.CoffHeader.Characteristics.HasFlag(Characteristics.Bit32Machine)}"); Console.WriteLine($"IsDll: {headers.CoffHeader.Characteristics.HasFlag(Characteristics.Dll)}"); Console.WriteLine($"IsExecutable: {headers.CoffHeader.Characteristics.HasFlag(Characteristics.ExecutableImage)}"); Console.WriteLine($"IsLargeAddressAware: {headers.CoffHeader.Characteristics.HasFlag(Characteristics.LargeAddressAware)}"); Console.WriteLine($"\nOptional Header Magic: {headers.PEHeader.Magic} (0x10B=PE32, 0x20B=PE32+)"); Console.WriteLine($"Subsystem: {headers.PEHeader.Subsystem}"); // Check the .NET metadata for architecture requirements var mr = pe.GetMetadataReader(); var asmDef = mr.GetAssemblyDefinition(); Console.WriteLine($"\nAssembly: {mr.GetString(asmDef.Name)} v{asmDef.Version}"); // Print target framework attribute Console.WriteLine("\nCustom Attributes:"); foreach (var ch in asmDef.GetCustomAttributes()) { var ca = mr.GetCustomAttribute(ch); // Try to get the attribute constructor name if (ca.Constructor.Kind == HandleKind.MemberReference) { var mref = mr.GetMemberReference((MemberReferenceHandle)ca.Constructor); if (mref.Parent.Kind == HandleKind.TypeReference) { var tref = mr.GetTypeReference((TypeReferenceHandle)mref.Parent); var attrName = $"{mr.GetString(tref.Namespace)}.{mr.GetString(tref.Name)}"; Console.WriteLine($" {attrName}"); } } } // Print referenced system assemblies Console.WriteLine("\nReferenced System Assemblies:"); foreach (var aref in mr.AssemblyReferences) { var ar = mr.GetAssemblyReference(aref); var name = mr.GetString(ar.Name); if (name.StartsWith("System") || name.StartsWith("Microsoft") || name == "WindowsBase" || name == "PresentationCore" || name == "PresentationFramework") Console.WriteLine($" {name} v{ar.Version}"); }