Trying resolving System.Runtime types to mscorlib

This works around what seems to be missing entries in the SDK.

Fixes #98
This commit is contained in:
Frank A. Krueger 2018-04-25 16:26:59 -07:00
parent 6b3581bb6c
commit 0877dfb7df
No known key found for this signature in database
GPG Key ID: 0471C67474FFE664
1 changed files with 41 additions and 4 deletions

View File

@ -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;
}
}
}
}