From 0877dfb7df7960af3872d03c2aef0717ac0e78be Mon Sep 17 00:00:00 2001 From: "Frank A. Krueger" Date: Wed, 25 Apr 2018 16:26:59 -0700 Subject: [PATCH] Trying resolving System.Runtime types to mscorlib This works around what seems to be missing entries in the SDK. Fixes #98 --- Ooui.Wasm.Build.Tasks/BuildDistTask.cs | 45 +++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/Ooui.Wasm.Build.Tasks/BuildDistTask.cs b/Ooui.Wasm.Build.Tasks/BuildDistTask.cs index bb11585..cc2bff1 100644 --- a/Ooui.Wasm.Build.Tasks/BuildDistTask.cs +++ b/Ooui.Wasm.Build.Tasks/BuildDistTask.cs @@ -133,8 +133,12 @@ namespace Ooui.Wasm.Build.Tasks var asmPath = Path.GetFullPath (Assembly); var pipeline = GetLinkerPipeline (); - var resolver = new AsmResolver (this); - using (var context = new LinkContext (pipeline, resolver)) { + var resolver = new LinkerAssemblyResolver (this); + var asmParameters = new ReaderParameters { + AssemblyResolver = resolver, + MetadataResolver = new LinkerMetadataResolver (resolver) + }; + using (var context = new LinkContext (pipeline, resolver, asmParameters, new UnintializedContextFactory ())) { context.CoreAction = AssemblyAction.CopyUsed; context.UserAction = AssemblyAction.CopyUsed; context.OutputDirectory = managedPath; @@ -341,11 +345,11 @@ namespace Ooui.Wasm.Build.Tasks Log.LogMessage ($"HTML {htmlPath}"); } - class AsmResolver : Mono.Linker.AssemblyResolver + class LinkerAssemblyResolver : Mono.Linker.AssemblyResolver { BuildDistTask task; - public AsmResolver (BuildDistTask buildDistTask) + public LinkerAssemblyResolver (BuildDistTask buildDistTask) { task = buildDistTask; } @@ -369,5 +373,38 @@ namespace Ooui.Wasm.Build.Tasks return asm; } } + + class LinkerMetadataResolver : MetadataResolver + { + LinkerAssemblyResolver resolver; + + readonly AssemblyNameReference mscorlibScope = new AssemblyNameReference ("mscorlib", new Version (1, 0)); + + public LinkerMetadataResolver (LinkerAssemblyResolver asmResolver) + : base (asmResolver) + { + } + + public override TypeDefinition Resolve (TypeReference type) + { + var def = base.Resolve (type); + if (def != null) return def; + + var scope = type.Scope; + if (scope == null) return null; + + switch (scope.MetadataScopeType) { + case MetadataScopeType.AssemblyNameReference: { + AssemblyNameReference asmRef = (AssemblyNameReference)scope; + if (asmRef.Name == "System.Runtime") { + return base.Resolve (new TypeReference (type.Namespace, type.Name, type.Module, mscorlibScope)); + } + } + break; + } + + return def; + } + } } }