• .net反射解析dll时 关联dll的加载


    问题:

    一个解析器:

    using System;
    using System.Reflection;
    using System.Collections.Generic;
    using System.Text;

    classProgram
    {
       
    staticvoid Main(string[] args)
        {
           
    string filename = args[0];
           
    Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename);

           
    Console.WriteLine("Opened assembly:{0}", filename);
           
    foreach (Type t in a.GetTypes())
            {
               
    Console.WriteLine("  " + t.FullName);
            }
        }
    }

    使用:

    type_sniff.exe type_sniff.exe
    Openedassembly:type_sniff.exe
      Program

      但是当dll中有关联时,如:
    // defined in a.dll
    publicclass Foo
    {
       
    public Foo()
        {
        }
    }

    // defined in b.dll, compiled as /r:a.dll
    publicclass Bar : Foo
    {
        Bar()
        {
        }
    }

    运行: type_sniff.exe b.dll

    C:\bug\type_sniff\type_sniff\bin\Debug>type_sniff.exe b.dll
    Opened assembly:b.dll
    Unhandled Exception: System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
    at System.Reflection.Module.GetTypesInternal(StackCrawlMark& stackMark)
    at System.Reflection.Assembly.GetTypes()
    at Program.Main(String[] args) 
    Exception 的message为:

    {"Cannot resolve dependency to assembly 'a, Version=2.1.0.0, Culture=neutral, PublicKeyToken=ebb8d478f63174c0'

    because it has not been preloaded. When using the ReflectionOnly APIs,

    dependent assemblies must be pre-loaded or loaded on demand through

    the ReflectionOnlyAssemblyResolve event.":"a, Version=2.1.0.0, Culture=neutral, PublicKeyToken=ebb8d478f63174c0"}

    解决方法:

    ReflectionOnlyAssemblyResolve event时加入需要加载的dll进来, 这里假设dll都在working directory

    using System;
    using System.Reflection;
    using System.Collections.Generic;
    using System.Text;

    classProgram
    {
       
    staticvoid Main(string[] args)
        {
           
    string filename = args[0];
           
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += newResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
           
    Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename);

           
    Console.WriteLine("Opened assembly:{0}", filename);
           
    foreach (Type t in a.GetTypes())
            {
               
    Console.WriteLine("  " + t.FullName);
            }
        }

       
    staticAssembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
        {
           
    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
        }
    }


  • 相关阅读:
    qt预览的UI界面和实际运行出来的界面分辨率不一样
    QByteArray转QString 例如 0x45 转成 “45”
    QML访问C++成员函数报错:TypeError: Property 'showHome' of object [object Object] is not a function
    Qt生成二维码
    Android解析编译之后的所有文件(so,dex,xml,arsc)格式
    Android逆向之旅---解析编译之后的Dex文件格式
    Android逆向之旅---解析编译之后的Resource.arsc文件格式
    Android逆向之旅---解析编译之后的AndroidManifest文件格式
    Android签名机制之---签名验证过程详解
    Android签名机制之---签名过程详解
  • 原文地址:https://www.cnblogs.com/liangouyang/p/1321203.html
Copyright © 2020-2023  润新知