5 using System
.IO
.Compression
;
6 using System
.Reflection
;
9 static ZipArchiveEntry
FindSpecFile (ZipArchive zip
) {
10 foreach (var entry
in zip
.Entries
) {
11 if (entry
.Name
.EndsWith (".nuspec"))
14 throw new Exception ("Could not find nuspec file");
17 static void DumpNuget (string nupkg
) {
18 var zip
= new ZipArchive(new FileStream (nupkg
, FileMode
.Open
));
20 var nuspec
= FindSpecFile (zip
);
21 var l
= XElement
.Load (new StreamReader (nuspec
.Open ()));
22 var version
= (from el
in l
.Descendants() where el
.Name
.LocalName
== "version" select el
.Value
).FirstOrDefault ();
25 // Logic copied from https://github.com/NuGet/NuGet.Client/blob/4cccb13833ad29d6a0bcff055460d964f1b49cfe/src/NuGet.Core/NuGet.Frameworks/DefaultFrameworkMappings.cs#L385
27 var entries
= from e
in zip
.Entries where e
.FullName
.StartsWith ("lib/net4") && e
.Name
.EndsWith (".dll") select e
;
28 if (!entries
.Any ()) {
29 entries
= from e
in zip
.Entries where e
.FullName
.StartsWith ("lib/netstandard1") && e
.Name
.EndsWith (".dll") select e
;
32 foreach (var et
in entries
) {
33 LoadAndDump (et
, version
);
37 static bool dump_asm
, dump_ver
;
38 static void Main (string[] args
) {
40 if (args
.Length
> 1) {
41 dump_asm
= args
[1].Equals ("asm");
42 dump_ver
= args
[1].Equals ("ver");
46 foreach (var f
in Directory
.GetFiles (args
[0], "*.nupkg")) {
51 static byte[] StreamToArray (Stream s
) {
52 using(var ms
= new MemoryStream ()) {
58 static int domain_id
= 1;
59 static void LoadAndDump (ZipArchiveEntry entry
, string version
) {
60 // Console.WriteLine ("Dumping {0}", entry);
61 var data
= StreamToArray (entry
.Open ());
62 AppDomain ad
= AppDomain
.CreateDomain ("parse_" + ++domain_id
);
63 DoParse p
= (DoParse
)ad
.CreateInstanceAndUnwrap (typeof (DoParse
).Assembly
.FullName
, typeof (DoParse
).FullName
);
64 p
.ParseAssembly (data
, version
, entry
.Name
, entry
.FullName
, dump_asm
, dump_ver
);
65 AppDomain
.Unload (ad
);
69 class DoParse
: MarshalByRefObject
{
71 static int Hash (string str
) {
73 for (int i
= 0; i
< str
.Length
; ++i
)
74 h
= ((h
<< 5) + h
) ^ str
[i
];
77 static string FileToEnum (string name
) {
79 case "System.Runtime.InteropServices.RuntimeInformation.dll": return "SYS_RT_INTEROP_RUNTIME_INFO";
80 case "System.Globalization.Extensions.dll": return "SYS_GLOBALIZATION_EXT";
81 case "System.IO.Compression.dll": return "SYS_IO_COMPRESSION";
82 case "System.Net.Http.dll": return "SYS_NET_HTTP";
83 case "System.Text.Encoding.CodePages.dll": return "SYS_TEXT_ENC_CODEPAGES";
84 case "System.Reflection.DispatchProxy.dll": return "SYS_REF_DISP_PROXY";
85 case "System.ValueTuple.dll": return "SYS_VALUE_TUPLE";
86 default: throw new Exception ($"No idea what to do with {name}");
90 static string FileToMoniker (string p
) {
91 var parts
= p
.Split (Path
.DirectorySeparatorChar
);
92 return parts
[parts
.Length
- 2];
95 public void ParseAssembly (byte[] data
, string version
, string name
, string fullname
, bool dump_asm
, bool dump_ver
) {
96 var a
= Assembly
.ReflectionOnlyLoad (data
);
97 var m
= a
.GetModules ()[0];
98 var id
= m
.ModuleVersionId
.ToString ().ToUpper ();
99 var hash_code
= Hash (id
).ToString ("X");
100 var str
= FileToEnum (name
);
102 string ver_str
= version
+ " " + FileToMoniker (fullname
);
105 Console
.WriteLine ($"IGNORED_ASSEMBLY (0x{hash_code}, {str}, \"{id}\", \"{ver_str}\"),");
107 //IGNORED_ASM_VER (SYS_IO_COMPRESSION, 4, 1, 2, 0),
108 var ver
= a
.GetName ().Version
;
110 Console
.WriteLine ($"IGNORED_ASM_VER ({str}, {ver.Major}, {ver.Minor}, {ver.Build}, {ver.Revision}),");