36 const int ContainsNoMetaData = 0x0001;
38 readonly
string location;
40 readonly Module[] externalModules;
48 base(manifestModule.Universe)
50 this.location = location;
51 this.manifestModule = manifestModule;
52 externalModules =
new Module[manifestModule.FileTable.records.Length];
57 get {
return location ??
""; }
62 return GetNameImpl(
ref manifestModule.AssemblyTable.records[0]);
68 name.Name = manifestModule.GetString(rec.Name);
69 name.Version =
new Version(rec.MajorVersion, rec.MinorVersion, rec.BuildNumber, rec.RevisionNumber);
70 name.SetPublicKey(rec.PublicKey.IsNil ==
false ? manifestModule.GetBlobCopy(rec.PublicKey) : Array.Empty<
byte>());
71 name.CultureName = rec.Culture.IsNil ==
false ? manifestModule.GetString(rec.Culture) :
"";
72 name.HashAlgorithm = (AssemblyHashAlgorithm)rec.HashAlgId;
73 name.CodeBase = CodeBase;
75 manifestModule.GetPEKind(out var peKind, out var machine);
79 case ImageFileMachine.I386:
81 if ((peKind & (PortableExecutableKinds.Required32Bit | PortableExecutableKinds.Preferred32Bit)) != 0)
82 name.ProcessorArchitecture = ProcessorArchitecture.X86;
83 else if ((rec.Flags & 0x70) == 0x70)
84 name.ProcessorArchitecture = ProcessorArchitecture.None;
86 name.ProcessorArchitecture = ProcessorArchitecture.MSIL;
88 case ImageFileMachine.IA64:
89 name.ProcessorArchitecture = ProcessorArchitecture.IA64;
91 case ImageFileMachine.AMD64:
92 name.ProcessorArchitecture = ProcessorArchitecture.Amd64;
94 case ImageFileMachine.ARM:
95 name.ProcessorArchitecture = ProcessorArchitecture.Arm;
97 case ImageFileMachine.ARM64:
98 name.ProcessorArchitecture = ProcessorArchitecture.Arm64;
102 name.RawFlags = (AssemblyNameFlags)rec.Flags;
108 if (externalModules.Length == 0)
109 return manifestModule.GetTypes();
111 var list =
new List<Type>();
113 list.AddRange(module.GetTypes());
115 return list.ToArray();
118 internal override Type FindType(
TypeName typeName)
120 var type = manifestModule.FindType(typeName);
121 for (
int i = 0; type ==
null && i < externalModules.Length; i++)
122 if ((manifestModule.FileTable.records[i].Flags & ContainsNoMetaData) == 0)
128 internal override Type FindTypeIgnoreCase(
TypeName lowerCaseName)
130 var type = manifestModule.FindTypeIgnoreCase(lowerCaseName);
131 for (
int i = 0; type ==
null && i < externalModules.Length; i++)
132 if ((manifestModule.FileTable.records[i].Flags & ContainsNoMetaData) == 0)
133 type =
GetModule(i).FindTypeIgnoreCase(lowerCaseName);
140 get {
return manifestModule.__ImageRuntimeVersion; }
145 get {
return manifestModule; }
150 List<Module> list =
new List<Module>();
151 list.Add(manifestModule);
152 foreach (Module m
in externalModules)
159 return list.ToArray();
164 if (externalModules.Length == 0)
166 return new Module[] { manifestModule };
170 List<Module> list =
new List<Module>();
171 list.Add(manifestModule);
172 for (
int i = 0; i < manifestModule.FileTable.records.Length; i++)
174 if (getResourceModules || (manifestModule.FileTable.records[i].Flags & ContainsNoMetaData) == 0)
179 return list.ToArray();
185 if (name.Equals(manifestModule.ScopeName, StringComparison.OrdinalIgnoreCase))
186 return manifestModule;
188 var index = GetModuleIndex(name);
195 int GetModuleIndex(
string name)
197 for (
int i = 0; i < manifestModule.FileTable.records.Length; i++)
198 if (name.Equals(manifestModule.GetString(manifestModule.FileTable.records[i].Name), StringComparison.OrdinalIgnoreCase))
206 if (externalModules[index] !=
null)
207 return externalModules[index];
209 return LoadModule(index,
null, manifestModule.GetString(manifestModule.FileTable.records[index].Name));
212 private Module LoadModule(
int index,
byte[] rawModule,
string name)
214 var location = name ==
null ? null : Path.Combine(Path.GetDirectoryName(
this.location), name);
215 if ((manifestModule.FileTable.records[index].Flags & ContainsNoMetaData) != 0)
217 return externalModules[index] =
new ResourceModule(manifestModule, index, location);
221 if (rawModule ==
null)
225 rawModule = File.ReadAllBytes(location);
227 catch (FileNotFoundException)
229 if (resolvers !=
null)
231 var arg =
new ResolveEventArgs(name,
this);
232 foreach (var resolver
in resolvers)
234 var module = resolver(
this, arg);
240 if (Universe.MissingMemberResolution)
241 return externalModules[index] =
new MissingModule(
this, index);
246 return externalModules[index] =
new ModuleReader(
this, manifestModule.Universe,
new MemoryStream(rawModule), location,
false);
250 public override Module
LoadModule(
string moduleName,
byte[] rawModule)
252 int index = GetModuleIndex(moduleName);
254 throw new ArgumentException();
256 if (externalModules[index] !=
null)
257 return externalModules[index];
259 return LoadModule(index, rawModule,
null);
264 get {
return manifestModule.GetEntryPoint(); }
269 return manifestModule.GetManifestResourceNames();
274 return manifestModule.GetManifestResourceInfo(resourceName);
279 return manifestModule.GetManifestResourceStream(resourceName);
284 return manifestModule.__GetReferencedAssemblies();
289 return (AssemblyNameFlags)manifestModule.AssemblyTable.records[0].Flags;
294 get {
return manifestModule.GetString(manifestModule.AssemblyTable.records[0].Name); }
297 internal override IList<CustomAttributeData> GetCustomAttributesData(
Type attributeType)
299 return CustomAttributeData.GetCustomAttributesImpl(
null, manifestModule, 0x20000001, attributeType) ?? CustomAttributeData.EmptyList;