我正在使用Mono.Cecil(0.9.5.4)将代码注入我的一些程序集中。我需要做的一些调用是System.ComponentModel命名空间中的对象。我怎样才能找到需要调用的'MethodReferences'?
我尝试了什么:
AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(dllPath);
var objectModelRef = assembly.MainModule.AssemblyReferences.First(i => i.Name == "System.ObjectModel")
var objectModelAssembly = assembly.MainModule.AssemblyResolver.Resolve(objectModelRef);
但是objectmodelAssembly.MainModule.Types
中没有实际的类型。
我也试过这个:
AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(dllPath);
var system = new DefaultAssemblyResolver().Resolve("System");
var objectIWantToInject = assembly.MainModule.Import(FindType(...));
在安装了完整.net 4.5的计算机上可以正常工作。但由于我的程序集是PCL,当我尝试在WinPhone上执行时,我得到了'System'的FileNotFound。
因此,如果我想为TypeDefinition
获取System.ComponentModel.ProgressChangedEventArgs
的实例,然后我就可以调用某些方法,那我该怎么办?
答案 0 :(得分:1)
在您的代码中:
AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(dllPath);
var system = new DefaultAssemblyResolver().Resolve("System");
var objectIWantToInject = assembly.MainModule.Import(FindType(...));
我认为您至少缺少一次导入,例如
assembly.MainModule.Import(typeof(System.ObjectModel);
我相信你还需要“解决”它以进一步向下走。
以下是任何感受同样痛苦的人的工作样本:
assembly.MainModule.Import(typeof(string));
var methodBaseRef = assembly.MainModule.Import(typeof(System.Reflection.MethodBase));
var getMemberInfo = assembly.MainModule.Import(typeof(System.Reflection.MemberInfo));
var getMemberInfoResolver = getMemberInfo.Resolve();
var getCurrentMethodRef = assembly.MainModule.Import(typeof(System.Reflection.MethodBase).GetMethod("GetCurrentMethod"));
var get_DeclaringType = assembly.MainModule.Import(getMemberInfoResolver.Methods.Single(m => m.Name == "get_DeclaringType"));
var getTypeInfo = assembly.MainModule.Import(typeof(Type));
var name = assembly.MainModule.Import(typeof(Type).GetMethod("Name"));