Skip to content

Commit

Permalink
Merge pull request #111 from mstyura/master
Browse files Browse the repository at this point in the history
#110: Made type lookup more robust. Fixed exception on .NET Standard …
  • Loading branch information
tpluscode committed Oct 16, 2017
2 parents e2026dc + 2bdc6c8 commit 42284be
Showing 1 changed file with 41 additions and 24 deletions.
65 changes: 41 additions & 24 deletions Common/SystemTypesResolver.cs
@@ -1,3 +1,4 @@
using System;
using System.Linq;
using Mono.Cecil;

Expand All @@ -15,18 +16,13 @@ public partial class ModuleWeaver
public void LoadSystemTypes()
{
var mscorlib = AssemblyResolver.Resolve(new AssemblyNameReference("mscorlib", null));
var typeType = mscorlib?.MainModule.Types.FirstOrDefault(x => x.Name == "Type");
if (typeType == null)
{
var runtime = AssemblyResolver.Resolve(new AssemblyNameReference("System.Runtime",null));
typeType = runtime.MainModule.Types.First(x => x.Name == "Type");
}
var funcDefinition = typeType.Module.Types.FirstOrDefault(x => x.Name == "Func`1");
if (funcDefinition == null)
{
var core = AssemblyResolver.Resolve(new AssemblyNameReference("System.Core", null));
funcDefinition = core.MainModule.Types.First(x => x.Name == "Func`1");
}
var runtime = AssemblyResolver.Resolve(new AssemblyNameReference("System.Runtime", null));
var core = AssemblyResolver.Resolve(new AssemblyNameReference("System.Core", null));

var typeType = LoadTypeDefinition("System.Type", mscorlib, runtime, core);

var funcDefinition = LoadTypeDefinition("System.Func`1", mscorlib, runtime, core);

var genericInstanceType = new GenericInstanceType(funcDefinition);
genericInstanceType.GenericArguments.Add(ModuleDefinition.TypeSystem.String);
GenericFunc = ModuleDefinition.ImportReference(genericInstanceType);
Expand All @@ -41,24 +37,45 @@ public void LoadSystemTypes()
GetTypeFromHandle = ModuleDefinition.ImportReference(GetTypeFromHandle);


var stringType = mscorlib?.MainModule.Types.FirstOrDefault(x => x.Name == "String");
if (stringType == null)
{
var runtime = AssemblyResolver.Resolve(new AssemblyNameReference("System.Runtime", null));
stringType = runtime.MainModule.Types.First(x => x.Name == "String");
}
var stringType = LoadTypeDefinition("System.String", mscorlib, runtime, core);

ConcatMethod = ModuleDefinition.ImportReference(stringType.FindMethod("Concat", "String", "String"));
FormatMethod = ModuleDefinition.ImportReference(stringType.FindMethod("Format", "String", "Object[]"));
ObjectArray = new ArrayType(ModuleDefinition.TypeSystem.Object);

var exceptionType = mscorlib?.MainModule.Types.FirstOrDefault(x => x.Name == "Exception");
if (exceptionType == null)
{
var runtime = AssemblyResolver.Resolve(new AssemblyNameReference("System.Runtime",null));
exceptionType = runtime.MainModule.Types.First(x => x.Name == "Exception");
}
var exceptionType = LoadTypeDefinition("System.Exception", mscorlib, runtime, core);
ExceptionType = ModuleDefinition.ImportReference(exceptionType);

}

private TypeDefinition LoadTypeDefinition(
string typeFullName,
params AssemblyDefinition[] canidateAssemblies)
{
foreach (var candidateAssembly in canidateAssemblies)
{
if (candidateAssembly == null)
{
continue;
}
foreach (var assemblyModule in candidateAssembly.Modules)
{
var typeDef = assemblyModule.Types.FirstOrDefault(x => x.FullName == typeFullName);
if (typeDef != null)
{
LogInfo?.Invoke(String.Format("[SystemTypeResolver] Loaded type {0} from {1}", typeDef.FullName, typeDef.Module.FileName));
return typeDef;
}
var exportedType = assemblyModule.ExportedTypes.FirstOrDefault(x => x.FullName == typeFullName);
var exportedTypeDef = exportedType?.Resolve();
if (exportedTypeDef != null)
{
LogInfo?.Invoke(String.Format("[SystemTypeResolver] Loaded type (type-forwarded) {0} from {1}", exportedTypeDef.FullName, exportedTypeDef.Module.FileName));
return exportedTypeDef;
}
}
}
throw new WeavingException($"[SystemTypeResolver] Unable to find {typeFullName} among [{String.Join(", ", canidateAssemblies.OfType<AssemblyDefinition>())}]");
}

}

0 comments on commit 42284be

Please sign in to comment.