【问题标题】:Reflection: Assembly.GetExportedTypes requires all assemblies to be present反射:Assembly.GetExportedTypes 要求所有程序集都存在
【发布时间】:2011-03-16 14:46:34
【问题描述】:

我想使用反射分析程序集。

具体来说,我想知道某个接口是否在程序集中的某个类型中实现。

但并非所有程序集的引用都存在于机器上,这就是我需要分析它们的原因。

所以当我调用GetTypesGetExportedTypes 时,会抛出FileNotFoundException,告诉我“无法加载引用的程序集”。

这是真的,但仍然我想知道这个程序集中实现了哪些类型

Reflector 可以以某种方式做到这一点。如何做到这一点?

编辑:我刚刚发现了Mono.Cecil,它以一种简单的方式完全符合我的要求。但是,它是一个外部库,没有内置解决方案。

【问题讨论】:

    标签: c# .net reflection assemblies


    【解决方案1】:

    CCI 对于您想要的东西可能有点重量级,但它可以反映程序集而无需全部加载:http://cciast.codeplex.com/

    【讨论】:

    • 感谢您的链接。我仍然希望有人知道标准的.net 方式而不使用外部程序集。否则我可能会回到这个图书馆。
    • CCI 和 Mono.Cecil 是当前的“标准”方式,因为许多商业或开源项目(NDepend、Sandcastle)都建立在它们之上。反射是迄今为止最不愉快的方式,所以我认为它不会成为“标准”。
    【解决方案2】:

    我遇到了同样的问题并想通了:
    使用Assembly.LoadFrom() 而不是Assembly.LoadFile()

    至少对我有用! :-)

    Assembly asm;
    Type[] types;
    
    asm = Assembly.LoadFile(@"C:\path\assembly.dll");
    types = asm.GetTypes() // throws FileNotFoundException.
    
    asm = Assembly.LoadFrom(@"C:\path\assembly.dll");
    types = asm.GetTypes() // Works!
    

    Assembly.GetExportedTypes() 的行为也与上述相同。

    【讨论】:

    • 这如何解决原问题中的问题?
    • 抱歉,我不是很清楚。使用 Assembly.LoadFrom() 将允许您获取程序集的类型,即使它的引用/依赖项丢失。
    【解决方案3】:

    我需要做同样的事情,经过几个小时的搜索,我找到了this

    您需要的代码在线程的底部。它不会让您一路走好,但它至少可以让您获得程序集中所有类型的列表,即使没有所有依赖项。

    编辑:这是引用链接中使用的代码 sn-p:

    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    
    private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(args.Name), AssemblyBuilderAccess.Run);
        _dumbAssemblies.Add(args.Name, ab);
    
        return ab;
    }
    
    private Dictionary<string, AssemblyBuilder> _dumbAssemblies;
    

    它的作用是为每个缺少的程序集创建哑程序集,这样可以避免抛出 FileNotFoundException

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 2014-04-11
      • 2020-08-24
      • 1970-01-01
      • 2023-04-04
      • 2017-11-04
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多