Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnakinSklavenwalker <Anakin@gmx-topmail.de>2021-04-24 00:46:14 +0300
committerGitHub <noreply@github.com>2021-04-24 00:46:14 +0300
commit634a37d3f2be7b8c72a612fce7b4907a12533d4c (patch)
treebca0f06f2667ef0873e8669d4e3ead6aa0c50f33
parent7b8ee049a151204997eecf587c69acc2f67c8405 (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.cs2
-rw-r--r--Mono.Cecil/AssemblyReader.cs8
-rw-r--r--Mono.Cecil/AssemblyWriter.cs6
-rw-r--r--Mono.Cecil/MetadataResolver.cs3
-rw-r--r--Test/Mono.Cecil.Tests/ResolveTests.cs35
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;