【问题标题】:Ignore missing dependencies during ReflectionOnlyLoad在 ReflectionOnlyLoad 期间忽略缺少的依赖项
【发布时间】:2010-11-23 06:45:41
【问题描述】:

我正在开发一个简单的类浏览器对话框,它允许用户打开程序集并从其中选择一个静态方法。但是,在某些情况下,程序集的依赖项会丢失。

由于我只需要方法名而不需要它的完整原型,有没有办法克服调用Assembly.ReflectionOnlyLoadFrom 时引发的 FileNotFoundException?我目前正在处理 AppDomain.ReflectionOnlyAssemblyResolve 但如果我返回 null 然后我会收到带有以下消息的 FileLoadException:

无法解析对程序集“...”的依赖,因为它尚未预加载。使用 ReflectionOnly API 时,必须通过 ReflectionOnlyAssemblyResolve 事件预加载或按需加载依赖程序集。

我知道这一定是可能的,因为.NET Reflector 允许您跳过未解决的依赖项。但是,我开始认为 Reflector 可能会手动解析程序集,而不是将其加载到 CLR 中并使用标准反射。也许它使用了 Mono 项目中的 Cecil 之类的东西。

【问题讨论】:

  • 我怀疑 Reflector 使用了 Cecil - 它早于它,并且来自 MS。我也怀疑它使用 CCI。 Methinks Lutz 只是一个上帝,他会把所有的东西都卷进去就是睡觉(即使他最后还是累了!)

标签: c# .net reflection assemblies clr


【解决方案1】:

如果您要对程序集进行重要的工作,我会尝试Cecil。还有MS CCI。 (我不能 100% 肯定这些都可以在缺少位的情况下工作,但它们肯定是这个领域的好工具,如果它们没有,我会感到惊讶)

如果你真的需要接触金属,你不能打败这个Asmex tutorial and sample,它肯定可以工作或让你解决它。

【讨论】:

  • 那个 Asmex 教程看起来很有趣,我得试试看。
【解决方案2】:

这将忽略您缺少的依赖项:

        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
            Assembly assembly = Assembly.ReflectionOnlyLoad("foo");
            foreach (Type t in assembly.GetTypes())
            {
                Console.WriteLine(t.FullName);
            }
        }

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

【讨论】:

  • 这对我不起作用。它仍然会搜索丢失的依赖项。
【解决方案3】:

我相信 Reflector 会进行自己的程序集解析/加载 - 我不久前查看了它的源代码(通过使用 Reflector 本身 :p)并看到了大量与程序集相关的类,这些类似乎被解析成一个庞大的树形结构。

您可以随时向 Red Gate/Rutz Loeder 发送电子邮件,并要求他们进行最终确认。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 2015-04-18
    • 2020-03-24
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多