Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Someta.Fody/BaseWeaver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void EmitInstanceArgument(ILProcessor il, MethodDefinition method)

public void ComposeTypeArgumentsIntoArray(ILProcessor il, MethodDefinition method)
{
var typeType = ModuleDefinition.ImportReference(typeof(Type));
var typeType = ModuleDefinition.GetTypeReference(typeof(Type));

// I don't fully understand this, but if this line isn't here, you'll get the error:
// Member 'System.Type' is declared in another module and needs to be imported
Expand Down
106 changes: 53 additions & 53 deletions Someta.Fody/CecilExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,45 +67,45 @@ internal static bool Initialize(ModuleDefinition moduleDefinition, TypeSystem ty
}
var extensionPointRegistryRegister = ModuleDefinition.FindMethod(extensionPointRegistry, "Register");

typeType = ModuleDefinition.ImportReference(typeof(Type)).Resolve();
typeType = ModuleDefinition.GetTypeReference(typeof(Type)).Resolve();
if (typeType == null)
{
throw new InvalidOperationException($"System.Type was somehow not found. Aborting.");
}

taskType = ModuleDefinition.ImportReference(typeof(Task));
taskType = ModuleDefinition.GetTypeReference(typeof(Task));
getTypeFromRuntimeHandleMethod = ModuleDefinition.ImportReference(typeType.Methods.Single(x => x.Name == "GetTypeFromHandle"));
typeGetMethods = ModuleDefinition.ImportReference(CaptureFunc<Type, MethodInfo[]>(x => x.GetMethods(default)));
typeGetMethod = ModuleDefinition.ImportReference(typeType.Methods.Single(x => x.Name == "GetMethod" && x.Parameters.Count == 5));
typeGetProperty = ModuleDefinition.ImportReference(CaptureFunc<Type, PropertyInfo>(x => x.GetProperty(default, default(BindingFlags))));
typeGetEvent = ModuleDefinition.ImportReference(CaptureFunc<Type, EventInfo>(x => x.GetEvent(default, default)));
taskTType = ModuleDefinition.ImportReference(typeof(Task<>));
taskTType = ModuleDefinition.GetTypeReference(typeof(Task<>));
taskFromResult = ModuleDefinition.ImportReference(taskType.Resolve().Methods.Single(x => x.Name == "FromResult"));
attributeType = ModuleDefinition.ImportReference(typeof(Attribute));
var attributeTypeDefinition = ModuleDefinition.ImportReference(typeof(Attribute)).Resolve();
var memberInfoType = ModuleDefinition.ImportReference(typeof(MemberInfo));
attributeType = ModuleDefinition.GetTypeReference(typeof(Attribute));
var attributeTypeDefinition = ModuleDefinition.GetTypeReference(typeof(Attribute)).Resolve();
var memberInfoType = ModuleDefinition.GetTypeReference(typeof(MemberInfo));
attributeGetCustomAttribute = ModuleDefinition.ImportReference(attributeTypeDefinition.Methods.Single(x => x.Name == nameof(Attribute.GetCustomAttribute) && x.Parameters.Count == 2 && x.Parameters[0].ParameterType.CompareTo(memberInfoType)));
attributeGetCustomAttributes = ModuleDefinition.ImportReference(attributeTypeDefinition.Methods.Single(x => x.Name == nameof(Attribute.GetCustomAttributes) && x.Parameters.Count == 1 && x.Parameters[0].ParameterType.CompareTo(memberInfoType)));
var assemblyType = ModuleDefinition.ImportReference(typeof(Assembly));
var assemblyType = ModuleDefinition.GetTypeReference(typeof(Assembly));
attributeGetCustomAttributesForAssembly = ModuleDefinition.ImportReference(attributeTypeDefinition.Methods.Single(x => x.Name == nameof(Attribute.GetCustomAttributes) && x.Parameters.Count == 1 && x.Parameters[0].ParameterType.CompareTo(assemblyType)));
var methodBaseType = ModuleDefinition.ImportReference(typeof(MethodBase));
var methodBaseType = ModuleDefinition.GetTypeReference(typeof(MethodBase));
methodBaseGetCurrentMethod = ModuleDefinition.FindMethod(methodBaseType, nameof(MethodBase.GetCurrentMethod));
typeGetAssembly = ModuleDefinition.ImportReference(typeType.Properties.Single(x => x.Name == nameof(Type.Assembly)).GetMethod);

var func1Type = ModuleDefinition.ImportReference(typeof(Func<>));
var func2Type = ModuleDefinition.ImportReference(typeof(Func<,>));
var action1Type = ModuleDefinition.ImportReference(typeof(Action<>));
var objectArrayType = ModuleDefinition.ImportReference(typeof(object[]));
var asyncTaskMethodBuilder = ModuleDefinition.ImportReference(typeof(AsyncTaskMethodBuilder<>));
var func1Type = ModuleDefinition.GetTypeReference(typeof(Func<>));
var func2Type = ModuleDefinition.GetTypeReference(typeof(Func<,>));
var action1Type = ModuleDefinition.GetTypeReference(typeof(Action<>));
var objectArrayType = ModuleDefinition.GetTypeReference(typeof(object[]));
var asyncTaskMethodBuilder = ModuleDefinition.GetTypeReference(typeof(AsyncTaskMethodBuilder<>));
var originalMethodAtttribute = ModuleDefinition.FindType("Someta.Reflection", "OriginalMethodAttribute", soMeta);
var originalMethodAttributeConstructor = ModuleDefinition.FindConstructor(originalMethodAtttribute);
var methodFinder = ModuleDefinition.FindType("Someta.Reflection", "MethodFinder`1", soMeta, "T");
var findMethod = ModuleDefinition.FindMethod(methodFinder, "FindMethod");
var findProperty = ModuleDefinition.FindMethod(methodFinder, "FindProperty");
var methodInfoType = ModuleDefinition.ImportReference(typeof(MethodInfo));
var propertyInfoType = ModuleDefinition.ImportReference(typeof(PropertyInfo));
var eventInfoType = ModuleDefinition.ImportReference(typeof(EventInfo));
var delegateType = ModuleDefinition.ImportReference(typeof(Delegate));
var methodInfoType = ModuleDefinition.GetTypeReference(typeof(MethodInfo));
var propertyInfoType = ModuleDefinition.GetTypeReference(typeof(PropertyInfo));
var eventInfoType = ModuleDefinition.GetTypeReference(typeof(EventInfo));
var delegateType = ModuleDefinition.GetTypeReference(typeof(Delegate));

var context = new WeaverContext
{
Expand All @@ -125,52 +125,52 @@ internal static bool Initialize(ModuleDefinition moduleDefinition, TypeSystem ty
DelegateType = delegateType,
ActionTypes = new List<TypeReference>
{
ModuleDefinition.ImportReference(typeof(Action)),
ModuleDefinition.ImportReference(typeof(Action<>)),
ModuleDefinition.ImportReference(typeof(Action<,>)),
ModuleDefinition.ImportReference(typeof(Action<,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Action<,,,,,,,,,,,,,,,>))
ModuleDefinition.GetTypeReference(typeof(Action)),
ModuleDefinition.GetTypeReference(typeof(Action<>)),
ModuleDefinition.GetTypeReference(typeof(Action<,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Action<,,,,,,,,,,,,,,,>))
},
FuncTypes = new List<TypeReference>
{
ModuleDefinition.ImportReference(typeof(Func<>)),
ModuleDefinition.ImportReference(typeof(Func<,>)),
ModuleDefinition.ImportReference(typeof(Func<,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,,,,,,,,>)),
ModuleDefinition.ImportReference(typeof(Func<,,,,,,,,,,,,,,,,>))
ModuleDefinition.GetTypeReference(typeof(Func<>)),
ModuleDefinition.GetTypeReference(typeof(Func<,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,,,,,,,,>)),
ModuleDefinition.GetTypeReference(typeof(Func<,,,,,,,,,,,,,,,,>))
},
OriginalMethodAttributeConstructor = originalMethodAttributeConstructor,
FindMethod = findMethod,
MethodFinder = methodFinder,
MethodInfoType = methodInfoType,
PropertyInfoType = propertyInfoType,
EventInfoType = eventInfoType,
ValueType = ModuleDefinition.ImportReference(typeof(ValueType)),
ValueType = ModuleDefinition.GetTypeReference(typeof(ValueType)),
RegisterExtensionPoint = extensionPointRegistryRegister
};
Context = context;
Expand Down
30 changes: 30 additions & 0 deletions Someta.Fody/ReferenceFinder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Mono.Cecil;
using System;
using System.Linq;

namespace Someta.Fody
{
internal static class ReferenceFinder
{
internal static TypeReference GetTypeReference(this ModuleDefinition moduleDefinition, Type type, string netCoreAssemblyHint = null)
{
var importedType = moduleDefinition.ImportReference(type);
// On .NET Core, we need to rewrite mscorlib types to use the
// dot net assemblies from the weaved assembly and not the ones
// used by the weaver itself.
if (importedType is TypeSpecification)
return importedType;

var scope = importedType.Scope;
if (scope.Name != moduleDefinition.TypeSystem.CoreLibrary.Name)
scope = moduleDefinition.TypeSystem.CoreLibrary;

if (scope.Name == "System.Runtime" && netCoreAssemblyHint != null)
scope = new AssemblyNameReference(netCoreAssemblyHint,
moduleDefinition.AssemblyReferences.First(mr => mr.Name == "System.Runtime").Version);

importedType.Scope = scope;
return importedType;
}
}
}