diff options
author | AnakinSklavenwalker <Anakin@gmx-topmail.de> | 2021-04-24 00:46:14 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-24 00:46:14 +0300 |
commit | 634a37d3f2be7b8c72a612fce7b4907a12533d4c (patch) | |
tree | bca0f06f2667ef0873e8669d4e3ead6aa0c50f33 | |
parent | 7b8ee049a151204997eecf587c69acc2f67c8405 (diff) |
Fix resolving from a ModuleReference (#730)
* add failing test
* Fix resolving from netmodules
Co-authored-by: Jb Evain <jb@evain.net>
-rw-r--r-- | Mono.Cecil.PE/ImageWriter.cs | 2 | ||||
-rw-r--r-- | Mono.Cecil/AssemblyReader.cs | 8 | ||||
-rw-r--r-- | Mono.Cecil/AssemblyWriter.cs | 6 | ||||
-rw-r--r-- | Mono.Cecil/MetadataResolver.cs | 3 | ||||
-rw-r--r-- | Test/Mono.Cecil.Tests/ResolveTests.cs | 35 |
5 files changed, 47 insertions, 7 deletions
diff --git a/Mono.Cecil.PE/ImageWriter.cs b/Mono.Cecil.PE/ImageWriter.cs index b33efe3..7e5e923 100644 --- a/Mono.Cecil.PE/ImageWriter.cs +++ b/Mono.Cecil.PE/ImageWriter.cs @@ -784,7 +784,7 @@ namespace Mono.Cecil.PE { int GetStrongNameLength () { - if (module.Assembly == null) + if (module.kind == ModuleKind.NetModule || module.Assembly == null) return 0; var public_key = module.Assembly.Name.PublicKey; diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index 2a59358..d5b34b7 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -182,7 +182,7 @@ namespace Mono.Cecil { ReadCustomAttributes (module); var assembly = module.Assembly; - if (assembly == null) + if (module.kind == ModuleKind.NetModule || assembly == null) return; ReadCustomAttributes (assembly); @@ -667,8 +667,10 @@ namespace Mono.Cecil { AssemblyResolver = module.AssemblyResolver }; - modules.Add (ModuleDefinition.ReadModule ( - GetModuleFileName (name), parameters)); + var netmodule = ModuleDefinition.ReadModule (GetModuleFileName (name), parameters); + netmodule.assembly = this.module.assembly; + + modules.Add (netmodule); } return modules; diff --git a/Mono.Cecil/AssemblyWriter.cs b/Mono.Cecil/AssemblyWriter.cs index 4fc264d..200410e 100644 --- a/Mono.Cecil/AssemblyWriter.cs +++ b/Mono.Cecil/AssemblyWriter.cs @@ -94,7 +94,7 @@ namespace Mono.Cecil { if (module.symbol_reader != null) module.symbol_reader.Dispose (); - var name = module.assembly != null ? module.assembly.Name : null; + var name = module.assembly != null && module.kind != ModuleKind.NetModule ? module.assembly.Name : null; var fq_name = stream.value.GetFileName (); var timestamp = parameters.Timestamp ?? module.timestamp; var symbol_writer_provider = parameters.SymbolWriterProvider; @@ -1018,7 +1018,7 @@ namespace Mono.Cecil { var assembly = module.Assembly; - if (assembly != null) + if (module.kind != ModuleKind.NetModule && assembly != null) BuildAssembly (); if (module.HasAssemblyReferences) @@ -1035,7 +1035,7 @@ namespace Mono.Cecil { BuildTypes (); - if (assembly != null) { + if (module.kind != ModuleKind.NetModule && assembly != null) { if (assembly.HasCustomAttributes) AddCustomAttributes (assembly); diff --git a/Mono.Cecil/MetadataResolver.cs b/Mono.Cecil/MetadataResolver.cs index 630ec8a..6511b41 100644 --- a/Mono.Cecil/MetadataResolver.cs +++ b/Mono.Cecil/MetadataResolver.cs @@ -115,6 +115,9 @@ namespace Mono.Cecil { case MetadataScopeType.ModuleDefinition: return GetType ((ModuleDefinition) scope, type); case MetadataScopeType.ModuleReference: + if (type.Module.Assembly == null) + return null; + var modules = type.Module.Assembly.Modules; var module_ref = (ModuleReference) scope; for (int i = 0; i < modules.Count; i++) { diff --git a/Test/Mono.Cecil.Tests/ResolveTests.cs b/Test/Mono.Cecil.Tests/ResolveTests.cs index bb57570..bce0003 100644 --- a/Test/Mono.Cecil.Tests/ResolveTests.cs +++ b/Test/Mono.Cecil.Tests/ResolveTests.cs @@ -247,6 +247,41 @@ namespace Mono.Cecil.Tests { } } + [Test] + public void ResolveModuleReferenceFromMemberReferenceTest () + { + using (var mma = AssemblyDefinition.ReadAssembly (GetAssemblyResourcePath ("mma.exe"))) { + var modB = mma.Modules [2]; + var bazType = modB.GetType ("Module.B.Baz"); + var gazonkMethod = bazType.Methods.First (m => m.Name.Equals ("Gazonk")); + var callInstr = gazonkMethod.Body.Instructions [1]; + + var methodRef = callInstr.Operand as MethodReference; + var methodTypeRef = methodRef.DeclaringType; + + Assert.AreEqual (mma, methodTypeRef.Module.Assembly); + + var def = methodTypeRef.Resolve (); + Assert.IsNotNull (def); + Assert.AreEqual ("Module.A.Foo", def.FullName); + } + } + + [Test] + public void ResolveModuleReferenceFromMemberReferenceOfSingleNetModuleTest () + { + using (var modb = ModuleDefinition.ReadModule (GetAssemblyResourcePath ("modb.netmodule"))) { + var bazType = modb.GetType ("Module.B.Baz"); + var gazonkMethod = bazType.Methods.First (m => m.Name.Equals ("Gazonk")); + var callInstr = gazonkMethod.Body.Instructions [1]; + + var methodRef = callInstr.Operand as MethodReference; + var methodTypeRef = methodRef.DeclaringType; + + Assert.IsNull (methodTypeRef.Module.Assembly); + Assert.IsNull (methodTypeRef.Resolve ()); + } + } TRet GetReference<TDel, TRet> (TDel code) { var @delegate = code as Delegate; |