zoukankan      html  css  js  c++  java
  • .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);
        }
    }


  • 相关阅读:
    orale 命令行创建&删除数据库
    Oracle 之表分析
    电子商务分销历程
    乐宝分销,人人都是老板
    随手将TPaxScripter 3.0改成了支持Delphi 2009,Delphi 2010,Delphi Xe
    百丽强势布局B2C,20亿铺路改变其销售格局
    顺丰开通B2C商城,快递业欲抢多一寸电商蛋糕
    Exchange环境搭建心得
    c# 添加外部程序集相对引用问题
    Entity Framework Code First 学习
  • 原文地址:https://www.cnblogs.com/liangouyang/p/1321203.html
Copyright © 2011-2022 走看看