From b37f4af713fbb50145281022916e38bac01884c3 Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Mon, 13 Dec 2021 10:47:42 +0600 Subject: [PATCH 1/2] Add importing of netmodule --- Mono.Cecil/Import.cs | 49 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/Mono.Cecil/Import.cs b/Mono.Cecil/Import.cs index 272e96076..e353a4889 100644 --- a/Mono.Cecil/Import.cs +++ b/Mono.Cecil/Import.cs @@ -521,14 +521,33 @@ protected IMetadataScope ImportScope (IMetadataScope scope) return ImportReference ((AssemblyNameReference) scope); case MetadataScopeType.ModuleDefinition: if (scope == module) return scope; - return ImportReference (((ModuleDefinition) scope).Assembly.Name); + var moduleDefinition = (ModuleDefinition) scope; + if (moduleDefinition.Assembly == null) + return ImportReference (moduleDefinition); + else + return ImportReference (moduleDefinition.Assembly.Name); case MetadataScopeType.ModuleReference: - throw new NotImplementedException (); + return ImportReference ((ModuleReference) scope); } throw new NotSupportedException (); } + public virtual ModuleReference ImportReference (ModuleReference name) + { + Mixin.CheckName (name); + + ModuleReference reference; + if (module.TryGetModuleReference (name, out reference)) + return reference; + + reference = new ModuleReference (name.Name); + + module.ModuleReferences.Add (reference); + + return reference; + } + public virtual AssemblyNameReference ImportReference (AssemblyNameReference name) { Mixin.CheckName (name); @@ -771,6 +790,23 @@ public static bool TryGetAssemblyNameReference (this ModuleDefinition module, As return false; } + public static bool TryGetModuleReference (this ModuleDefinition module, ModuleReference name_reference, out ModuleReference module_reference) + { + var references = module.ModuleReferences; + + for (int i = 0; i < references.Count; i++) { + var reference = references [i]; + if (!Equals (name_reference, reference)) + continue; + + module_reference = reference; + return true; + } + + module_reference = null; + return false; + } + static bool Equals (byte [] a, byte [] b) { if (ReferenceEquals (a, b)) @@ -808,5 +844,14 @@ static bool Equals (AssemblyNameReference a, AssemblyNameReference b) return false; return true; } + + static bool Equals (ModuleReference a, ModuleReference b) + { + if (ReferenceEquals (a, b)) + return true; + if (a.Name != b.Name) + return false; + return true; + } } } From 7b5b9b6645f5de8b3741eff2526bd05c6c882769 Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Sat, 15 Jan 2022 22:54:09 +0600 Subject: [PATCH 2/2] Add test --- Test/Mono.Cecil.Tests/ImportCecilTests.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Test/Mono.Cecil.Tests/ImportCecilTests.cs b/Test/Mono.Cecil.Tests/ImportCecilTests.cs index 70100eac1..e21a5b7eb 100644 --- a/Test/Mono.Cecil.Tests/ImportCecilTests.cs +++ b/Test/Mono.Cecil.Tests/ImportCecilTests.cs @@ -286,6 +286,20 @@ public void ContextGenericTest () Assert.AreEqual ("Mono.Cecil.Tests.ImportCecilTests/Generic`1 Mono.Cecil.Tests.ImportCecilTests/Generic`1::ComplexGenericMethod(T,TS)", method.FullName); } + [Test] + public void ImportTypeFromOtherModule () + { + var fooModule = ModuleDefinition.CreateModule("Foo", ModuleKind.NetModule); + var foo = new TypeDefinition("", "Foo", 0, fooModule.TypeSystem.Object); + fooModule.Types.Add(foo); + + var mainModule = ModuleDefinition.CreateModule("Main", ModuleKind.NetModule); + mainModule.ModuleReferences.Add(fooModule); + var program = new TypeDefinition("", "Program", TypeAttributes.Class, mainModule.TypeSystem.Object); + var importedFooType = mainModule.ImportReference(foo); + Assert.AreEqual ("Foo", importedFooType.FullName); + } + delegate void Emitter (ModuleDefinition module, MethodBody body); static TDelegate Compile (Emitter emitter, [CallerMemberName] string testMethodName = null)