在ReflectionOnlyLoad期间忽略缺少的依赖项

时间:2009-08-27 06:52:13

标签: c# .net reflection assemblies clr

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

因为我只需要方法名而不是它的完整原型,有没有办法通过调用Assembly.ReflectionOnlyLoadFrom时引发的FileNotFoundException?我目前正在处理AppDomain.ReflectionOnlyAssemblyResolve但是如果我返回null,那么我得到一个FileLoadException并带有以下消息:

  

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

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

3 个答案:

答案 0 :(得分:3)

如果您要使用程序集进行非平凡的工作,我会尝试Cecil。还有MS CCI。 (我不是百分之百确定其中任何一个都缺少了一些,但它们肯定是这个领域的好工具,如果它们没有我会感到惊讶)

如果你真的需要使用金属,你就无法击败这个Asmex tutorial and sample,这应该是无效的,或者让你解决它。

答案 1 :(得分:3)

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

        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);
        }

答案 2 :(得分:1)

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

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