如何使用Mono.Cecil在System命名空间中加载类型?

时间:2014-08-19 15:13:42

标签: mono.cecil

我正在使用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的实例,然后我就可以调用某些方法,那我该怎么办?

1 个答案:

答案 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"));